WordPress Popular Postsの人気記事の結果を取得して任意のHTMLの形で出力する方法

2017/09/04
  • WordPress
WordPress Popular Postsの人気記事の結果を取得して任意のHTMLの形で出力する方法

トータルの人気記事を表示する場合は、特にプラグインを使用しなくても割と簡単に作れたりするのですが、一定期間内での人気記事を表示する場合はプラグインを使用すると簡単です。
有名なプラグインで言うと「WordPress Popular Posts」がそのプラグインになると思うのですが、任意のHTMLの形で出力したい場合の仕組みまでは用意されていないので、自由度が高くありません。
そこで、今回は「WordPress Popular Posts」で保存しているデータを使って、任意のHTMLの形で出力する方法をご紹介したいと思います。

設定方法

事前に「WordPress Popular Posts」はインストールして有効にしておいてください。
その後に以下記述をfunction.phpに記述してください。

function.php

// 人気記事を出力する関数
function popularposts_query_posts() {

  global $wpdb;

  // 表示上限件数を設定
  $limit = "LIMIT 5";
  // 集計期間を設定
  $interval = "1 WEEK";
  // 一日単位:$interval = "1 DAY";
  // 一週間単位:$interval = "1 WEEK";
  // 一ヵ月単位:$interval = "1 MONTH";

  $prefix = $wpdb->prefix . "popularposts";
  $fields = "p.ID AS 'id', p.post_title AS 'title', p.post_date AS 'date', p.post_author AS 'uid', SUM(v.pageviews) AS 'avg_views'";
  $now = current_time('mysql');
  $from = "{$prefix}summary v LEFT JOIN {$wpdb->posts} p ON v.postid = p.ID";
  $where .= "WHERE p.post_type = 'post' AND v.last_viewed > DATE_SUB('{$now}', INTERVAL {$interval})  AND p.post_password = '' AND p.post_status = 'publish'";
  $groupby = "GROUP BY v.postid";
  $orderby = "ORDER BY avg_views DESC";
  $query = "SELECT {$fields} FROM {$from} {$where} {$groupby} {$orderby} {$limit};";

  $result = $wpdb->get_results($query);

  return $result;
}

表示上限数や集計期間を変更したい場合は上記変数の部分の値を変更してください。

表示したい箇所

以下は例ですが、出力したい部分で先ほど「function.php」に記述した「popularposts_query_posts()」を呼び出して、任意の形でデータを設定してください。
これで、任にの形のHTMLにデータを設定することができます。

<div class="inner-content">
  <?php
  // 人気記事情報を取得
  $rankList = popularposts_query_posts(); ?>
  <ul class="list">
  <?php foreach ($rankList as $value) { ?>
    <li class="list__item">
      <a href="" class="list__link">
        <div class="box box__side-rank">
          <ul class="cat">
            <?php 
              $categories = get_the_category($value->id);
              foreach ($categories as $category) { ?>
                <li class="cat__item"><?php echo $category->cat_name; ?></li>
            <?php } ?>
          </ul>
          <p class="box__title"><?php echo $value->title; ?></p>
          <div class="sub-info">
            <span class="sub-info__item">閲覧数:<?php echo ceil($value->avg_views); ?></span>
          </div>
        </div>
      </a>
    </li>
  <?php } ?>
  </ul>
</div>