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 で VR させて、360°のパノラマ画像を表示する
WordPress.com内ショートコードで VR させる WordPress.com内で、VR(
-
WordPress レスポンシブ テンプレート 元にサイトを作ってみる その1
「レスポンシブ テンプレート の メニューやブログの設置」の記事では、メニューやブログの設置例をやっ
-
WordPress リビジョンを削除し、テーブルを最適化してDBの容量を削減
WordPress リビジョン機能 リビジョンは過去の記事を保存してくれる WordPress の
-
WordPress 自作フォーム その3(チェックボックスなど)
以前、WordPress 自作フォーム その1の記事で Wordpress で自作フォームを作ってみ
-
WordPress 独自テーブル
Wordpress で独自テーブルを作ってみようと思います。 独自テーブルのデータ 今回のデ
-
WordPress タイトルの変更
テンプレートタグ the_title(); get_the_title(); WordPress
-
WordPress 自作フォーム その2(注意点とエラー:This is somewhat embarrassing, isn’t it? など)
前回(WordPress 自作フォーム 1)のつづきです。 今回は細かいところや注意点とエラーなど
-
WordPress 自作フォーム その1(サンプルと設置)
Wordpress でプラグインを使わずにフォームをやってみます。 簡単に名前、メールアドレス、メ
-
wordpress カスタム投稿で 2ページ目以降が404になってしまう
wordpress のカスタム投稿で、ニュースのページを作っていました。 ニュース一覧で、ペー
-
レンタルサーバでWordPressを設置してみよう!
WordPress.com 内に、ブラウザだけで無料でサイトを作成出来きるサービスもありますが、Wo