【WordPress】サブループを回さずに直接投稿データを取得する
WordPressで投稿一覧を取得するのによく使われるWP_Queryクラスを使ったサブループですが、下の画像のような構築に出くわしたことはありませんか?
検索結果画面で「いつ時点での最新データ掲載をしているのか」という表示があるタイプのものです。
今回はサブループを回さずに$wp_queryから投稿データを取得するネタについてご紹介致します。
今回の例について
今回は以下の記述で記事の一覧を取得しているという状況を考えます。
$args = [
'post_type' => 'hoge',
'post_status' => 'publish',
'orderby' => 'DESC',
'order' => 'date'
];
$wp_query = new WP_Query($args);
カスタム投稿タイプのhogeで表示順を投稿日の降順取得するという、ごく普通の条件ですね。
更新日順にしたければorderの部分はmodifiedにすればOKです。
ちなみに、特にposts_per_pageを設定していませんが、WordPressの管理画面側で10件に設定しているという想定です。
さっそく結論
それでは結論から参りましょう。
画像の例で「取得した投稿の1件目の投稿日を表示する」というケースだと、こんな感じで対応ができます。
// 最新日取得条件の配列調整用
function get_date_query_args($array) {
$array += ['posts_per_page' => -1];
return $array;
}
// 最新日取得条件取得
$date_args = get_date_query_args($args);
// 新着日取得用
$posts = get_posts($date_args);
if ( $posts ) {
$new_date = get_post_time('Y年m月d日', false, $posts[0]);
}
画像のように投稿一覧を投稿日の降順で並べている場合は一番最初の投稿データがこの日付を持っていることになります。
変数の$new_dateに格納されているのがその日付データですので、表示したいところでechoができます。
posts_per_pageを調整してget_postsを使う意味
理由はシンプルでposts_per_pageを調整しないとページネーションの2ページ目以降にこの日付が各ページの最初の投稿日になってしまうためです。
そのため、posts_per_page => ‐1で全件の投稿取得をする配列を作ってget_postsで検索結果の1件目の投稿日をページが変わっても使えるように取得する…という感じで対応します。
WP_Queryでも可能
今回はget_postsを使用しましたが、同じようなことはWP_Queryでも可能です。
$date_query = new WP_Query($date_args);
$new_date = get_post_time('Y年m月d日', false, $date_query->posts[0]);
WP_Queryは["posts"]に配列の形で、取得できた投稿のデータを持っているので、それを利用して[0]で最初のデータを取ってきている方法です。
またはこれでもOK。
$date_query = new WP_Query($date_args);
$new_date = get_post_time('Y年m月d日', false, $date_query->post);
WP_Queryはそのほかに["post"]というものも持っていて、これが現在の投稿情報(最初の投稿データのためposts[0]と内容が同じ)であるため、ここへ投稿データを取りに行っても機能します。
詳しくはこちらの記事がとても参考になるのでお薦めです。
終わりに
get_postsを使ったらforeach・WP_Queryならwhileで…といった感じで、基本はループを回して処理することが勿論多いわけですが、こんな風にループを回さずに投稿のデータを取得できるということも知っておくと、ちょっとした変化球でも対応ができますね。
小ネタですが、何かのお役に立ちましたら幸いです。
Discussion