Google AnalyticsからWordPress Popular PostsにPV数を移転する

背景

人気記事がわかるプラグイン「WordPress Popular Posts」を導入した。
このプラグインは導入時からのアクセス数を計測して人気記事を表示するため
プラグイン導入前の記事のPV数は適用されない。

もともとGoogle Analyticsを使っているので、その値を利用した時のメモ。

方法

GAからダウンロード

最大表示行数500件を超えるデータをGoogleアナリティクスで一気に表示する方法[第30回] | Googleアナリティクスとは/衣袋教授のGoogleアナリティクス入門講座
デフォルトの最大表示行数である500行を超えるデータを、一度に表示したりダウンロードしたりできる

Google Analyticsから、欲しいデータをCSVでダウンロードします。

私はランキング上位のものを1000件ダウンロードしました。

ダウンロード方法の解説サイトには、Excelで使うならTSV形式で、と記述してあるところもありますが、
今回はcsv。

PHPで読み込んでDBに挿入

出力したCSVにページごとのアクセス数が入っているので、
それをいい感じに、データベースのWordPress Popular Postsのテーブルに挿入。

下記のコードを書いたPHPファイルをサーバーの適当なところに置いて、
そのURLにアクセスします。

<?php
define('DSN', 'mysql:dbname=<DBの名前>;host=<DBのホスト名>;');
define('USER', '<ユーザー名>');
define('PASSWORD', '<パスワード>');

$dbh = new PDO(DSN, USER, PASSWORD,
            [PDO::ATTR_PERSISTENT => true,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);

// ==========
// IDとURLの関連を取得
// ==========
$sql = "SELECT ID, `post_name` FROM `wp_posts`";

$stmt = $dbh->prepare($sql);
$stmt->execute();
$idlist = $stmt->fetchAll();
$idlist = array_column ($idlist, "ID", "post_name");

// ==========
// GAからインポートした情報を取り込み
// ==========
$file = new SplFileObject("<CSVファイル名>.csv");
$file->setFlags(SplFileObject::READ_CSV);
foreach ($file as $line) {
    // [CSV読み込み]空行、コメントアウトを除く
    if(!is_null($line[0]) & substr(trim($line[0]), 0, 1) != "#"){
        // [データ]tagページ・categoryページ・プレビューとかをざっくり除く
        if(strpos($line[0],"&preview=true") !== false)
            continue;
        if(strpos($line[0],"/tag/") === 0)
            continue;
        if(strpos($line[0],"/category/") === 0)
            continue;
        if(strpos($line[0],"/search?") === 0)
            continue;
        if(strpos($line[0],"20") === 0)
            continue;
        if(strpos($line[0],"/?") === 0)
            continue;

        // page_nameを取り出す
        $records[preg_replace("/^\d{8}-/", "", basename($line[0]))] = $line[1];
    }
}
print "<pre>";
var_dump($records);
var_dump($idlist);


// ==========
// IDと関連付け
// ==========
foreach ($idlist as $pagename => $id) {
    if(isset($records[$pagename]))
        $result[$id] =  str_replace(',','',$records[$pagename]);
}

var_dump($result);
print "</pre>";


// ==========
// DBに挿入
// ==========

$sql = "INSERT INTO wp_popularpostsdata (postid, day, last_viewed, pageviews) VALUES ";
foreach ($result as $id => $value) {
    $sql .= "({$id}, '<適当に今日以前の日付> 01:00:00', '<適当に今日以前の日付> 01:00:00', {$value}),";
}
// 最後のカンマ削除
$sql = substr($sql, 0, -1);
var_dump($sql);
$stmt = $dbh->prepare($sql);
$stmt->execute();

注意事項

たぶん、挿入できる行数に限りがあります。
(上記のコードのINSERTの部分に// 1000件までしか挿入できないとコメントがあったけど、なんでだか忘れた笑)

どうせ、ランキング上位のページを表示する目的だし、、上位100件くらいのデータを転記できれば充分でしょう

結局

WordPress Popular Postはページアクセスがあるごとにスプリクトを走らせるため遅いと聞いたので、
Simple GA Rankingというプラグインに乗り換えました。笑