wordpress カスタム投稿を一覧(ループ)で表示する
公開日:
:
WordPress, wordpress テンプレート
カスタム投稿を一覧で表示する方法がいろいろあります。
query_posts 関数が非推奨になってしまっているので、メモしておこうと思います。
1. query_posts 関数
2. get_posts 関数
3. WP_Query クラス
4.(おまけ) pre_get_posts アクションフック
1. query_posts 関数(非推奨)
テンプレートタグでメインクエリを上書きしてしまう為、現在非推奨。
使う場合は、最後に wp_reset_query でクエリをリセットすること。
$args = array( 'post_type' => 'カスタム投稿のスラッグ', 'posts_per_page' => 5 //表示件数(-1で全ての記事を表示) ); query_posts( $args ); if ( have_posts() ) : while ( have_posts() ) : the_post(); the_title(); endwhile; else: echo 'データがありません。'; endif; // クエリをリセット wp_reset_query();
テンプレートタグ/query posts – WordPress Codex 日本語版
2. get_posts 関数
メインループに影響与えない。
$args = array( 'post_type' => 'カスタム投稿のスラッグ', 'posts_per_page' => 5 //表示件数(-1で全ての記事を表示) ); $the_query = get_posts( $args ); if ( $the_query ) : foreach ( $the_query as $post ) : setup_postdata( $post ); the_title(); endforeach; wp_reset_postdata(); else: echo 'データがありません。'; endif;
テンプレートタグ/get posts – WordPress Codex 日本語版
3. WP_Query クラス
メインループに影響与えない。
get_posts より、条件分岐タグを使うような複雑な処理が可能。
$args = array( 'post_type' => 'カスタム投稿のスラッグ', 'posts_per_page' => 5 //表示件数(-1で全ての記事を表示) ); $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); the_title(); endwhile; wp_reset_postdata(); else : echo 'データがありません。'; endif;
関数リファレンス/WP Query – WordPress Codex 日本語版
4.(おまけ)pre_get_posts アクションフック
メインクエリに影響するので、DB への問い合わせを軽減。
カテゴリーページやアーカイブページの表示件数を変更したりなど、条件によってはカスタム投稿にも使用可能。
例1:カテゴリーページの表示件数変更する
function.php
add_action( 'pre_get_posts', 'my_custom_query_vars' ); function my_custom_query_vars( $query ) { // カテゴリーページの表示件数変更する if (! is_admin() && $query->is_main_query() && $query->is_category()){ $query -> set( 'posts_per_page', '5' ); } return $query; }
例2:検索結果にカスタム投稿タイプを含める
function.php
function search_filter($query) { if ( !is_admin() && $query->is_main_query() ) { // 検索結果にカスタム投稿タイプを含める if ($query->is_search) { $query->set( 'post_type', array( 'post', 'カスタム投稿のスラッグ' ) ); } } } add_action( 'pre_get_posts','search_filter' );
pre_get_posts は、固定ページのテンプレートでは使えない
注意が必要なのは、固定ページのテンプレートで使うとエラーになります。
以下は、「カスタム投稿一覧にも使えるのでは・・・?」と思ってやってみたダメな例です。
function.php
// 404エラーになるダメな例 add_action( 'pre_get_posts', 'my_custom_query_vars' ); function my_custom_query_vars( $query ) { if ( !is_admin() && $query->is_main_query() && is_page('固定ページスラッグ')) { $query->set( 'post_type' , 'カスタム投稿のスラッグ' ); $query->set( 'posts_per_page' , 5 );//表示件数(-1で全ての記事を表示) } return $query; }
なぜダメかというと、WordPress Codex に書いてありました。
WordPress Codex 日本語版 pre get posts より引用:
pre_get_posts は単一の固定ページのリクエスト(ページテンプレート)に対するクエリを変更するのに用いるべきではありません。なぜなら ‘is_page’、’is_singular’、’pagename’ および他のプロパティ(pretty パーマリンクを使っているかどうかによる)が parse_query() メソッドによってセットされた後だからです。・・・・
固定ページのテンプレートで一覧を表示したい場合は、WP_Query クラスを使ってくださいとのことです。
関連記事
-
-
WordPress タイトルの変更
テンプレートタグ the_title(); get_the_title(); WordPress
-
-
WordPress 自作フォーム その3(チェックボックスなど)
以前、WordPress 自作フォーム その1の記事で Wordpress で自作フォームを作ってみ
-
-
WordPress レスポンシブ テンプレート 元にサイトを作ってみる その2
DEMO を見る カスタム投稿タイプ functions.php 今回は3つのリストメニュ
-
-
WordPress エラー:Failed to load plugin: table from url https://cdn.tinymce.com/4/plugins/table/plugin.min.js
WordPress エラーの状態 WordPress 管理画面のテキスト入力欄で(ビジュアルタブの
-
-
ロリポップでWordPressのPHPバージョン7.1に変更後「サイトに技術的な問題が発生しています。」
WordPress.org の推奨環境 PHP7以上 MySQL5.6以上またはMaria
-
-
WordPress フォルダー・ファイル系の関数 is_dir や opendir や exif_imagetype で Warning エラー
Wordpress の管理画面でフォルダーの中身を読み込む関数 opendir でエラー Word
-
-
WordPress カレンダー カスタマイズ(add_filter版)
前回、「WordPress の PHP をちょっと見てみよう Ⅲ」でフックをやったので、カレンダーで
-
-
wordpress カスタム投稿で 2ページ目以降が404になってしまう
wordpress のカスタム投稿で、ニュースのページを作っていました。 ニュース一覧で、ペー
-
-
WordPress で VR させて、360°のパノラマ画像を表示する
WordPress.com内ショートコードで VR させる WordPress.com内で、VR(
-
-
WordPress の PHP をちょっと見てみよう Ⅲ
前記事の続きで、wp-settings.php の91行目あたりから見ていきます。 次は、wp