Установите мета-запрос только для определенного типа записи
Я пытаюсь скрыть свои товары 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 только для определенного типа записи без влияет на другие типы записей в поисковом запросе?
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'
)
));
}
}