WordPress popular postのデータをWP_Queryで取得する方法は?
最近はCocoonやSWELLなどテーマに人気記事を取得する機能を持つものがあります。
テーマ付属の機能のためか、機能的には簡易的です。
そんな中、Wordpress popular postプラグインは人気記事をウィジェットで表示するプラグインの定番です。
しかし、Wordpressのテーマは無限にありますので、自分のサイトにWorpdress popular postを導入しても、人気記事一覧のデザインがテーマと合わなくて、使うのをためらっている人は多いと思います。
以前、SWELLでWordpress popular postを導入した時に調整するのが結構面倒でした。
WordPress popular postはカスタマイズを自由にできるようになっていますが、スキルがある人からすると、人気記事のpost IDだけ取得できれば、あとは自分でやりたいと思っている人がほとんどだと思います。
この記事ではWordpress popular postを導入して、コード内で人気記事のpost IDだけ取得する方法をご紹介します。
WP_QueryのようにWordpress popular postを使いたい
WordPressで記事をクエリするときには、WP_Queryを使います。しかし、WP_Queryを使ってもWordpress popular postの人気記事のpsot IDは取得できません。
もちろん、直接DBを叩けば取得できるでしょう。
しかし、それはやりたくないです。
WordPress popular postでは内部で同じことをしているはずですから、Wordpress popular postにはそのためのクエリ関数が用意されています。
WordPress popular postのクエリ関数
WordPress popular postはクエリ関数が用意されています。
# https://github.com/cabrerahector/wordpress-popular-posts/blob/master/src/Query.php
$popular_posts = new \WordPressPopularPosts\Query($args);
このように書くことで、指定した条件の記事情報を取得することができます。
WordPress popular postにはショートコードが用意されていますが、そのショートコードの引数がそのまま指定できます。
WordPress popular postからWP_Queryを使うコード
WordPress popular postのクエリ関数を使って、人気記事をクエリで取得します。
人気記事のpost IDを取得してからWP_Queryに渡します。
// WPPのクエリ
$popular_posts = new \WordPressPopularPosts\Query($args);
// IDを取得
$wpp_query_ids = array_map(
function( $wppost ){
return (int)$wppost->id;
}, $popular_posts->get_posts()
);
// WP_queryに渡す引数
$query_args['posts_per_page']=10;
$query_args['post__in']=$wpp_query_ids;
$query_args['orderby'] = 'post__in';
Queryを直接使うとキャッシュが効かない問題あり
\WordPressPopularPosts\Queryを直接叩くと、ランキングデータをダイレクトに取得できるメリットがあります。
しかし、この方法だとショートコードの時と違い、キャッシュが効かないのです。
WordPress popular postのショートコードやテンプレートタグの場合は、Queryを呼び出すときにキャッシュの確認をしてから呼び出すようになっています。
キャッシュが効かないまま使用していると、サーバーの負荷が上昇するリスクが高まります。
自前で書きたくないのですが、プラグインのキャッシュする部分を呼び出すことができないので、自分で書きます。
<?php
//https://github.com/cabrerahector/wordpress-popular-posts/blob/c31dea4d7f417a8844c3a136793e0ec7483f8226/src/Traits/QueriesPosts.php
function wpp_query_cache(array $params){
$cache =1;
// Return cached results
// if ( $this->config['tools']['cache']['active'] ) {
if ( $cache ) {
$key = 'wpp_' . md5(json_encode($params));
$query = \WordPressPopularPosts\Cache::get($key);
if ( false === $query ) {
$query = new \WordPressPopularPosts\Query($params);
$time_value = '60';
$time_unit = 'minute';
// No popular posts found, check again in 1 minute
if ( ! $query->get_posts() ) {
$time_value = 1;
$time_unit = 'minute';
}
\WordPressPopularPosts\Cache::set(
$key,
$query,
$time_value,
$time_unit
);
}
} // Get real-time popular posts
else {
$query = new \WordPressPopularPosts\Query($params);
}
return $query;
}
このPHP関数は、与えられたパラメータに基づいてWordPressの人気記事を取得するためのキャッシュを扱う関数です。
まず、$cache変数は1に設定されます。この変数は、キャッシュを使用するかどうかを制御するために使用されます。現在の実装では、キャッシュが常に有効になっています。
次に、与えられたパラメータをもとに、キャッシュキーを生成し、キャッシュから結果を取得しようとします。キャッシュに結果がある場合、キャッシュされたクエリ結果を返します。
キャッシュされた結果が見つからない場合、新しいクエリオブジェクトを生成し、パラメータに基づいて実際にデータベースからデータを取得し、そのクエリ結果をキャッシュに保存します。保存されるキャッシュの有効期限は、60分または1分(取得できる人気記事がない場合)に設定されます。
最後に、キャッシュが有効でない場合、新しいクエリオブジェクトを生成して、データベースからデータを取得し、その結果を直接返します。
この関数は、WordPress Popular Postsプラグインのクエリ機能の一部であり、取得された人気記事を表示するために使用されます。
$popular_posts = new \WordPressPopularPosts\Query($args);
の部分を以下のように置き換えるとキャッシュが効くようになります。
$popular_posts = wpp_query_cache($args);
まとめ
WordPress popular postのショートコードを使うとHTMLを出力してしまうので、不要な人も多いと思います。
この記事では、Wordpress popular postからWP_Queryを使う手順をご紹介しました。そちらを希望するという人には参考になると思います。
コメント