WordPressでサイトやブログを運営している皆さんは、「どの記事がよく読まれているのか」「昨日の記事はどれくらいアクセスがあったか」気になりますよね。

Googleアナリティクスや専用のプラグイン(Site Kit by Googleなど)で確認する方法が一般的ですが、「いちいち別の画面を開いて確認するのが面倒……」と感じたことはありませんか?

「WordPressの『投稿一覧』画面に、そのままPV数が表示されていたら最高なのに!」

そう思い立った私は、生成AIの「Gemini」に相談してみました。その結果、すでに導入していた人気記事ランキング用プラグイン「WordPress Popular Posts」のデータを活用し、コピペだけで実装することに成功しました。

今回は、その作成過程と、実際に使えるコードを共有します。

作成ログ

完成までの作成時間:約10分
使用したツール WordPress Popular Postsプラグイン、Gemini(生成AI)
完成までのチャットでのやり取り回数:11回

Geminiに指示したプロンプト

ワードプレス管理画面と投稿一覧からページごとのアクセス数を表示する方法はない?
WP Popular Postsやアナリティクス入れてある

Geminiからの提案は下記の3つ

  • 方法1:【推奨】専用プラグイン「Post Views Counter」を使う方法
  • 方法2:すでに導入済みの「WordPress Popular Posts (WPP)」を使う方法
  • 方法3:Google Analyticsのデータを使う(Site Kit by Google)方法

Geminiからは3つの提案がありましたが、今回は「方法2:すでに導入済みの『WordPress Popular Posts (WPP)』を使う方法」を採用しました。新たなプラグインをインストールする必要がなく、サイトが重くなるのを防げるためです。

実装までの3ステップ方法

手順はとてもシンプルですが、重要なファイルを触るため慎重に行いましょう。

ステップ1:必ずバックアップを取る

これからfunctions.phpという重要なファイルを編集します。万が一画面が真っ白になっても復旧できるよう、必ずファイルのバックアップを取ってから作業してください。

ステップ2:プラグインの確認

「WordPress Popular Posts」が有効化されているか確認してください。まだの方はインストール・有効化をお願いします。

ステップ3:functions.phpにコードを追加

以下のコードをコピーして、使用しているテーマのfunctions.phpの適切な場所か一番末尾に追加してください。

完成版コード

/* -------------------------------------------------------
 * WPP閲覧数表示・並び替え設定(重複防止・全投稿タイプ対応)
 * ------------------------------------------------------- */

// 1. 自動ですべての公開投稿タイプを取得してフックを登録
function setup_wpp_admin_columns_final() {
    $args = array('public' => true);
    $post_types = get_post_types($args, 'names');
    if (isset($post_types['attachment'])) unset($post_types['attachment']);

    foreach ($post_types as $type) {
        // 既存のフックを可能な限り削除(念のため)
        remove_filter("manage_{$type}_posts_columns", 'add_views_columns_final');
        remove_action("manage_{$type}_posts_custom_column", 'show_views_custom_columns_final');

        // カラム追加
        if ($type === 'page') {
            add_filter('manage_pages_columns', 'add_views_columns_final');
            add_action('manage_pages_custom_column', 'show_views_custom_columns_final', 10, 2);
            add_filter('manage_edit-page_sortable_columns', 'make_views_column_sortable_final');
        } elseif ($type === 'post') {
            add_filter('manage_posts_columns', 'add_views_columns_final');
            add_action('manage_posts_custom_column', 'show_views_custom_columns_final', 10, 2);
            add_filter('manage_edit-post_sortable_columns', 'make_views_column_sortable_final');
        } else {
            add_filter("manage_{$type}_posts_columns", 'add_views_columns_final');
            add_action("manage_{$type}_posts_custom_column", 'show_views_custom_columns_final', 10, 2);
            add_filter("manage_edit-{$type}_sortable_columns", 'make_views_column_sortable_final');
        }
    }
}
add_action('admin_init', 'setup_wpp_admin_columns_final');


/* --- 共通処理 --- */

// カラム定義
function add_views_columns_final($columns) {
    if (!isset($columns['wpp_views_daily'])) {
        $columns['wpp_views_daily'] = '24時間'; 
        $columns['wpp_views_all']   = '全期間'; 
    }
    return $columns;
}

function show_views_custom_columns_final($column_name, $post_id) {
    static $printed_cache = [];
    
    $check_key = $post_id . '_' . $column_name;

    if (isset($printed_cache[$check_key])) {
        return; 
    }

    if (!function_exists('wpp_get_views')) {
        if ($column_name === 'wpp_views_all' || $column_name === 'wpp_views_daily') echo '-';
        return;
    }

    switch ($column_name) {
        case 'wpp_views_all':
            echo wpp_get_views($post_id, 'all', true); 
            $printed_cache[$check_key] = true;
            break;
        case 'wpp_views_daily':
            echo wpp_get_views($post_id, 'daily', true); 
            $printed_cache[$check_key] = true;
            break;
    }
}

// ソート列定義
function make_views_column_sortable_final($columns) {
    $columns['wpp_views_all'] = 'wpp_views_all'; 
    return $columns;
}

// スタイル
function custom_admin_views_styles_final() {
    echo '<style>
        .column-wpp_views_all { width: 90px; }
        .column-wpp_views_daily { width: 90px; font-weight: bold; color: #2271b1; }
    </style>';
}
add_action('admin_head', 'custom_admin_views_styles_final');

// ソート処理
function sort_views_column_query_final($query) {
    if (!is_admin() || !$query->is_main_query()) return;

    if ($query->get('orderby') === 'wpp_views_all') {
        global $wpdb;
        add_filter('posts_join', function($join) use ($wpdb) {
            if (strpos($join, $wpdb->prefix . 'popularpostsdata') === false) {
                $join .= " LEFT JOIN {$wpdb->prefix}popularpostsdata AS wpp ON {$wpdb->posts}.ID = wpp.postid ";
            }
            return $join;
        });
        add_filter('posts_orderby', function($orderby) use ($query) {
            $order = strtoupper($query->get('order'));
            if ($order !== 'ASC') $order = 'DESC';
            return " wpp.pageviews {$order}, {$orderby} ";
        });
    }
}
add_action('pre_get_posts', 'sort_views_column_query_final');

確認してみよう

WordPress_管理画面で記事ごとの閲覧数表示

管理画面の「投稿一覧」を見てみてください。 記事タイトルの横などに【24時間】【全期間】という項目が増えていれば成功です!

まとめ

生成AIを活用することで、プログラミングの専門知識がなくても、自分好みの管理画面にカスタマイズすることができました。

  • 専用画面を開く手間がなくなる
  • 記事ごとの反応がひと目で分かる
  • リライトすべき記事が見つけやすくなる

WordPressのサイト運営が少しだけ楽になるこのカスタマイズ、ぜひ試してみてくださいね。

関連記事
【コピペOK】WordPressのダッシュボードに記事数をカウントするカスタムウィジェットを生成AIで作成する方法

毎月のWordPress記事投稿数、まだ手動でカウントしていませんか? 面倒な集計作業は、生成AI (Gemini) を使って自動化しましょう。この記事では、ダッシュボードに「記事数カウンター」ウィジェットを自作する方法を、コピペで使えるPHPコード付きで解説します。