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

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

提供: WordPress Codex 日本語版
移動先: 案内検索
(リンク修正)
(<div>タグ埋め込みと関連資料の和訳をしました。)
1行目: 1行目:
 +
<div id="Description">
 
==説明==
 
==説明==
 +
</div>
 
このフックはクエリー変数オブジェクトの生成後、実際にクエリーが実行される前に呼び出されます。
 
このフックはクエリー変数オブジェクトの生成後、実際にクエリーが実行される前に呼び出されます。
  
5行目: 7行目:
 
'''<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>
 
<pre><?php add_action( 'pre_get_posts', 'function_name' ); ?></pre>
 
<pre><?php add_action( 'pre_get_posts', 'function_name' ); ?></pre>
  
 
"function_name" は呼び出される関数名です。
 
"function_name" は呼び出される関数名です。
  
 +
<div id="Notes">
 
== 注意 ==
 
== 注意 ==
 +
</div>
 +
 +
<div id="Argument is Passed by Reference">
 
=== 変数は参照で渡されます ===
 
=== 変数は参照で渡されます ===
 +
</div>
 
関数に渡される <tt>$query</tt> オブジェクトは '''参照'''により渡されます。グローバル変数を宣言したり値を返す必要はありません。関数内から行われた変更はオリジナルに直ちに反映されます。
 
関数に渡される <tt>$query</tt> オブジェクトは '''参照'''により渡されます。グローバル変数を宣言したり値を返す必要はありません。関数内から行われた変更はオリジナルに直ちに反映されます。
 +
 +
<div id="Identifying Target Queries">
 
=== 対象となるクエリーの識別 ===
 
=== 対象となるクエリーの識別 ===
 +
</div>
 
<tt>pre_get_posts</tt>を使用する際は、変更しようとしているクエリーに注意してください。便利なツールのひとつは[[関数リファレンス/is_main_query|is_main_query]]です。変更するクエリーをメインクエリーのみに制限するのに使えます。
 
<tt>pre_get_posts</tt>を使用する際は、変更しようとしているクエリーに注意してください。便利なツールのひとつは[[関数リファレンス/is_main_query|is_main_query]]です。変更するクエリーをメインクエリーのみに制限するのに使えます。
 +
<div id="A Warning About Admin Usage">
 
=== 管理画面での使われ方に注意 ===
 
=== 管理画面での使われ方に注意 ===
 +
</div>
 
このフィルターは管理画面のクエリーにも影響を与えます。変更が投稿編集画面に影響を与えていないか確認してください。例えば、`! is_admin()` をチェックしないと、`is_main_query()` and `is_post_type_archive('custom')` だけでは `edit.php?post_type=custom` 用のクエリーも変更されてしまいます。
 
このフィルターは管理画面のクエリーにも影響を与えます。変更が投稿編集画面に影響を与えていないか確認してください。例えば、`! is_admin()` をチェックしないと、`is_main_query()` and `is_post_type_archive('custom')` だけでは `edit.php?post_type=custom` 用のクエリーも変更されてしまいます。
 +
<div id="A Warning About Conditional Functions">
 
=== 条件分岐関数に注意 ===
 
=== 条件分岐関数に注意 ===
 +
</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に依存するいくつかのテンプレートタグや条件分岐関数は動作しません。例えば、[[関数リファレンス/is_front_page|is_front_page()]]は動作しませんが、[[関数リファレンス/is_home|is_home()]]は動作します。このような場合は、<tt>pre_get_posts</tt>フックに渡されるクエリー変数を直接参照する必要があるでしょう($queryのサンプルはこのページにあります)。
 +
<div id="Offsets and Pagination">
 
=== オフセットとページ送り ===
 
=== オフセットとページ送り ===
 +
</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の[[:en:Making_Custom_Queries_using_Offset_and_Pagination|Making_Custom_Queries_using_Offset_and_Pagination]](英語)をお読みください。
  
 +
<div id="Examples">
 
== 使用例 ==
 
== 使用例 ==
 +
</div>
 +
 +
<div id="Exclude categories on your main page">
 
=== メインページから特定のカテゴリーを除外する ===
 
=== メインページから特定のカテゴリーを除外する ===
 +
</div>
 
これは特定のカテゴリーに属する投稿を除外して表示する方法です。例えば、ブログの'ホーム'に表示させたくない投稿のカテゴリーが2つ(未分類 '1'もうひとつ '1347') とあるとすると、プラグイン内(訳注:テーマのfunctions.phpでもいい?)で以下のようにします:
 
これは特定のカテゴリーに属する投稿を除外して表示する方法です。例えば、ブログの'ホーム'に表示させたくない投稿のカテゴリーが2つ(未分類 '1'もうひとつ '1347') とあるとすると、プラグイン内(訳注:テーマのfunctions.phpでもいい?)で以下のようにします:
  
36行目: 58行目:
 
</pre>
 
</pre>
  
 +
<div id="Exclude Pages from Search Results">
 
=== 検索結果から固定ページを除外 ===
 
=== 検索結果から固定ページを除外 ===
 +
</div>
 
Often when readers of your blog search for something, it is most likely to be in posts rather than pages. So, you might like to exclude pages in your search results. It is possible to create an action hook that limits the search results by showing only results from pages.
 
Often when readers of your blog search for something, it is most likely to be in posts rather than pages. So, you might like to exclude pages in your search results. It is possible to create an action hook that limits the search results by showing only results from pages.
  
52行目: 76行目:
 
</pre>
 
</pre>
  
 +
<div id="Include Custom Post Types in Search Results">
 
=== 検索結果にカスタム投稿タイプを含める ===
 
=== 検索結果にカスタム投稿タイプを含める ===
 +
</div>
 
<pre>
 
<pre>
 
function search_filter($query) {
 
function search_filter($query) {
65行目: 91行目:
 
</pre>
 
</pre>
  
 +
<div id="Changing the number of posts per page, by post type">
 
=== 投稿タイプを指定して表示件数を変更 ===
 
=== 投稿タイプを指定して表示件数を変更 ===
 +
</div>
 
WordPress includes a single global setting for controlling the number of posts that appear on one loop page (under "Blog pages show at most" in the admin"). It is possible to create an action hook that changes / overrides the posts_per_page setting on a case-by-case basis. Best of all, this is done before the query is even executed (so there is no performance cost)!
 
WordPress includes a single global setting for controlling the number of posts that appear on one loop page (under "Blog pages show at most" in the admin"). It is possible to create an action hook that changes / overrides the posts_per_page setting on a case-by-case basis. Best of all, this is done before the query is even executed (so there is no performance cost)!
  
89行目: 117行目:
 
</pre>
 
</pre>
  
==Example WP_Query Object==
+
<div id="Sample WP_Query Object">
 +
== WP_Queryオブジェクトの例 ==
 +
</div>
 
For reference, this is one possible example of the WP_Query object (<tt>$query</tt>) exposed by this hook. For more detail, you can also review the [[Class_Reference/WP_Query]] codex page.
 
For reference, this is one possible example of the WP_Query object (<tt>$query</tt>) exposed by this hook. For more detail, you can also review the [[Class_Reference/WP_Query]] codex page.
  
244行目: 274行目:
 
</pre>
 
</pre>
  
==Related==
+
<div id="Related">
* [[Class_Reference/WP_Query]] - to see the query vars that you can change
+
== 関連資料 ==
* [[Function_Reference/is_main_query]] - The ensure the query being changed is only the main query
+
</div>
 +
* [[関数リファレンス/WP Query]] - 変更可能なクエリ変数はこちらを参照してください
 +
* [[Function_Reference/is_main_query|関数リファレンス/is_main_query]] - 変更されるクエリがメインのもののみであることを確実にしてくれます
 +
* [http://notnil-creative.com/blog/archives/1996 WordPressでページ送りが動かないのはどう考えてもquery_postsが悪い!【pre_get_postsまとめ】 | notnil creation weblog]
  
 
{{Stub}}
 
{{Stub}}
{{原文|pre_get_posts|123389}}
+
{{原文|pre_get_posts|132640}} <!-- 21:17, 29 June 2013 Djkaz -->
 
[[Category:Actions]]
 
[[Category:Actions]]

2013年7月20日 (土) 07:19時点における版

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


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

書き方

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

"function_name" は呼び出される関数名です。

注意

変数は参照で渡されます

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

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

pre_get_postsを使用する際は、変更しようとしているクエリーに注意してください。便利なツールのひとつはis_main_queryです。変更するクエリーをメインクエリーのみに制限するのに使えます。

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

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

条件分岐関数に注意

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(英語)をお読みください。

使用例

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

これは特定のカテゴリーに属する投稿を除外して表示する方法です。例えば、ブログの'ホーム'に表示させたくない投稿のカテゴリーが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' );

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

Often when readers of your blog search for something, it is most likely to be in posts rather than pages. So, you might like to exclude pages in your search results. It is possible to create an action hook that limits the search results by showing only results from pages.

The following example demonstrates how to do that:

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 includes a single global setting for controlling the number of posts that appear on one loop page (under "Blog pages show at most" in the admin"). It is possible to create an action hook that changes / overrides the posts_per_page setting on a case-by-case basis. Best of all, this is done before the query is even executed (so there is no performance cost)!

The following example demonstrates how to override the page size ('posts_per_page') for archives of specific post types:

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

    if ( is_home() ) {
        // Display only 1 post for the original blog archive
        $query->set( 'posts_per_page', 1 );
        return;
    }

    if ( is_post_type_archive( 'movie' ) ) {
        // Display 50 posts for a custom post type called 'movie'
        $query->set( 'posts_per_page', 50 );
        return;
    }
}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );

WP_Queryオブジェクトの例

For reference, this is one possible example of the WP_Query object ($query) exposed by this hook. For more detail, you can also review the Class_Reference/WP_Query codex page.

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] => 
このページ「プラグイン API/アクションフック一覧/pre get posts」はまだ書きかけで、情報が不足しています。続きを書いて WordPress を手助けしましょう.


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