投稿、固定ページ、カスタム投稿等をマージした新着一覧表示について


※WordPress 3.8.1で検証

例として、post_typeについて
– カスタム投稿名:news
– 固定ページ:post(予約語)
– 投稿ページ:page(予約語)
の三つを統合して更新日時を基準に新しいものから(降順)に10件ソートして出すということをやりたいとします。

これをするために、WP_Queryやget_postsのオプションとかで何とかできるはずだ、と思いましたが無理でした。
試したものは後述しますが、結局wpdbを呼び出して、直接SQL文を叩いてWordPressから記事をソートして取り込んだのでした。
スマートでないので、他の方法があるなら教えてください T_T;

コード

global $wpdb;
$loop = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE (post_type = 'news' OR post_type = 'post' OR post_type = 'page') AND post_status IN ('publish') ORDER BY post_modified DESC limit 0,10" );

if ( $loop ):
  foreach ( $loop as $post ) : setup_postdata($loop);
     中身〜
  endforeach;
  wp_reset_postdata();
endif;

コード説明

post_type

(post_type = ‘タイプ名A’ OR post_type =’タイプ名B’)
のように、ORで表示させたいタイプ名を列挙します。

post_status

私の場合には、未来の記事も載せたいということで、
post_status IN (‘publish’,’future’)
にしました。このように複数指定できます。

ORDER BY post_modified DESC

最終更新日時(post_modified)で降順ソート(DESC)するという意味です。

limit 0,10

0件スキップして10件を表示するというオプションです。
つまり最初の10件を表示するというもの。
これないと全データを総取得するので、処理が遅くならないようにするために必要です。

失敗

下記のようにpost_typeは複数記載できます。
orderbyは、post_modifiedではなくてmodifiedを指定する必要があります。
1つのpost_typeなら問題なく動作するのですが、複数になるとソート順が「newsでソート」→「postでソート」→「pageでソート」になってしまい、統合した後にソートされません。
いや実はソートされていた時期もあったのですが、だめになったりとよく分からない状況です。
また折を見て調べたいですが、現状では時間がなくあきらめムード・・・。

$loop = new WP_Query( array( 'post_status'=>'publish', 'post_type' => array('news','post','page'), 'posts_per_page' => 10,'orderby'=>'modified', 'order'=>'DESC') );

if ( $loop->have_posts() ):
  while ( $loop->have_posts() ) : $loop->the_post();
     中身〜
  endwhile;
  wp_reset_postdata();
endif;

$loop = get_posts(array( 'post_status'=>'publish', 'post_type' => array('news','post','page'), 'posts_per_page' => 10,'orderby'=>'modified', 'order'=>'DESC'));

if ( $loop ):
  foreach ( $loop as $post ) : setup_postdata($loop);
     中身〜
  endforeach;
  wp_reset_postdata();
endif;

$paged = get_query_var('paged');
$loop = query_posts(array( 'post_status'=>'publish,future', 'post_type' => array('news','post','page'), 'posts_per_page' => 10, 'orderby'=>'modified', 'order'=>'DESC', 'paged'=>$paged));

if ( $loop ):
  foreach ( $loop as $post ) : setup_postdata($loop);
     中身〜
  endforeach;
  wp_reset_postdata();
endif;
広告

投稿、固定ページ、カスタム投稿等をマージした新着一覧表示について」への1件のフィードバック

  1. ピンバック: 投稿、固定ページ、カスタム投稿等をマージした新着一覧表示について(多言語WPML対応編) | Kimiya Kitaniの徒然なるブログ

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中