[WordPress]記事のアクセス数をカテゴリごとに集計しランキング表示する。 #WordPress #works *2018/4/6追記(注意)あり

  • スポンサーリンク

  • スポンサーリンク

WordPressにおいて記事のアクセス数をカテゴリごとに集計しランキング表示する。一部、プログラム記述を修正しました。2017/6/17
また、本ブログで「query_posts」を使用していますが、これは非推奨となっていますね。2015年の記事なのでご了承ください。2018/4/6「WP_Query」 または 「get_posts」を利用すれば同様の処理は可能かと思います。
https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/query_posts

category_ranking

概要

・WordPressで記事ごとのランキングはWordPress Popular Posts等のプラグインで簡単に実装できます。
・しかし、それをカテゴリ毎に集計し、どのカテゴリが良く観られているかのランキングを表示するプラグインは、なかなか見つけることが出来ませんでした。
・そこで、記事ごとのアクセス数をカウントする方法を、参考サイトを参照しつつ、それをカテゴリごとに集計する方法を考えてみましたので記載します。
・なお、手順詳細(1)(2)はほぼ参考サイトのコードがそのまま使用できます(有難うございます!)。詳細(3)のみ私のオリジナルです。
・但し、以下前提条件があります。

前提条件

・テーマファイルを直接編集します。※プラグイン化は勉強中です。
・アクセス数はこの作業を終えた時点から始まりますので、最初はアクセス数が全て0ということになります。
・カテゴリは最上位の(親の)カテゴリのみアクセス数をカウントしています。
・一つの記事に複数カテゴリが設定されている場合は、設定されている全カテゴリのアクセスが増えます。
・全ての最上位の(親の)カテゴリと各アクセス数、及び、ランキングが上位5番めまでのカテゴリの名称とアクセス数を表示します。
・表示は簡易的なものですので、適時、不要部分削除や、装飾等加える必要があります。

手順概要

(1)functions.phpに記事ごとのアクセス数を集計するための関数を実装します。
(2)single.php(個別ページ用テンプレート※テーマによっては異なるファイルかもしれません)内に、記事にアクセスがあった際に、アクセス数をインクリメント(+1)するための記述を実装します。
(3)カテゴリランキングを表示したい箇所(例;サイドバーであれば、PHPを記述出来るウィジェット内)にカテゴリごとの集計を行い、かつ、ソーティング表示するためのコードを実装します(本来は関数化し、functions.phpに記述すべき箇所もあるかと思います)

手順詳細(1)

◯functions.phpに記事ごとのアクセス数を集計するための関数を実装します。
・こちらのサイトを例にfunctions.phpに以下を追加します。
http://increment-log.com/wordpress-access-count/
・記事ごとに「post_views_count」というカスタムフィールドを設置し、最初のアクセスで「0」を設定します。このフィールドはアクセスあるまで空欄”のままになっています。
・投稿記事にアクセスがあったら、関数「set_post_views」で「post_views_count」の値に+1します。
・このカスタムフィールドの値を呼び出す時は関数「get_post_views」を呼び出します。
・運用開始後、全記事のアクセス数を「0」に設定し直す機能は実装しておりませんが、こちらの記事にあるカスタムフィールドの値を一括で同じ値に設定する方法を掲載しています。参考になるかと。
  WordPressにおいて全記事にカスタムフィールドを追加、もしくは、値の一括変更 #WordPress – capture works and music

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

手順詳細(2)

◯single.php(個別ページ用テンプレート※テーマによっては異なるファイルかもしれません)内に、記事にアクセスがあった際に、アクセス数をインクリメント(+1)するための記述を実装します。

・これも、こちらのサイトの内容をそのまま流用で構いません。
http://increment-log.com/wordpress-access-count/
・single.php内の任意の場所(アクセスがあった際に必ず実行される部分が良いです)に下記を追加します。
・個別投稿記事にアクセスされた時にカスタムフィールド「post_views_count」の値を+1しています。

アクセス数: <?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() ); } ?>

・但し、上記だと、個別投稿記事内に、アクセス数が表示されるため、不要であれば、下記を代わりに記述すれば良いと思います。

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

手順詳細(3)

◯カテゴリランキングを表示したい箇所(例;サイドバーであれば、PHPを記述出来るウィジェット内)にカテゴリごとの集計を行い、かつ、ソーティング表示するためのコードを実装します(本来は関数化し、functions.phpに記述すべき箇所もあるかと思います)

・以下、サイドバーに表示することを前提としています。
・PHPを記述できるウィジェットとしては、プラグイン「PHP Text Widget」(PHP Text Widget)等があります。このプラグインを導入した場合は通常のテキストウィジェット内にphpが記述できるようになります。こういうのもあるようです→PHP Code Widget — WordPress プラグイン
・外観→ウィジェットよりテキストウィジェットをサイドバーに追加します。
・テキストウィジェット内に以下コードを追加します。

<?php
	$count_key = 'post_views_count';
 
	//カテゴリ一覧を取得
	$args = array(
		'type' => 'post',
		'orderby' => 'name',
		'order' => 'ASC',
		'hide_empty' => 1,
		'hierarchical' => 1
	);
	$categories = get_categories( $args );
 
	//全カテゴリーループ
	$count_cat = array();
	foreach($categories as $category) {
 
		//親カテゴリがない(=最上位)カテゴリのみ処理
		if ($category->category_parent == 0) {
			echo ($category->name)." ";
 
			//処理するカテゴリ指定
			//query_posts("cat=".$category->term_id);
			
			query_posts( array ( 'cat' => $category->term_id, 'posts_per_page' => -1 , 'orderby'=>ID , 'order'=>ASC ) );
 
			//カテゴリ内投稿ループし、アクセス数を計算
			while ( have_posts() ) {
				the_post();
				$post_count = get_post_meta( get_the_ID(), $count_key, true ); //投稿のアクセス数を取得
				if ($post_count <> '') {
					$count_cat[$category->term_id]=$count_cat[$category->term_id] + $post_count; //投稿のアクセス数をインクリメント(+1)
				}
			}
			//カテゴリ内投稿ループし、アクセス数を計算(ここまで)
 
			//カテゴリのアクセス数を表示
			if ( $count_cat[$category->term_id] <> '' ) {
				echo $count_cat[$category->term_id]."<BR>";
			} else {
				echo "<BR>";
			}
			//カテゴリのアクセス数を表示(ここまで)
		}
		//親カテゴリがない(=最上位)カテゴリのみ処理(ここまで)
 
	}
	//全カテゴリーループ終了
 
	echo "<BR>ソートした結果を出力<BR>";
	//降順ソート
	arsort($count_cat,SORT_NUMERIC);
 
	//降順ソート結果を出力(5個出力の場合)
	$disp_count=5;
	$n=0;
	foreach ($count_cat as $catid => $val) {
		$thisCat = get_category( $catid );
		echo $thisCat->name.":";
		echo $val."<BR>";
		$n++;
		if ($n==5) {break;}
	}
	
	wp_reset_query();
 
?>

※上記コードを記述したテンプレートファイルを作成しておきそれを、ウィジェットから呼び出す方法などもあります。

<?php get_template_part('category','ranking'); 	//テンプレートファイルが「category-ranking.php」というファイル名の場合 ?>

※なお、当初公開時、上記の「query_posts( array ( ‘cat’ => $category->term_id, ‘posts_per_page’ => -1 , ‘orderby’=>ID , ‘order’=>ASC ) );」部分の「’posts_per_page’ => -1」の記載を忘れていたため、カウント対象が全てのページではなく、WordPressの「1ページに表示する最大投稿数」で設定した記事数分しかカウントできておりませんでした。大変申し訳ございません(2017/6/17)。

適用サイト・表示例

・私のサンプルサイト( http://sample.nakamurayuji.com/wp2#sidebar_ranking )の右サイドバー部分(PC表示の場合)に適用し、サイドバーに実際に表示された例を添付いたします。
category_ranking

参考サイト(有難うございます!)

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

最後に

・少し調べる限り、この機能を実装したプラグインを見つけることが出来なかったので勉強がてら実装してみました。
・今回、参考サイトを大いに活用させて頂いたのだけど(重ねて多謝!)、詳細(3)のようにオリジナルなコードも実装できたのでとても達成感を感じることが出来たよん〜
・そして、来るべき目標として、プラグインを作ってみたい、と思っております。
/////


  • スポンサーリンク

[WordPress]記事のアクセス数をカテゴリごとに集計しランキング表示する。 #WordPress #works *2018/4/6追記(注意)あり” への16件のフィードバック

  1. 今ユーザー別のページビューランキングを作ろうとしていますが、参考になるサイトがなくこちらの行きつきました。
    こちらの情報を参考にさせて頂いて、がんばってカスタマイズしてみましたが全然うまく表示されません。。
    表示したいのはユーザー名とアバター画像とビュー数です。
    どのようにしたらよいかご教授願えませんでしょうか?

      1. 返信が遅くなり申し訳ございません!!!
        まだちゃんと実装できてないのですが、先に感謝の気持ちをと思いまして。。
        プラグインもなく1ヶ月くらい試行錯誤しつつ、諦めかけていたので本当に感謝です。
        ありがとうございます!!

        1. 石野様

          まだ実装されていないとのことですが、お役に立つことができれば幸いです。
          うまく行くといいですね!!

          1. nakamurayuji 様
            本当にありがとうございます!!
            このたび無事に実装することが出来ました!
            ずっとやりたかった事だったので本当に感謝です。
            ありがとうございました。

  2. 以前お願いを聞いていただいた石野と申します。
    お時間がある時でかまいません。
    もう1つお願いがあります。
    先日作って頂いた投稿者別ランキングですが、
    カテゴリ毎のランキングも別で表示したいと思っています。
    その場合はどうしたらよいでしょうか?
    PHPが全然わからないため、何度も申し訳ございません。
    何卒よろしくお願いいたします。

  3. 当ページ拝見して、大変参考にになっております。
    「親カテゴリがない(=最上位)カテゴリのみ処理」とありますが、ここを「子カテゴリのみ処理」または「自分で選定したカテゴリのみ処理」にしたい場合は、どのようにしたらよろしいでしょうか。

    ご教授頂ければ大変ありがたいです。

    1. Saku様
      「親カテゴリがない(=最上位)カテゴリのみ処理」は「if ($category->category_parent == 0) {」の部分で実現しています。
      ご要望の「子カテゴリのみ」は「親カテゴリがある」と読み替えられると思いますので、
      「if ($category->category_parent != 0) {」
      と変更すれば処理できるのではないかと思います(実装実験はしていません)。
      ——-
      参考です→
      https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/get_categories

      https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/get_the_category

      ↑より
      category_parent
      (整数) 親カテゴリーの ID – 親がなければ 0 が入る

      ——-
      「自分で選定したカテゴリのみ処理」は
      「if ($category->category_parent == 0) {」
      の下に
      「echo ($category->name).” “;」
      というのがありますが、これはカテゴリ名を表示している箇所です。
      つまり、
      「if ($category->name == “所望のカテゴリ名”)」
      のような分岐をすればとりあえず、実現できるかと思います。
      こちらも実装実験は行っていませんが参考になれば幸いです。

  4. nakamurayuji様

    早速のお返事ありがとうございます。
    実装したところ、うまく反映できました!
    大変感謝しております。

    本当にありがとうございました!
    これからも貴サイト参考させていただきます。

  5. nakamurayuji様

    先ほどはありがとうございました。度々申し訳ありません。
    ランキングのカテゴリ名の前に「〇位」とか「No.☆」という順位表示はうまくできますでしょうか?
    お手数おかけし恐れ入りますが、お教え頂けると大変助かります。

    何卒よろしくお願い致します。

    1. echo ($n+1);
      を追加するだけで良いと思われます。
      次回よりお仕事としてご相談いただけたら嬉しいです。
      ———
      $disp_count=5;
      $n=0;
      foreach ($count_cat as $catid => $val) {
      echo ($n+1);
      $thisCat = get_category( $catid );
      echo $thisCat->name.”:”;
      echo $val.”
      “;
      $n++;
      if ($n==5) {break;}
      }

      1. nakamurayuji様

        早速のご回答ありがとうございました!大変助かりました。
        また機能的に何か追加要望が出てまいりましたら、ご相談させていただきたく思います。

  6. よかったです。ありがとうございます。何かございましたらぜひご相談くださいませ!

  7. 初めまして、カテゴリでのアクセスランキングを調べていたところこの記事にたどり着きました。

    導入にあたり、質問なのですが
    例えば一カ月単位でランキングさせたい場合、
    1日になった瞬間アクセス数を全てリセットする(もしくはそれ以外の方法)事は可能でしょうか?

    もし可能でしたら、その方法を教えて頂きたいです。

    お手数をお掛けしますが、宜しくお願い致します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA