プラグインなしでwordpressで記事のPV数を取得する方法
インハウスでサイトのコーディング担当をしているのですが、サポートチームから wordpress の改修依頼がありました。サポートチームではお客様の悩みを解決する Q&A の記事をまとめた wordpress のサイトを運営しています。この wordpress のサイトで、検索ボックスで記事を検索したときの一覧を、ページの PV 順に並びなおしてほしいという依頼です。
wordpress では PV 数を保持する仕組みがない
wordpress では記事の PV 数を保持してくれません。調べたところ下記の 3 つの方法があるようです。
- プラグインで対応する
- pv 数を保持する仕組みを自力で作る
- GA4 から API 連携で値を引っ張ってくる
pv 数を保持する仕組みを自力で作る方法を選びました
プラグインでやるのが一番手っ取り早いと思ったので、最初にプラグインの導入を検討してみました。どうやら Wp-PostViews というプラグインを見つけました。
ただ調べると開発終了したプラグインで、使うと警告が出てしまうらしいです。他によさそうなプラグインが見つからなかったので、他の方法を検討することにしました。
API 連携は手間がかかりそうと思い、pv 数を保持する仕組みを自力で作ることにしました。
function.php に pv 保持の仕組みを設置する
下記が wordpress に pv を保持するためのコードになります。
// ===============================
// PV数をカウントして保存する関数
// ===============================
function set_post_views($postID)
{
$count_key = 'post_views_count';
$count = get_post_meta($postID, $count_key, true);
if ($count == '') {
$count = 0;
delete_post_meta($postID, $count_key);
add_post_meta($postID, $count_key, '1');
} else {
$count++;
update_post_meta($postID, $count_key, $count);
}
}
// ===============================
// PV数を取得する関数(テンプレートなどで表示用)
// ===============================
function get_post_views($postID)
{
$count_key = 'post_views_count';
$count = get_post_meta($postID, $count_key, true);
if ($count == '') {
delete_post_meta($postID, $count_key);
add_post_meta($postID, $count_key, '0');
return "0";
}
return $count;
}
// ===============================
// 投稿を表示したときに PV数をカウントする処理
// ===============================
function track_post_views($post_id)
{
if (!is_single()) return; // 単一記事ページでのみ実行
if (empty($post_id)) {
global $post;
$post_id = $post->ID;
}
set_post_views($post_id);
}
add_action('wp_head', 'track_post_views');
// ===============================
// 管理画面の投稿一覧に PV数カラムを追加
// ===============================
function add_views_column($columns)
{
$columns['post_views'] = 'PV数';
return $columns;
}
add_filter('manage_posts_columns', 'add_views_column');
// ===============================
// 管理画面の PV数カラムに値を表示
// ===============================
function show_views_column($column_name, $post_id)
{
if ($column_name === 'post_views') {
echo get_post_views($post_id);
}
}
add_action('manage_posts_custom_column', 'show_views_column', 10, 2);
管理画面を見ると下記のように PV 数が表示されているのが分かります。
検索結果を PV 数の多い順に並べる
PV 数をとれるようになったので、今回の要件に合わせて検索ページに表示される一覧を PV 数が多い順に並べる実装も行いました。それが下記のコードになります。
// ===============================
// 検索結果をPV数の多い順に並べ替える
// ===============================
function sort_search_by_views($query)
{
// 管理画面ではなく、メインクエリ、かつ検索ページのみ実行
if (!is_admin() && $query->is_main_query() && $query->is_search()) {
$query->set('meta_key', 'post_views_count'); // PV数のキー
$query->set('orderby', 'meta_value_num'); // 数値としてソート
$query->set('order', 'DESC'); // 降順(PV多い順)
}
}
add_action('pre_get_posts', 'sort_search_by_views');