サーチ…


構文

  • add_action( 'pre_get_posts'、 'callback_function_name');
  • 関数callback_function_name($ query){}
  • // PHP 5.3.0以上の場合
  • add_action( 'pre_get_posts'、function($ query){});

パラメーター

パラメータ詳細
$ query (WP_Query)ループオブジェクト

備考

PHP 5.3.0以上を使用している場合は、クロージャ( 匿名関数 )を使用して、

add_action( 'pre_get_posts', function( $query ) {
    if( !$query->is_main_query() || is_admin() ) return;

    // this code will run only if
    // - this query is main query
    // - and this is not admin screen
});

より具体的なループターゲティング

メインループを変更したいとしましょう。具体的なタクソノミーや投稿タイプの場合のみです。

bookポストタイプのアーカイブページのメインループのみを対象としています。

add_action( 'pre_get_posts', 'my_callback_function' );

function my_callback_function( $query ) {
    if( !$query->is_main_query() || is_admin() ) return;
    if( !is_post_type_archive( 'book' ) ) return;

    // this code will run only if
    // - this query is main query
    // - and this is not admin screen
    // - and we are on 'book' post type archive page
}

また、使用して、カテゴリ、タグやカスタム分類のアーカイブページを確認することができis_category() is_tag()is_tax()

WordPressで利用可能な任意の条件タグを使用することができます。

1つのカテゴリからの投稿を表示する

add_action( 'pre_get_posts', 'single_category' );

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

    $query->set( 'cat', '1' );
    return;
}

事前に投稿のフィルタの基本的な使用法を取得する

時にはメインのWordPressのクエリを変更したいと思うことがあります。

フィルタpre_get_postsは、行く方法です。

たとえば、 pre_get_postsを使用すると、 メインループに5つの投稿のみが表示されます。または、1つのカテゴリからの投稿のみを表示したり、カテゴリを除外するなど

add_action( 'pre_get_posts', 'my_callback_function' );

function my_callback_function( $query ) {
    // here goes logic of your filter
}

ご覧のとおり、 メインループのクエリーオブジェクトをコールバック関数の引数に渡しています。

ここで重要な点は、引数として引数を渡すことです。つまり、クエリを返す必要はなく、すべてのグローバルを設定する必要はありません。 $queryはメインクエリオブジェクトへの参照であるため、オブジェクトに対して行ったすべての変更はメインループオブジェクトに直ちに反映されます。

投稿リストの編集共有からカテゴリを除外

add_action( 'pre_get_posts', 'single_category_exclude' );

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

    $query->set( 'cat', '-1' );
    return;
}

メインループのposts_per_pageを変更する

$queryオブジェクトのset()メソッドを使うだけです。

最初に設定したい値と設定する値の2つの引数をとります。

add_action( 'pre_get_posts', 'change_posts_per_page' );

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

    $query->set( 'posts_per_page', 5 );
    return;
}

メインのWordPressループのみを対象とする

WordPressは、それが生成するすべてのループにpre_get_postsフィルタをpre_get_posts適用しています。これは、コールバック関数で行っているすべての変更がすべての既存のループに適用されることを意味します。

明らかに、それはほとんどのシナリオで私たちが望むものではありません。

ほとんどの場合、 メインループのみを対象とし、非管理画面のみを対象としたいと考えています。

is_main_query()メソッドとis_admin()グローバル関数を使用して、適切な場所にいるかどうかを調べることができます。

add_action( 'pre_get_posts', 'my_callback_function' );

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

    // this code will run only if
    // - this query is main query
    // - and this is not admin screen
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow