見出し画像

【備忘録】WordPressで“投稿一覧”に簡単なページビュー数を表示する方法

ページビュー数やアクセス数の確認などは「Google Analytics」などを利用されている方が多いと思います。それでも手軽にピンポイントでビュー数を確認できると楽かなーと思い作成してみました。
サイト作成者や管理者じゃない方は、これで十分なのかなと思います。

「投稿一覧」にページビュー数を追加

ステップ 1: アクセス数を日付ごとに記録

functions.phpに以下のようなコードを追加して、日付ごとに閲覧数を記録する機能を実装します。

// 閲覧数を日付ごとに記録する
function track_post_views_per_day($post_id) {
    if (!is_single()) return;
    if (empty($post_id)) {
        global $post;
        $post_id = $post->ID;    
    }
    $today = date('Y-m-d');
    $views = get_post_meta($post_id, 'views_' . $today, true);
    $views = ($views) ? $views + 1 : 1;
    update_post_meta($post_id, 'views_' . $today, $views);
}
add_action('wp_head', 'track_post_views_per_day');

ステップ 2: 閲覧数を集計

次に、日別のデータを週別、月別に集計する関数を追加します。

// 閲覧数を集計する
function get_views_summary($post_id, $period = 'daily') {
    $start_date = date('Y-m-d');
    $end_date = date('Y-m-d');

    switch ($period) {
        case 'weekly':
            $start_date = date('Y-m-d', strtotime('-1 week'));
            break;
        case 'monthly':
            $start_date = date('Y-m-d', strtotime('-1 month'));
            break;
    }

    $date_range = new DatePeriod(
        new DateTime($start_date),
        new DateInterval('P1D'),
        new DateTime($end_date)
    );

    $total_views = 0;
    foreach ($date_range as $date) {
        $views = get_post_meta($post_id, 'views_' . $date->format('Y-m-d'), true);
        $total_views += ($views) ? $views : 0;
    }
    return $total_views;
}

ステップ 3: 管理画面で閲覧数を表示

最後に、投稿管理画面に日別、週別、月別の閲覧数を表示するように設定します。

// 管理画面の投稿一覧に閲覧数のカラムを追加
function add_views_summary_column($columns) {
    $columns['views_summary'] = 'Views Summary';
    return $columns;
}
add_filter('manage_posts_columns', 'add_views_summary_column');

// カラムの内容を表示する
function display_views_summary_column($column_name, $post_id) {
    if ($column_name == 'views_summary') {
        $daily_views = get_views_summary($post_id, 'daily');
        $weekly_views = get_views_summary($post_id, 'weekly');
        $monthly_views = get_views_summary($post_id, 'monthly');
        echo "Daily: $daily_views<br>Weekly: $weekly_views<br>Monthly: $monthly_views";
    }
}
add_action('manage_posts_custom_column', 'display_views_summary_column', 10, 2);

注意点

  • このコードは基本的なロジックを示しており、実際に使用する場合はさらに詳細なエラーハンドリングや最適化が必要です。

  • 日別データはメタデータが多くなるため、データベースのパフォーマンスに影響を与える可能性があります。定期的に古いデータをクリーンアップすることをお勧めします。

  • キャッシュの問題も考慮する必要があります。特に動的に変更されるデータについては、キャッシュプラグインの設定を適切に管理する必要があります。


●コピペ用

WordPressのfunctions.phpファイルに追加するための完全なコードを以下にまとめました。このコードは投稿の閲覧数を日別、週別、月別で集計し、投稿一覧ページに「Views Summary」という一つのカラムで表示します。

// 閲覧数を日付ごとに記録する
function track_post_views_per_day($post_id) {
    if (!is_single()) return;
    if (empty($post_id)) {
        global $post;
        $post_id = $post->ID;    
    }
    $today = date('Y-m-d');
    $views = get_post_meta($post_id, 'views_' . $today, true);
    $views = ($views) ? $views + 1 : 1;
    update_post_meta($post_id, 'views_' . $today, $views);
}
add_action('wp_head', 'track_post_views_per_day');

// 閲覧数を集計する
function get_views_summary($post_id, $period = 'daily') {
    $start_date = date('Y-m-d');
    $end_date = date('Y-m-d');

    switch ($period) {
        case 'weekly':
            $start_date = date('Y-m-d', strtotime('-1 week'));
            break;
        case 'monthly':
            $start_date = date('Y-m-d', strtotime('-1 month'));
            break;
    }

    $date_range = new DatePeriod(
        new DateTime($start_date),
        new DateInterval('P1D'),
        new DateTime($end_date)
    );

    $total_views = 0;
    foreach ($date_range as $date) {
        $views = get_post_meta($post_id, 'views_' . $date->format('Y-m-d'), true);
        $total_views += ($views) ? $views : 0;
    }
    return $total_views;
}

// 管理画面の投稿一覧に閲覧数のカラムを追加
function add_views_summary_column($columns) {
    $columns['views_summary'] = 'Views Summary';
    return $columns;
}
add_filter('manage_posts_columns', 'add_views_summary_column');

// カラムの内容を表示する
function display_views_summary_column($column_name, $post_id) {
    if ($column_name == 'views_summary') {
        $daily_views = get_views_summary($post_id, 'daily');
        $weekly_views = get_views_summary($post_id, 'weekly');
        $monthly_views = get_views_summary($post_id, 'monthly');
        echo "Daily: $daily_views<br>Weekly: $weekly_views<br>Monthly: $monthly_views";
    }
}
add_action('manage_posts_custom_column', 'display_views_summary_column', 10, 2);


おまけ

管理者としてログインしている場合は、ビュー数として数えないようにする方法

閲覧数カウント関数を修正する

functions.phpに追加した閲覧数をカウントする関数を、ログインしているユーザーを除外するように修正します。以下はそのためのコード例です:

function track_post_views_per_day($post_id) {
    if (!is_single()) return; // 単一の投稿ページ以外では何もしない
    if (is_user_logged_in()) return; // ログインしている場合は何もしない

    if (empty($post_id)) {
        global $post;
        $post_id = $post->ID;    
    }
    $today = date('Y-m-d');
    $views = get_post_meta($post_id, 'views_' . $today, true);
    $views = ($views) ? $views + 1 : 1;
    update_post_meta($post_id, 'views_' . $today, $views);
}
add_action('wp_head', 'track_post_views_per_day');

このコードの主な変更点は、is_user_logged_in() 関数を使用して、ユーザーがログインしているかどうかをチェックし、ログインしている場合はビュー数をカウントしないようにしている点です。これにより、ログインユーザーのページアクセスはビュー数に含まれなくなります。

注意点

  • この方法では、すべてのログインユーザーがカウントから除外されます。特定のユーザーロール(例えば、管理者や編集者のみ)を対象にしたい場合は、さらに条件を追加する必要があります。例えば、次のようにロールに基づいてチェックを行うことができます:

if (is_user_logged_in()) {
    $user = wp_get_current_user();
    if (in_array('administrator', (array) $user->roles)) {
        return; // 管理者の場合はカウントしない
    }
}
  • このコードの変更もfunctions.phpに追加するか、または専用のプラグインを作成してそこに追加します。これによりテーマが更新された際に変更が失われることを防ぐことができます。

この方法を用いることで、ログインしているユーザーのビュー数をカウントから除外し、より正確なページビュー数を確保することが可能です。

この記事が気に入ったらサポートをしてみませんか?