web-dev-qa-db-ja.com

pre_get_postsに$ query-> setが意図せずバックエンドに影響を与える

それで、私はカスタム投稿タイプ 'properties'を持っています。

私はarchive-properties.phpを使っています、そして$queryにいくつかのパラメータを設定する必要があります。

アーカイブページを開いてからすでに存在していたnew WP_Queryをページネーションプラグインがページ分割しようとしているという問題が発生したため、$queryを使用したくありません。

だから今私の問題は、私がposts_per_page2に設定してバックエンドにログインした場合、2つの投稿しか表示されないことです。

フロントエンドのクエリを変更するのにこれが必要ですが、バックエンドは変更しません。 if文に何を含めるべきかわかりません。

function set_query_parameters($query) {

    if( is_main_query() && is_post_type_archive( 'properties' ) && !$_SESSION  ) {           
        $query->set('posts_per_page', 12);
        $query->set('orderby', array(
            'date' => 'DESC',
        ));
    }
    return $query;
}

add_action( 'pre_get_posts', 'set_query_parameters' );
3
Joel M

WP_Queryを使用しないという決定に関しては、WP_Queryの新しいインスタンスを作成するのではなく、pre_get_postsを選択することが実際に優れています。実際、pre_get_postsは、メインクエリを変更するときに使用すべきものです。各ページの読み込みで個別のクエリを実行するのではなく、実行する前にメインクエリのパラメータを変更します。はるかに効率的!

あなたはほとんどそこにいます。 _!is_admin()ifステートメントに追加する必要があります。また、is_main_query()を具体的に呼び出す必要があります 関数に渡される$queryオブジェクト上

これらの2つの変更により、ifステートメントは次のようになります。

if( !is_admin() && $query->is_main_query() && is_post_type_archive( 'properties' ) && !$_SESSION  ) {

また、filterとは対照的に、Wordpressアクションに値を返す必要がないことに注意する価値があります。 pre_get_postsの場合、引数は 参照渡し であるため、$query変数に加えた変更は自動的に有効になります。

4
Tim Malone