WordPressで人気記事を表示する方法詳細解説【カスタマイズ・プラグインなし】

キービジュアル

目次

こんにちは、オトナ帝国です。

今回は、最新記事の表示関連記事の表示に続いて、人気記事を表示する方法についてまとめていきたいと思います!

あれですね、よくyoutubeとかでも再生数ランキングがあると思うのですが、あれのWordpress記事版です。

もちろん、プラグインでもいいのですが、こちらのページでも記載したようにプラグイン重いのでなるべく使いたくない、というところです。

念のため、single.phpの/* 今回の話追加エリアstart */ と/* 今回の話追加エリアend */の間に記載していくことになります。

//phpファイル
<?php if (have_posts()) : ?>
<?php while ( have_posts() ) : the_post(); ?>
    <?php
        $image = get_the_post_thumbnail_url();
        $title = get_the_title();
        $content = get_the_content();
    ?>
	<h1><?php echo($title); ?></h1>
	<?php if (has_post_thumbnail()) : ?>
	<p><img src="<?php echo($kv);?>" alt="キービジュアル"></p>
	<?php endif; ?>
	<div><?php echo($contentValue) ; ?></div>
<?php endwhile; endif; ?>
/* 今回の話追加エリアstart */
/* 今回の話追加エリアend */

対応基本方針

まずは、①アクセス数を取得する箱(カスタムフィールド)を用意する②アクセス数のカウントを行う関数定義③関数の発動タイミング制御④いつものwp_query()関数で表示条件を設定⑤表示するという方針になります。

アクセス数を取得するカスタムフィールドの設定とカウントの設定

こういうのはだいたいfunction.phpでの設定になります。

//phpファイル
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);
	}
}

何をしているかというと、function set_post_views($postID)というものを定義しています。

その具体的な内容を説明していきます。

//phpファイル
$count_key = 'post_views_count';

これによってカスタムフィールドの設定項目が決まっています。下記のスクショのようにですね。(入力画面に見えますが、デフォルトで入っている小目になります)

Wordpressカスタムフィールド画面
//phpファイル
$count = get_post_meta($postID, $count_key, true);

get_post_meta()関数は引数に投稿ID,取得したい値のキー名の文字列,オプションになります。オプションはtrueであれば文字列を、trueじゃない場合配列を返します。今回はview数のカウントを文字列としてカウントするだけなので、今回はtrueになります。そしてその値を$countに格納します。

//phpファイル
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);
}

$countが空ならば、0としてカスタムフィールドを作るし、そうでなければ足し算してカウントアップしていくという関数になっています。

カウントのタイミングの制御

さて、function set_post_views($postID)でカウントの制御ができるようになりました。あとはどこで発火するか、という話になります。当たり前ですが、該当の投稿ページにアクセスしたとき=投稿ページを読み込んだ時=single.phpが読み込まれたときになるので、single.phpを編集していきます。

//phpファイル
<?php
// 記事のビュー数を更新(ログイン中・ロボットによる閲覧時は除く)
    if (!is_user_logged_in() && !is_robots()) {
        setPostViews(get_the_ID());
    }
?>

これによってカウントが始まりますが、is_user_logged_in()はアクセスしてきたユーザーがWordpressログイン済みかどうかの判定・is_robots()はrobots.txt(いわゆるgoogleクローリング系)かどうかの判定を行います。

ここ地味に難しいのですが、notAかつnotBはAまたはB以外ということにありますね。

Not(A) AND Not(B) = Not (A OR B)
ド・モルガンの法則

つまりログイン済みまたはrobots.txtである状態以外という意味になります。

//phpファイル
if (!is_user_logged_in() && !is_robots()) {}

そしてその状態で

//phpファイル
setPostViews(get_the_ID());

先ほど定義した関数を発動するということになります。

WP_Query関数による表示制御の実施

//phpファイル
<!--人気の記事一覧start-->
	<h2>人気記事</h2>
	<?php
        $args = array(
          'post_type' => 'test', // カスタム投稿タイプを指定
          'post_status' => 'publish', // 公開済の投稿を指定
          'posts_per_page' => 3, // 投稿件数の指定
          'post__not_in' => array($post->ID), // 現在表示している投稿を除外
          'meta_key' => 'post_views_count',//投稿数をカウントするカスタムフィールド名
          'orderby' => 'meta_value_num',
          'order' => 'DESC',
        );
        $the_query = new WP_Query($args);
    	?>
	<?php if ($the_query->have_posts()) : ?>
	<?php while ($the_query->have_posts()): $the_query->the_post(); ?>
	<?php
        $link = get_the_permalink();
        $image = get_the_post_thumbnail_url();
        $time = get_the_time('Y.m.d');
        $title = get_the_title();
	?>
<!--好きな表示をしていきます-->
	<?php endwhile; ?>
	</ul>
	<?php wp_reset_postdata(); ?>
	<?php endif; ?>
<!--人気の記事一覧end-->

ここも後半はほとんど同じです。前半でほとんど終わるんです。

//phpファイル
<?php
        $args = array(
          'post_type' => 'test', // カスタム投稿タイプを指定
          'post_status' => 'publish', // 公開済の投稿を指定
          'posts_per_page' => 3, // 投稿件数の指定
          'post__not_in' => array($post->ID), // 現在表示している投稿を除外
          'meta_key' => 'post_views_count',//投稿数をカウントするカスタムフィールド名
          'orderby' => 'meta_value_num',//ソートを数字として実施
          'order' => 'DESC',//降順で並べ替え
        );
        $the_query = new WP_Query($args);
?>

post_typeはカスタム投稿の時に使うのですが、今回の特化でいうと、post_views_countをベースにソートを行い、降順で並べ替えた最初の3つを取得している状態です。ちなみに昇順の場合DESCでなくASCになります。

これでwp_query()で格納していき、いつもif/whileループで回していくことになります。

//phpファイル
<?php if ($the_query->have_posts()) : ?>
<?php while ($the_query->have_posts()): $the_query->the_post(); ?>
ここがループの中身になります
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php endif; ?>

そしてここでリセットすることは毎度おなじみですね

//phpファイル
<?php wp_reset_postdata(); ?>

最後に

ということで、今回は人気順表示の制御を行いました。いつもの関連・最新などと異なり、functiopn.phpまでいじることになるので、大変ですよね。

何かの参考になればと思います。

それでは~★


オトナ帝国では、昔のゲームなどの懐かしい体験ができる秘密基地を運営中。
浅草葦拠点では現在セールを実施しています。お部屋の詳細だけでも見てください~

詳細を見る


関連記事

人気記事

最新記事

カテゴリーから記事を探す