空飛ぶとんジニア

平凡なエンジニアが日々関心を持ったことや学んだこと、感じたことを吐き出すブログ。緊張すると涙がでるのが特徴です。

WordPressPopularPostsを使ったランキングをカスタマイズするもう1つの方法(ランキング記事のID一覧を取得)

こんにちは
最近Wordpressを使って修行をしていて、「あれ?どうやって取得するんだ???」と疑問に思ったのでランキング対象の記事IDを取ってくる方法をメモしようかなと思います。

IDだけ取得できれば、ゴリゴリにデザインを変更する場合やランキングの中に箸休めの記事を入れたりする際に使えたりすると思うのでそんな時に使ってみてください(あまり使う機会なさげだけど…)

まずプラグインのWordPressPopularPostsについて

WordPressPopularPostsとは

WordPressでメディアを運営していると、投稿に対するView数等を取得したくなると思う。
View数を取得できるようになれば、ランキングを表示したくなるのはメディア運営者の性だろう。
WordPressPopularPosts(以下Wpp)は主にその2つの機能を提供してくれるWP-Pluginである。

具体的な導入方法や使い方等は他の記事を参考してもらうとして、すでにプラグインが導入されてるとする。

記事IDだけ返す方法

Wppを導入していれば、テンプレートファイルに以下を入力していればランキングのマークアップが出力される。

まずは一般的な使い方

<?php
if(function_exists('wpp_get_mostpopular')) {
  $args = array (
    wpp_start => "",
    wpp_end => "",
    order_by => "views",
    range => "weekly",
    stats_comments => 0,
    stats_views => 1,
    limit => 50,
  );
  wpp_get_mostpopular($args);
}

これでview数基準で週次のランキングが簡単に出力される。
出力されるhtmlも無難な感じに仕上がっており、とても便利♪

出力されるhtmlをカスタマイズしたい!となった時にWppはフィルターフックという処理でカスタマイズする方法を提供してくれている。ただ正直ここが理解しにくいし、functions.phpでhtmlをゴリゴリ書くのは見にくいと思った。
ランキング記事のIDを配列で取得し、ループで回した方が見やすいなーと思ったのですが記事が見つからず。
最終的には以下の方法に行き着いた。

<?php
function my_custom_popular_posts_html_list($mostpopular, $instance){
  $output = '';
  foreach( $mostpopular as $popular ) {
    $output .= $popular->id . ',';
  }
  $output = rtrim($output, ',');
  return $output;
}

function my_custom_single_popular_post( $post_html, $p, $instance){
  return $p->id;
}
add_filter( 'wpp_custom_html', 'my_custom_popular_posts_html_list', 10, 2 );
add_filter('wpp_post', 'my_custom_single_popular_post', 10, 3);

実際に使う時

<?php
if(function_exists('wpp_get_mostpopular')) {
  $args = array (
    wpp_start => "",
    wpp_end => "",
    order_by => "views",
    range => "weekly",
    stats_comments => 0,
    stats_views => 1,
    limit => 50,
  );
  ob_start();
  wpp_get_mostpopular($args);
  $result = explode(',', ob_get_clean());
  $ranked_post_ids = array();
  foreach ($result as $res) {
    array_push($ranked_post_ids, intval($res));
  }
}

$ranked_post_idsはランキング記事のIDが入ってるので、get_postsなりなんなりで記事をとってループしてやればいいわけです。
こんな感じ

<?php
$args = array(
  'posts_per_page' => 7,
  'include', $ranked_post_ids,
  'orderby' => 'post__in',
  'paged' => $paged
);

$posts = get_posts($args);

上記のコードのポイントは2つ 1. フィルターフックで出力をカンマ区切りの状態へ 2. ob_start, ob_get_cleanで出力予定の文字列を出力せずに変数に保存する

まとめ

以上、WordPressPopularPostsを使ってランキング記事のIDの配列を取得する方法でしたm( )m
クエリを投げる回数が少し増えるので、速度は遅くなるかもですが特に問題がなければ上記の対応がいいんじゃないかなと思います!

以上!
とんジニアメモでした!!