【カスタム投稿】全投稿を一覧表示する方法【WordPress】

wordpress

今回はカスタム投稿を含む全ての投稿を「最近の投稿」やトップページの一覧に投稿する方法をご紹介したいと思います。

これをやりたい人がいると思うんだけど、検索してもでてこなかったのでちょっと細かくやっていこうと思います。

カスタム投稿を含む全投稿を一覧表示

function.phpに以下を記載します。

コード

function home_posts_pages_all( $wp_query ) {
if ( $wp_query->is_main_query() && $wp_query->is_home() ) {
$wp_query->set( ‘post_type’, ‘any’ );
}
}
add_action( ‘pre_get_posts’, ‘home_posts_pages_all’ );

まず、アクションフック(特定タイミングで実行される)の pre_get_posts を add_action 関数で指定します。

このアクションフックはクエリ変数オブジェクトの生成後、実際にクエリが実行される前に呼び出されます。

簡単に言うと普通の投稿の記事一覧を表示する前にカスタム投稿などの記事を割り込ませます。

書き方は以下を参考にします。
https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7/pre_get_posts

以下のように書いてあるので指示に従います。

pre_get_posts を使用するときは、変更しようとしているクエリ(が何であるか)に注意してください。便利な関数のひとつは is_main_query で、変更するクエリをメインクエリのみに制限するのに使えます。他の条件分岐タグと組み合わせて目的のページのメインクエリだけを変更しましょう。

add_action の第2引数で指定した関数名の home_posts_pages_all には、setメソッドで set( ‘post_type’, ‘any’ ); のように全てを指定してあげます。

これでOKです。

たしかこのままだと、固定ページも取得するので以下のようにカスタム投稿タイプのスラッグ(アルファベット表記のやつ)を指定してあげると、カスタム投稿だけを追加することができます。

$wp_query->set( ‘post_type’, array(‘post’,’カスタム投稿タイプ’));

複数のカスタム投稿を追加する場合はカスタム投稿タイプの後にカンマ区切りで記載してあげると複数のカスタム投稿タイプを投稿一覧に表示が可能です。

カテゴリーの処理

前述したままだと、カテゴリーからカテゴリー一覧に遷移した時にカスタム投稿が表示されません。

なので、以下を追加してあげます。

コード

function category_posts_all( $wp_query ) {
if ( $wp_query->is_category && $wp_query->is_main_query() )
$wp_query->set( ‘post_type’, ‘any’ );
}
add_action( ‘pre_get_posts’, ‘category_posts_all’ );

ここでは、アクションフックの pre_get_posts を指定して、呼び出した関数内で is_category を指定しています。

カテゴリーだった場合、カスタム投稿を含む全ての記事を取得します。

タグの処理

こちらもカテゴリーと同様です。

コード

function tag_posts_all( $wp_query ) {
if ($wp_query->is_tag() && $wp_query->is_main_query() ) {
$wp_query->set( ‘post_type’, ‘any’ );
}
}
add_action( ‘pre_get_posts’, ‘tag_posts_all’ );

is_tag でタグの時にカスタム投稿を含む全てのタグを取得してあげます。

まとめ

トップページでカスタム投稿を含む全ての記事一覧、カテゴリーページでカスタム投稿を含む全ての記事一覧、タグページでカスタム投稿を含む全ての記事一覧を取得する処理を記載しました。

同様のことをやっているので、1つわかれば全部だいたいわかると思います。

あと、このサイトではちょっと勉強がてら255文字までしかコピーできないように適当なスクリプトを実装してみています。

なので、お手数ですが、ちまちまコピーしてもらえると助かります。

参考になってくれればうれしいです!^^

コメントを残す