当サイト、Codex 日本語版は今後積極的な更新は行わない予定です。後継となる新ユーザーマニュアルは、https://ja.wordpress.org/support/ にあります。
万が一、当サイトで重大な問題を発見した際などは、フォーラムWordSlack #docs チャンネルでお知らせください。</p>

「プラグイン API/アクションフック一覧/pre get posts」の版間の差分

提供: WordPress Codex 日本語版
移動先: 案内検索
(最新英語版を反映。クリーンアップ。)
 
2行目: 2行目:
 
==説明==
 
==説明==
 
</div>
 
</div>
このフックはクエリー変数オブジェクトの生成後、実際にクエリーが実行される前に呼び出されます。
+
このフックはクエリ変数オブジェクトの生成後、実際にクエリが実行される前に呼び出されます。
  
 
+
'''<tt>pre_get_posts</tt>''' アクションは <tt>$query</tt> オブジェクトへの参照によるアクセス手段を開発者に提供します(<tt>$query</tt> への変更はオリジナルのオブジェクトに直接反映されます - 返り値は必要ありません)。
'''<tt>pre_get_posts</tt>''' アクションは、開発者は <tt>$query</tt> オブジェクトへの参照によるアクセス手段を提供します(<tt>$query</tt> への変更はオリジナルのオブジェクトに直接反映されます - 返り値は必要ありません)。
+
  
 
<div id="Usage">
 
<div id="Usage">
 
==書き方==
 
==書き方==
 
</div>
 
</div>
<pre><?php add_action( 'pre_get_posts', 'function_name' ); ?></pre>
 
  
"function_name" は呼び出される関数名です。
+
<?php add_action( 'pre_get_posts', 'your_function_name' ); ?>
 +
 
 +
参考: <tt>'your_function_name'</tt> は呼び出される関数の名前です。
  
 
<div id="Notes">
 
<div id="Notes">
18行目: 18行目:
 
</div>
 
</div>
  
<div id="Argument is Passed by Reference">
+
<div id="Argument_is_Passed_by_Reference">
=== 変数は参照で渡されます ===
+
=== 変数は参照で渡される ===
 
</div>
 
</div>
関数に渡される <tt>$query</tt> オブジェクトは '''参照'''により渡されます。グローバル変数を宣言したり値を返す必要はありません。関数内から行われた変更はオリジナルに直ちに反映されます。
+
関数が呼び出されるとき <tt>$query</tt> オブジェクトは'''参照'''により渡されます。グローバル宣言したり値を返したりする必要はありません。関数内で行った変更はオリジナルへ直ちに反映されます。
  
<div id="Page Requests">
+
<div id="Page_Requests">
 
===ページリクエスト===
 
===ページリクエスト===
 
</div>
 
</div>
<tt>pre_get_posts</tt> は 単一のページのリクエスト(ページテンプレート)に用いるべきではありません。なぜなら 'is_page'、'is_singular'、 'pagename'、および他のプロパティは(パーマリンク設定を使っているかどうかによる)、既に parse_query() メソッドによってセットされているからです。 参照:クエリの概要[[Query_Overview|Query Overview]]。これらの設定に精通していてそれらを調整しない限り、ページテンプレート [[Page_Templates|page template]] 自体に新しい [[Class_Reference/WP_Query|new WP_Query]]  を使用して、1つのページ要求のためのメイン·クエリを変更することを提案しています。
+
<tt>pre_get_posts</tt> は単一の固定ページのリクエスト(ページテンプレート)に対するクエリを変更するのに用いるべきではありません。なぜなら 'is_page'、'is_singular'、'pagename' および他のプロパティ(pretty パーマリンクを使っているかどうかによる)が parse_query() メソッドによってセットされた後だからです。詳しくは [[クエリ概要]] を見てください。
  
<div id="Identifying Target Queries">
+
これと同様に、<tt>pre_get_posts</tt> はテンプレートファイル(例えば archive.php)内では動作しません。なぜならクエリが完了した後だからです。
  
 +
これらの設定に精通していて、かつ設定を調整しようと望むのでなければ、[[ページテンプレート]]内で [[クラスリファレンス/WP Query|<code>new WP_Query</code>]] を使って単一の固定ページのリクエスト(ページテンプレート)に対するクエリを変更するのを推奨します。
 +
 +
本物の固定ページと静的フロントページにおける <tt>pre_get_posts</tt> の利用については以下の投稿を見ると良いでしょう。これはページネーションを <tt>pre_get_posts</tt> と <tt>WP_Query</tt> クラスのフィルターで変更し、<tt>pre_get_posts</tt> が動作するように post injection を利用します。<!-- 原文: You can check out the following post regarding the use of <tt>pre_get_posts</tt> on true pages and static front pages where we alter the pagination through <tt>pre_get_posts</tt> and the filters availble in the <tt>WP_Query</tt> class and using post injection in order to make <tt>pre_get_posts</tt> work -->
 +
 +
* [http://wordpress.stackexchange.com/a/215027/31545 Using pre_get_posts on pages and static front pages]
 +
 +
<div id="Identifying_Target_Queries">
 
=== 対象となるクエリーの識別 ===
 
=== 対象となるクエリーの識別 ===
 
</div>
 
</div>
<tt>pre_get_posts</tt>を使用する際は、変更しようとしているクエリーに注意してください。便利なツールのひとつは[[関数リファレンス/is_main_query|is_main_query]]です。変更するクエリーをメインクエリーのみに制限するのに使えます。Use it in combination with other [[Conditional_Tags|conditional tags]] to only alter the main query on the pages you want.
+
<tt>pre_get_posts</tt> を使用するときは、変更しようとしているクエリ(が何であるか)に注意してください。便利な関数のひとつは [[関数リファレンス/is_main_query|is_main_query]] で、変更するクエリをメインクエリのみに制限するのに使えます。他の[[条件分岐タグ]]と組み合わせて目的のページのメインクエリだけを変更しましょう。
<div id="A Warning About Admin Usage">
+
  
 +
<div id="A_Warning_About_Admin_Usage">
 
=== 管理画面での使われ方に注意 ===
 
=== 管理画面での使われ方に注意 ===
 
</div>
 
</div>
このフィルターは管理画面のクエリーにも影響を与えます。変更が投稿編集画面に影響を与えていないか確認してください。例えば、`! is_admin()` をチェックしないと、`is_main_query()` and `is_post_type_archive('custom')` だけでは `edit.php?post_type=custom` 用のクエリーも変更されてしまいます。
+
このフィルターは管理画面のクエリに影響を与えるのにも使えます。変更が「投稿一覧」画面に影響を与えていないか確認してください。例えば、<code>[[関数リファレンス/is_main_query|is_main_query()]]</code> と <code>[[関数リファレンス/is_post_type_archive|is_post_type_archive( 'movie' )]]</code> をチェックするだけだと、管理画面のクエリ <tt>edit.php?post_type=movie</tt> も変更してしまいます。これを避けるには <code>! [[Function_Reference/is_admin|is_admin()]]</code> もチェックしてください。
<div id="A Warning About Conditional Functions">
+
 
 +
<div id="A_Warning_About_Conditional_Functions">
 
=== 条件分岐関数に注意 ===
 
=== 条件分岐関数に注意 ===
 
</div>
 
</div>
<tt>pre_get_posts</tt>は[[関数リファレンス/WP_Query|WP_Query]]がセットアップされる'''前に'''実行されます。WP_Queryに依存するいくつかのテンプレートタグや条件分岐関数は動作しません。例えば、[[関数リファレンス/is_front_page|is_front_page()]]は動作しませんが、[[関数リファレンス/is_home|is_home()]]は動作します。このような場合は、<tt>pre_get_posts</tt>フックに渡されるクエリー変数を直接参照する必要があるでしょう($queryのサンプルはこのページにあります)。
+
<tt>pre_get_posts</tt> は [[関数リファレンス/WP_Query|WP_Query]] がセットアップされるより'''前に'''実行されます。WP_Query に依存するいくつかのテンプレートタグや条件分岐関数は動作しません。例えば、<tt>[[関数リファレンス/is_front_page|is_front_page()]]</tt> は動作''しません''が、<tt>[[関数リファレンス/is_home|is_home()]]</tt> は動作''します''。このような場合は、<tt>pre_get_posts</tt> フックに引数として渡されるクエリ変数を直接参照する必要があります(このページの用例に出てくる <tt>$query</tt>)。
<div id="Offsets and Pagination">
+
 
 +
<div id="Offsets_.26_Pagination">
 
=== オフセットとページ送り ===
 
=== オフセットとページ送り ===
 
</div>
 
</div>
WordPressのクエリーで<tt>offset</tt>引数を使うと、ページ送りに不具合を引き起こすことがあります。ページ送りを保護しつつオフセットを使用するには、手動でページ送りを処理する必要がありますので、ご注意ください。詳細は、Codexの[[:en:Making_Custom_Queries_using_Offset_and_Pagination|Making_Custom_Queries_using_Offset_and_Pagination]](英語)をお読みください。
+
WordPress のクエリで <tt>offset</tt> 引数を使うと(''どのクエリでも'')、ページ送りに不具合を引き起こすことがあります。ページ送りを保ちつつオフセットを使用するには、手動でページ送りを処理する必要があるので留意してください。詳しくは Codex の記事 [[Making Custom Queries using Offset and Pagination]] /[[:en:Making_Custom_Queries_using_Offset_and_Pagination|en]] を見てください。
  
<div id="Examples">
 
  
== 使用例 ==
+
<div id="Examples">
 +
== 用例 ==
 
</div>
 
</div>
  
<div id="Exclude categories on your main page">
+
<div id="Exclude_categories_on_your_main_page">
=== メインページから特定のカテゴリーを除外する ===
+
=== メインページから特定のカテゴリーを除外 ===
 
</div>
 
</div>
これは特定のカテゴリーに属する投稿を除外して表示する方法です。例えば、ブログの'ホーム'に表示させたくない投稿のカテゴリーが2つ(未分類 '1'もうひとつ '1347') とあるとすると、プラグイン内(訳注:テーマのfunctions.phpでもいい?)で以下のようにします:
+
これは特定のカテゴリーに属する投稿を除外してブログに表示する方法です。例えば、ブログの「ホーム」に表示させたくない投稿のカテゴリーが2つ(未分類 '1' ともうひとつ '1347')あるなら、プラグインまたはテーマ内(functions.php)で以下のコードを使います。
  
 
<pre>
 
<pre>
66行目: 75行目:
 
</pre>
 
</pre>
  
===ホームページ上に唯一のカテゴリを表示===
+
<div id="Show_Only_One_Category_on_Home_Page">
 
+
=== ホームページ上に唯一のカテゴリーを表示 ===
ホームページ上に唯一のカテゴリから記事を表示するには、<tt>functions.php</tt>に下記コードを配置します。
+
</div>
 +
ホームページに唯一のカテゴリーの記事を表示するには <tt>functions.php</tt> に下記のコードを置きます。
  
 
<pre>
 
<pre>
78行目: 88行目:
 
add_action( 'pre_get_posts', 'my_home_category' );
 
add_action( 'pre_get_posts', 'my_home_category' );
 
</pre>
 
</pre>
 
 
   
 
   
"123" 部分を表示したいカテゴリIDに変更してください。
+
'123' を表示したいカテゴリーの ID に変更してください。
  
===ホームページからIDにより単一の投稿を除外===
+
<div id="Exclude_Single_Posts_by_I.D_From_Home_Page">
 
+
=== ホームページから ID で単一投稿を除外 ===
ホームページからIDにより単一の投稿を除外する場合
+
</div>
 +
ホームページから投稿 ID の配列で単一投稿を除外します。
  
 
<pre>
 
<pre>
function exclude_single_posts_home($query) {
+
function exclude_single_posts_home( $query ) {
   if ($query->is_home() && $query->is_main_query()) {
+
   if ( $query->is_home() && $query->is_main_query() ) {
     $query->set('post__not_in', array(7,11));
+
     $query->set( 'post__not_in', array( 7, 11 ) );
 
   }
 
   }
 
}
 
}
  
add_action('pre_get_posts', 'exclude_single_posts_home');
+
add_action( 'pre_get_posts', 'exclude_single_posts_home' );
 
</pre>
 
</pre>
  
 
+
<div id="Exclude_Pages_from_Search_Results">
<div id="Exclude Pages from Search Results">
+
 
+
 
=== 検索結果から固定ページを除外 ===
 
=== 検索結果から固定ページを除外 ===
 
</div>
 
</div>
読者がブログを検索する時、その目的は恐らくページではなく投稿の中身でしょう。ですから、検索結果からページを除外することが好ましいことがあります。そこで投稿からの検索結果に限定するための、アクションフックを作ることもができます。
+
読者がブログを検索するとき、その目的は恐らく固定ページではなく投稿の中身でしょう。ですから、検索結果から固定ページを除外することが好ましいかもしれません。投稿からの検索結果に限定するためのアクションフックを作ることができます。以下の例がその方法です。
  
以下の例がその方法です:
 
 
<pre>
 
<pre>
function search_filter($query) {
+
function search_filter( $query ) {
 
   if ( !is_admin() && $query->is_main_query() ) {
 
   if ( !is_admin() && $query->is_main_query() ) {
     if ($query->is_search) {
+
     if ( $query->is_search ) {
       $query->set('post_type', 'post');
+
       $query->set( 'post_type', 'post' );
 
     }
 
     }
 
   }
 
   }
 
}
 
}
  
add_action('pre_get_posts','search_filter');
+
add_action( 'pre_get_posts','search_filter' );
 
</pre>
 
</pre>
  
<div id="Include Custom Post Types in Search Results">
+
<div id="Include_Custom_Post_Types_in_Search_Results">
 
=== 検索結果にカスタム投稿タイプを含める ===
 
=== 検索結果にカスタム投稿タイプを含める ===
 
</div>
 
</div>
123行目: 130行目:
 
   if ( !is_admin() && $query->is_main_query() ) {
 
   if ( !is_admin() && $query->is_main_query() ) {
 
     if ($query->is_search) {
 
     if ($query->is_search) {
       $query->set('post_type', array( 'post', 'movie' ) );
+
       $query->set( 'post_type', array( 'post', 'movie' ) );
 
     }
 
     }
 
   }
 
   }
 
}
 
}
  
add_action('pre_get_posts','search_filter');
+
add_action( 'pre_get_posts','search_filter' );
 
</pre>
 
</pre>
  
<div id="Changing the number of posts per page, by post type">
+
<div id="Changing_the_number_of_posts_per_page.2C_by_post_type">
 
=== 投稿タイプを指定して表示件数を変更 ===
 
=== 投稿タイプを指定して表示件数を変更 ===
 
</div>
 
</div>
WordPressは、ループページに表示される投稿の数をコントロールするための、1つのグローバル設定を含みます (管理画面:「設定」→「表示設定」→「1ページに表示する最大投稿数」で設定した値です)。この数値である <tt>posts_per_page</tt> の設定を、ケース・バイ・ケースで変更または優先させる為のアクションフックを作成することができます。とりわけこれはクエリが実行される前に実行されます。つまりパフォーマンスに与える影響がないのです!
+
WordPress には、ひとつのループページに表示する投稿の数を制御するためのグローバル設定がひとつあります(管理画面の 設定 > 表示設定 > 1ページに表示する最大投稿数)。この設定値を <tt>posts_per_page</tt> と呼び、ケース・バイ・ケースで変更または上書きするアクションフックを作成できます。何が良いかって、これはクエリを実行するより前に実行されるので、パフォーマンスに影響を与えないのです!
 +
 
 +
以下の例は特定の投稿タイプのアーカイブに対して、1ページに表示する投稿数 (<tt>'posts_per_page'</tt>) を上書きする手法を示します。
  
以下の例は、特定の投稿体部のアーカイブに対して、1ページに表示される投稿数 (<tt>posts_per_page</tt>) を変更させる手法を示します。
 
 
<pre>
 
<pre>
 
function hwl_home_pagesize( $query ) {
 
function hwl_home_pagesize( $query ) {
143行目: 151行目:
  
 
     if ( is_home() ) {
 
     if ( is_home() ) {
         // Display only 1 post for the original blog archive
+
         // オリジナルのブログアーカイブは投稿を1つ表示
 
         $query->set( 'posts_per_page', 1 );
 
         $query->set( 'posts_per_page', 1 );
 
         return;
 
         return;
150行目: 158行目:
 
     if ( is_post_type_archive( 'movie' ) ) {
 
     if ( is_post_type_archive( 'movie' ) ) {
 
         // Display 50 posts for a custom post type called 'movie'
 
         // Display 50 posts for a custom post type called 'movie'
 +
        // カスタム投稿タイプ 'movie' は50の投稿を表示
 
         $query->set( 'posts_per_page', 50 );
 
         $query->set( 'posts_per_page', 50 );
 
         return;
 
         return;
157行目: 166行目:
 
</pre>
 
</pre>
  
===フィードのページ毎の投稿数を変更する===
+
<div id="Changing_the_number_of_posts_per_page_on_a_feed">
 
+
=== フィードに出力する投稿数を変更 ===
posts_per_rss の設定を使用して、特定のフィードに表示する投稿数を上書きすることができます。
+
</div>
 +
posts_per_rss の設定を使用して特定のフィードに表示する投稿数を上書きできます。
  
 
<pre>
 
<pre>
167行目: 177行目:
 
return;
 
return;
 
 
//set conditional
+
//条件に応じた設定
  
 
$query->set( 'posts_per_rss', 50 );
 
$query->set( 'posts_per_rss', 50 );
174行目: 184行目:
 
</pre>
 
</pre>
  
 
+
<div id="Sample_WP_Query_Object">
<div id="Sample WP_Query Object">
+
== WP_Query オブジェクトの例 ==
 
+
== WP_Queryオブジェクトの例 ==
+
 
</div>
 
</div>
参考として、このフックで吐き出されたWP_Query オブジェクト (<tt>$query</tt>) の一例を挙げます。更なる詳細は、 [[Class_Reference/WP_Query]] を参照してください。
+
参考として、このフックで出力してみた WP_Query オブジェクト (<tt>$query</tt>) の一例を示します。詳しくは、[[クラスリファレンス/WP Query|WP_Query]] の codex ページを参照してください。
  
 
<pre>
 
<pre>
334行目: 342行目:
  
 
<div id="Related">
 
<div id="Related">
== 関連資料 ==
+
== 関連項目 ==
 
</div>
 
</div>
* [[関数リファレンス/WP Query]] - 変更可能なクエリ変数はこちらを参照してください
+
* [[クラスリファレンス/WP_Query|WP_Query クラス]] - 変更可能なクエリ変数はこちらを参照してください。
* [[Function_Reference/is_main_query|関数リファレンス/is_main_query]] - 変更されるクエリがメインのもののみであることを確実にしてくれます
+
* [[関数リファレンス/is_main_query|is_main_query()]] - 変更するクエリを確実にメインのものだけにします。
* [http://notnil-creative.com/blog/archives/1996 WordPressでページ送りが動かないのはどう考えてもquery_postsが悪い!【pre_get_postsまとめ】 | notnil creation weblog]
+
* [http://notnil-creative.com/blog/archives/1996 WordPressでページ送りが動かないのはどう考えてもquery_postsが悪い!【pre_get_posts、WordPressループまとめ】 | notnil creation weblog]
 +
* [http://gatespace.jp/2012/09/10/modify_main_queries/ | WordPressでホームやアーカイブ毎に表示条件を変える(is_main_query と pre_get_posts フック) | Gatespace&#039;s Blog]
  
 
{{Query Tags}}
 
{{Query Tags}}
344行目: 353行目:
 
{{Tag Footer}}
 
{{Tag Footer}}
  
{{原文|Plugin_API/Action_Reference/pre_get_posts|149794}} <!-- 17:10, 23 February 2015‎ Bcworkz -->
+
{{原文|Plugin_API/Action_Reference/pre_get_posts|155947}} <!-- 04:21, 8 March 2016 Firefly2000 -->
  
 
[[Category:アクションフック]]
 
[[Category:アクションフック]]
 +
 +
[[en:Plugin API/Action Reference/pre get posts]]
 +
[[pt-br:Plugin API/Ações e Referências/pre get posts]]

2016年5月7日 (土) 20:35時点における最新版

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

pre_get_posts アクションは $query オブジェクトへの参照によるアクセス手段を開発者に提供します($query への変更はオリジナルのオブジェクトに直接反映されます - 返り値は必要ありません)。

書き方

<?php add_action( 'pre_get_posts', 'your_function_name' ); ?>

参考: 'your_function_name' は呼び出される関数の名前です。

注意

変数は参照で渡される

関数が呼び出されるとき $query オブジェクトは参照により渡されます。グローバル宣言したり値を返したりする必要はありません。関数内で行った変更はオリジナルへ直ちに反映されます。

ページリクエスト

pre_get_posts は単一の固定ページのリクエスト(ページテンプレート)に対するクエリを変更するのに用いるべきではありません。なぜなら 'is_page'、'is_singular'、'pagename' および他のプロパティ(pretty パーマリンクを使っているかどうかによる)が parse_query() メソッドによってセットされた後だからです。詳しくは クエリ概要 を見てください。

これと同様に、pre_get_posts はテンプレートファイル(例えば archive.php)内では動作しません。なぜならクエリが完了した後だからです。

これらの設定に精通していて、かつ設定を調整しようと望むのでなければ、ページテンプレート内で new WP_Query を使って単一の固定ページのリクエスト(ページテンプレート)に対するクエリを変更するのを推奨します。

本物の固定ページと静的フロントページにおける pre_get_posts の利用については以下の投稿を見ると良いでしょう。これはページネーションを pre_get_postsWP_Query クラスのフィルターで変更し、pre_get_posts が動作するように post injection を利用します。

対象となるクエリーの識別

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

管理画面での使われ方に注意

このフィルターは管理画面のクエリに影響を与えるのにも使えます。変更が「投稿一覧」画面に影響を与えていないか確認してください。例えば、is_main_query()is_post_type_archive( 'movie' ) をチェックするだけだと、管理画面のクエリ edit.php?post_type=movie も変更してしまいます。これを避けるには ! is_admin() もチェックしてください。

条件分岐関数に注意

pre_get_postsWP_Query がセットアップされるより前に実行されます。WP_Query に依存するいくつかのテンプレートタグや条件分岐関数は動作しません。例えば、is_front_page() は動作しませんが、is_home() は動作します。このような場合は、pre_get_posts フックに引数として渡されるクエリ変数を直接参照する必要があります(このページの用例に出てくる $query)。

オフセットとページ送り

WordPress のクエリで offset 引数を使うと(どのクエリでも)、ページ送りに不具合を引き起こすことがあります。ページ送りを保ちつつオフセットを使用するには、手動でページ送りを処理する必要があるので留意してください。詳しくは Codex の記事 Making Custom Queries using Offset and Pagination /en を見てください。


用例

メインページから特定のカテゴリーを除外

これは特定のカテゴリーに属する投稿を除外してブログに表示する方法です。例えば、ブログの「ホーム」に表示させたくない投稿のカテゴリーが2つ(未分類 '1' ともうひとつ '1347')あるなら、プラグインまたはテーマ内(functions.php)で以下のコードを使います。

function exclude_category( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'cat', '-1,-1347' );
    }
}
add_action( 'pre_get_posts', 'exclude_category' );

ホームページ上に唯一のカテゴリーを表示

ホームページに唯一のカテゴリーの記事を表示するには functions.php に下記のコードを置きます。

function my_home_category( $query ) {
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set( 'cat', '123' );
    }
}
add_action( 'pre_get_posts', 'my_home_category' );

'123' を表示したいカテゴリーの ID に変更してください。

ホームページから ID で単一投稿を除外

ホームページから投稿 ID の配列で単一投稿を除外します。

function exclude_single_posts_home( $query ) {
  if ( $query->is_home() && $query->is_main_query() ) {
    $query->set( 'post__not_in', array( 7, 11 ) );
  }
}

add_action( 'pre_get_posts', 'exclude_single_posts_home' );

検索結果から固定ページを除外

読者がブログを検索するとき、その目的は恐らく固定ページではなく投稿の中身でしょう。ですから、検索結果から固定ページを除外することが好ましいかもしれません。投稿からの検索結果に限定するためのアクションフックを作ることができます。以下の例がその方法です。

function search_filter( $query ) {
  if ( !is_admin() && $query->is_main_query() ) {
    if ( $query->is_search ) {
      $query->set( 'post_type', 'post' );
    }
  }
}

add_action( 'pre_get_posts','search_filter' );

検索結果にカスタム投稿タイプを含める

function search_filter($query) {
  if ( !is_admin() && $query->is_main_query() ) {
    if ($query->is_search) {
      $query->set( 'post_type', array( 'post', 'movie' ) );
    }
  }
}

add_action( 'pre_get_posts','search_filter' );

投稿タイプを指定して表示件数を変更

WordPress には、ひとつのループページに表示する投稿の数を制御するためのグローバル設定がひとつあります(管理画面の 設定 > 表示設定 > 1ページに表示する最大投稿数)。この設定値を posts_per_page と呼び、ケース・バイ・ケースで変更または上書きするアクションフックを作成できます。何が良いかって、これはクエリを実行するより前に実行されるので、パフォーマンスに影響を与えないのです!

以下の例は特定の投稿タイプのアーカイブに対して、1ページに表示する投稿数 ('posts_per_page') を上書きする手法を示します。

function hwl_home_pagesize( $query ) {
    if ( is_admin() || ! $query->is_main_query() )
        return;

    if ( is_home() ) {
        // オリジナルのブログアーカイブは投稿を1つ表示
        $query->set( 'posts_per_page', 1 );
        return;
    }

    if ( is_post_type_archive( 'movie' ) ) {
        // Display 50 posts for a custom post type called 'movie'
        // カスタム投稿タイプ 'movie' は50の投稿を表示
        $query->set( 'posts_per_page', 50 );
        return;
    }
}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );

フィードに出力する投稿数を変更

posts_per_rss の設定を使用して特定のフィードに表示する投稿数を上書きできます。

function bdn_feed_set_posts_per_rss( $query ) {

	if( !$query->is_main_query() || !is_feed() )
		return;
	
	//条件に応じた設定

	$query->set( 'posts_per_rss', 50 );

}

WP_Query オブジェクトの例

参考として、このフックで出力してみた WP_Query オブジェクト ($query) の一例を示します。詳しくは、WP_Query の codex ページを参照してください。

WP_Query Object
(
    [query_vars] => Array
        (
            [page] => 
            [pagename] => blog
            [error] => 
            [m] => 0
            [p] => 0
            [post_parent] => 
            [post_type] =>
            [subpost] => 
            [subpost_id] => 
            [attachment] => 
            [attachment_id] => 0
            [name] => 
            [static] => 
            [page_id] => 0
            [second] => 
            [minute] => 
            [hour] => 
            [day] => 0
            [monthnum] => 0
            [year] => 0
            [w] => 0
            [category_name] => 
            [tag] => 
            [cat] => 
            [tag_id] => 
            [author_name] => 
            [feed] => 
            [tb] => 
            [paged] => 0
            [comments_popup] => 
            [meta_key] => 
            [meta_value] => 
            [preview] => 
            [s] => 
            [sentence] => 
            [fields] => 
            [category__in] => Array
                (
                )

            [category__not_in] => Array
                (
                )

            [category__and] => Array
                (
                )

            [post__in] => Array
                (
                )

            [post__not_in] => Array
                (
                )

            [tag__in] => Array
                (
                )

            [tag__not_in] => Array
                (
                )

            [tag__and] => Array
                (
                )

            [tag_slug__in] => Array
                (
                )

            [tag_slug__and] => Array
                (
                )

        )

    [tax_query] => 
    [meta_query] => 
    [post_count] => 0
    [current_post] => -1
    [in_the_loop] => 
    [comment_count] => 0
    [current_comment] => -1
    [found_posts] => 0
    [max_num_pages] => 0
    [max_num_comment_pages] => 0
    [is_single] => 
    [is_preview] => 
    [is_page] => 
    [is_archive] => 
    [is_date] => 
    [is_year] => 
    [is_month] => 
    [is_day] => 
    [is_time] => 
    [is_author] => 
    [is_category] => 
    [is_tag] => 
    [is_tax] => 
    [is_search] => 
    [is_feed] => 
    [is_comment_feed] => 
    [is_trackback] => 
    [is_home] => 1
    [is_404] => 
    [is_comments_popup] => 
    [is_paged] => 
    [is_admin] => 
    [is_attachment] => 
    [is_singular] => 
    [is_robots] => 
    [is_posts_page] => 1
    [is_post_type_archive] => 
    [query_vars_hash] => 41032f87127fba65fb6743b1e97d8662
    [query_vars_changed] => 
    [thumbnails_cached] => 
    [query] => Array
        (
            [page] => 
            [pagename] => blog
        )

    [queried_object] => stdClass Object
        (
            [ID] => 16
            [post_author] => 1
            [post_date] => 2012-01-31 17:23:57
            [post_date_gmt] => 2012-01-31 17:23:57
            [post_content] => 
            [post_title] => Blog
            [post_excerpt] => 
            [post_status] => publish
            [comment_status] => open
            [ping_status] => open
            [post_password] => 
            [post_name] => blog
            [to_ping] => 
            [pinged] => 
            [post_modified] => 2012-01-31 17:23:57
            [post_modified_gmt] => 2012-01-31 17:23:57
            [post_content_filtered] => 
            [post_parent] => 0
            [guid] => 

記事

コード・ドキュメンテーション

  • クラス: WP_Query - WP_Query クラスの詳細な全容
  • クラス: WP_Comment_Query - コメント関連のクエリのためのクラス
  • クラス: WP_User_Query - ユーザー関連のクエリのためのクラス
  • オブジェクト: $wpdb - $wpdb オブジェクトの使い方全容
  • 関数: set_query_var()
  • 関数: get_query_var()
  • 関数: query_posts() - 追加のカスタムクエリを作成
  • 関数: get_post() - 項目の ID を取得しデータベース内にあるその投稿のレコードを返す
  • 関数: get_posts() - 投稿の配列を返すことに特化した関数
  • 関数: get_pages() - ページの配列を返すことに特化した関数
  • 関数: have posts() - クエリが投稿を返すか否かを判断する条件関数
  • 関数: the_post() - クエリ後に自動的にループを設定する
  • 関数: rewind_posts() - 現状のループをリセットする
  • 関数: setup_postdata() - ループ内で個別の結果を得るためのクエリデータを設定する
  • 関数: wp_reset_postdata() - 直前のクエリを復元する (通常はループ内の別のループの後に用いられる)
  • 関数: wp_reset_query()
  • 関数: is_main_query() - 変更されるクエリがメインのクエリであることを確認する
  • アクションフック: pre_get_posts - WordPressクエリが実行される前に変更する
  • アクションフック: the_post - post クエリの後で post オブジェクトを変更する
  • フィルターフック: found_posts - WP_Query オブジェクトの found_posts 値を変更する


関数リファレンステンプレートタグ目次もご覧ください。


最新英語版: WordPress Codex » Plugin_API/Action_Reference/pre_get_posts最新版との差分