web-dev-qa-db-ja.com

メタ値に基づいてメインループから投稿を除外する

特定のメタ値が設定されている投稿を除外するようにメインループ(index.php)を変更する必要があります(ACFのTrue/Falseフィールドを使用)。

function exclude_featured_post( $query ) {
    if ( $query->is_home() && $query->is_main_query()) {
        // in case for some reason there's already a meta query set from other plugin
        $meta_query = $query->get('meta_query')? : [];

        // append yours
        $meta_query[] = [
            'key' => 'featured_post',
            'value' => '1',
            'compare' => '!='
        ];

        $query->set('meta_query', $meta_query);
    }
}
add_action( 'pre_get_posts', 'exclude_featured_post' );

これは投稿を返しません。これをメインクエリとマージする必要があると思います。

global $wp_query;
$merged_args = array_merge( $wp_query->query, $exclude_featured_args );
$query->set('meta_query', $merged_args);

ただし、これも投稿を返しません。

更新:

'compare' => '!='の代わりに 'compare' => 'NOT EXISTS`を使用すると、すべての投稿が返され、meta_queryが除外されます。

function exclude_featured_post( $query ) {
    if ( $query->is_home() && $query->is_main_query()) {
        // in case for some reason there's already a meta query set from other plugin
        $meta_query = $query->get('meta_query')? : [];

        // append yours
        $meta_query[] = [
            'key' => 'featured_post',
            'value' => '1',
            'compare' => 'NOT EXISTS'
        ];

        $query->set('meta_query', $meta_query);

    }
}
add_action( 'pre_get_posts', 'exclude_featured_post' );

ここから: https://core.trac.wordpress.org/ticket/18158

1
Dave

Dave、あなたのコードはその中のいくつかを除いて良いように思われるので、試してみてください。

function exclude_featured_post( $query ) {
    if ( is_front_page() && $query->is_main_query() ) {


        $meta_query = $query->get('meta_query') ? $query->get('meta_query') : array();

        // append yours
        $meta_query[] = array(
            'key' => 'featured_post', // please make sure that key is correct
            'value' => '1',
            'compare' => '!=' // you can also try 'NOT EXISTS' comparison
        );

        $query->set('meta_query', $meta_query);

    }
}
add_action( 'pre_get_posts', 'exclude_featured_post' );

上記のコードがうまくいかない場合は、次の手順に従ってください。

  1. それがホームページのメインクエリに対して実行されていることを確認してください - ちょうどその中に何かをエコーするようにしてください - このステップは2行目の条件が正しいかどうかを理解するのに役立ちます。

  2. orderbyなどのもっと単純なパラメータで遊ぼう。それがうまくいくかどうかチェックする。

  3. 他のmeta_queryパラメータを持たない投稿についてこのコードをテストしてください。

  4. Meta_queryの代わりにmeta_keymeta_valueおよびmeta_compare paramsを使用してみてください。ここで見つけることができる例 https://rudrastyh.com/wordpress/meta_query.html

  5. そしてfeature_postというキーが正しいことを確認して、それを信じるのは難しいですが、私の学生の間でそれが最も一般的な間違いです。

0
Misha Rudrastyh