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を設置してみよう!
WordPress.com 内に、ブラウザだけで無料でサイトを作成出来きるサービスもありますが、Wo
-
-
WordPress 独自テーブル
Wordpress で独自テーブルを作ってみようと思います。 独自テーブルのデータ 今回のデ
-
-
「All-in-One WP Migration」プラグインで 簡単に WordPress のサーバー移行する手順メモ
1.移行元サイトでのデータエクスポート 「All-in-One WP Migration(公式リン
-
-
WordPress リビジョンを削除し、テーブルを最適化してDBの容量を削減
WordPress リビジョン機能 リビジョンは過去の記事を保存してくれる WordPress の
-
-
WordPress twentyseventeen の function.php を見る – その2
前回の続きです。 次のスターターコンテンツは、今回のシンプルテンプレートには不要ですが、よくわ
-
-
WordPress タイトルの変更
テンプレートタグ the_title(); get_the_title(); WordPress
-
-
WordPress レスポンシブ テンプレートコーポレート用(シンプル・カスタマイズ用)ダウンロード
WordPress レスポンシブ テンプレートコーポレート用(シンプル・カスタマイズ用)ダウンロード
-
-
WordPress カレンダー カスタマイズ
WordPressでカレンダーの表示部分をいじってみようかと思います。 どうやら、カレンダー関
-
-
WordPress フォルダー・ファイル系の関数 is_dir や opendir や exif_imagetype で Warning エラー
Wordpress の管理画面でフォルダーの中身を読み込む関数 opendir でエラー Word
-
-
WordPress 自作フォーム その1(サンプルと設置)
Wordpress でプラグインを使わずにフォームをやってみます。 簡単に名前、メールアドレス、メ