Установите мета-запрос только для определенного типа записи


Я пытаюсь скрыть свои товары Woocommerce, которых нет в наличии, от поиска, при этом в результатах по-прежнему отображаются другие типы сообщений. Тип записи для продуктов является product.

add_action( 'pre_get_posts', 'hide_out_of_stock_from_search' );

function hide_out_of_stock_from_search( $q ) {

    if ( ! $q->is_search() ) return;
    if ( is_post_type_archive( 'product' ) ) {

        $q->set( 'meta_query', array(array(
            'key'       => '_stock_status',
            'value'     => 'outofstock',
            'compare'   => 'NOT IN'
        )));

    }

    remove_action( 'pre_get_posts', 'hide_out_of_stock_from_search' );
}

Все работает, кроме is_post_type_archive( 'product' ), который не возвращает значение true. Если я заменю его на true, он скроет все из поискового запроса (даже сообщения и страницы), кроме товаров, которые есть на складе.

Как я могу установить meta_query только для определенного типа записи без влияет на другие типы записей в поисковом запросе?

Author: Krzysiek Dróżdż, 2018-07-05

1 answers

Краткое объяснение

Поиск - это поиск, а не архив.

Если вы взглянете на is_post_type_archive документы, вы увидите, что это:

Проверяет, относится ли запрос к странице архива данного типа (ов) записей.

Поэтому, если вы используете это условие в своем pre_get_posts, то это вообще не повлияет на результаты поиска.

С другой стороны, этот мета_запрос:

$q->set( 'meta_query', array(array(
    'key'       => '_stock_status',
    'value'     => 'outofstock',
    'compare'   => 'NOT IN'
)));

Сообщает, что вы хотите получать только сообщения с этим набором мета-значений и отличается от outoofstock, поэтому он исключит все записи и страницы (потому что у них вообще нет такого мета-значения).

Решение

add_action( 'pre_get_posts', 'hide_out_of_stock_from_search' );

function hide_out_of_stock_from_search( $q ) {

    if ( ! is_admin() && $q->is_main_query() && $q->is_search() ) {

        $q->set( 'meta_query', array(
            'relation' => 'OR',
            array(
                'key'       => '_stock_status',
                'value'     => 'outofstock',
                'compare'   => 'NOT IN'
            ),
            array(
                'key'       => '_stock_status',
                'compare'   => 'NOT EXISTS'
            )
        ));

    }
}
 2
Author: Krzysiek Dróżdż, 2018-07-05 23:26:13