[WordPress]プラグイン無しで記事のアクセス数をカウントする関数と、アクセスランキングの表示を行うスニペット

  • 更新日:
  • 公開日:

記事のアクセス数をプラグイン無しでカウントする方法について。

今回は海外のこちらの記事を参考にしました。モロパクリじゃアレなので、集計したアクセス数の順番で「アクセスランキング一覧(人気記事一覧)」を表示するコードも作ってみます。

アクセス数をカウントする関数

参考にしたスニペットは、記事ごとのカスタムフィールドの値を操作する関数を使ってアクセス数をカウントしています。まず、functions.phpにこちらのコードを加えましょう。

//アクセス数の取得
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 views";
    }

    return $count . '';
}

//アクセス数の保存
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, '0' );
    } else {
        $count ++;
        update_post_meta( $postID, $count_key, $count );
    }
}

最初にアクセスしたときは勿論「0(ゼロ)」なのですが、そのときに表示する文字は 9行目の「return “0 views”;」という部分になります。ので、変更したい場合はここの「”0 views”」を修正しましょう。

そして次に、アクセス数を表示したい位置で関数を使います(記事や固定ページでしか使えません)。自分がログインしている場合にカウントして欲しくない場合はis_user_logged_in()を使ってカウントを回避します。

アクセス数: <?php echo get_post_views( get_the_ID() ); set_post_views( get_the_ID() ); ?>

<!-- ログインしている場合にカウントしないならこちら -->
アクセス数: <?php echo get_post_views( get_the_ID() ); ?> <?php if( !is_user_logged_in() ) { set_post_views( get_the_ID() ); } ?>

これでアクセス数の表示、集計ができます。

アクセススランキングの表示

そして、上記のアクセス集計を使ってアクセスランキングを表示してみます。以下のソースコードをサイドバーなどに貼り付けて使います。投稿記事をアクセス数の順番で5記事表示するソースコードです。

<h3>アクセスランキング</h3>
<?php
$args = array(
    'post_type'     => 'post',  //投稿タイプ
    'numberposts'   => 5,       //表示数
    'meta_key'      => 'post_views_count',
    'orderby'       => 'meta_value_num',
    'order'         => 'DESC',
);
$posts = get_posts( $args );
if($posts) : ?>
    <ul>
    <?php foreach( $posts as $post ) : setup_postdata( $post ); ?>
        <li>
         <a href="<?php the_permalink(); ?>"><?php the_post_thumbnail( 'thumbnail' ); ?></a>
         <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
        </li>
    <?php endforeach; ?>
    <?php wp_reset_postdata(); ?>
    </ul>
<?php else : ?>
    <p>アクセスランキングはまだ集計されていません。</p>
<?php endif; ?>

もしカスタム投稿タイプで使いたい場合は4行目を修正、表示数を変更したい場合は5行目の数字を変更して使います。

参考記事:

複数のカスタムフィールドでソート – SEEDS Creator’s Blog

is_user_logged_in:WordPress私的マニュアル

2014年09月13日追記:

すみません。「orderby」の指定を「’meta_value’」ではなく「’meta_value_num’」にしなければ正しい順番になりませんでした。上のソースコードでは7行目の部分を修正してあります。

2014年09月28日追記:

なんだかアクセス数が異様に伸びてしまうのですが、多分これは検索エンジンなどのBOTが原因かもしれません。これでは信用出来ない数字になるので、検索エンジンは除外するコードを追加してみます。

【PHP】アクセスがBOTかどうか判断する』にあるisBot()のソースコードをfunctions.phpに記述します。これはアクセスがBOTかどうかを判定する関数です。これを判定処理に追加します。

アクセス数: <?php echo get_post_views( get_the_ID() ); if( !isBot() ) { set_post_views( get_the_ID() ); } ?>

<!-- ログインしている場合にカウントしないならこちら -->
アクセス数: <?php echo get_post_views( get_the_ID() ); ?> <?php if( !is_user_logged_in() && !isBot() ) { set_post_views( get_the_ID() ); } ?>

これでBOTのアクセスを除外できるでしょう。


人気記事の定義は「コメントの数順」や「ソーシャルでのシェア数順」などがあるのでとりあえずアクセスランキングという名前にしてみました。他には「よく読まれている記事」も良いと思います。

書いた人

Symbol Mark

Ryoichi(しつ)

除菌ティッシュを買い込んで使いきれずによく乾かす人。

療養目的で退職し、どうやって生きていくか模索中。最近は勉強目的でLaravelやVue.js弄ったり、趣味で音で遊んでます。

※2019年10月16日現在ブログリニューアル中です。崩れなどが発生していたらすみません。

うぇぶ: @s_ryone