Предотвращение фильтра pre_get_posts для определенного типа записи
У меня возникла проблема с фильтром pre_get_posts.
На данный момент у меня есть 4 типа записей: Записи, Страницы, События и Площадки. Я создал одно пользовательское поле под названием city для типов записей событий и площадок.
При создании пользовательского поля у меня есть опция выбора типа записи, для которого я хочу отображать это пользовательское поле.
Теперь в части фронтенда я добавил фильтр на pre_get_posts и модифицировал основной запрос для получения всех записей из определенного города.
Все работает отлично для списков и отдельных страниц событий и площадок, но этот фильтр также применяется к записям и страницам.
Что я хочу: **Я хочу убрать этот фильтр для типов записей, которые не включают это пользовательское поле.
Я пробовал использовать код $wp_query->query_vars['page_id'], но он больше не работает.
Может кто-нибудь помочь решить эту проблему?
Для информации: Мой код выглядит так:
add_action( 'pre_get_posts', 'citywise_post_filter' );
function citywise_post_filter($query) {
global $wp_query;
if( isset( $_REQUEST['city_filter'] ) ){
$city = $_REQUEST['city_filter'];
}else{
$city = $_SESSION['CURR_CITY'];
}
if ( !is_admin() ){
$query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
$query->set( 'meta_value', $city );
return;
}
}
Спасибо, Aezaz

Улучшите ваше условие, добавив проверку типа запрашиваемой записи. Это можно сделать с помощью метода WP_Query::get
.
Там, где у вас написано:
if ( !is_admin() ){
$query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
$query->set( 'meta_value', $city );
return;
}
замените на:
if ( ! is_admin() && in_array ( $query->get('post_type'), array('event','venue') ) ) {
$query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
$query->set( 'meta_value', $city );
return;
}
Также обратите внимание, что при использовании этого кода, как отметил @offroff в своем ответе, фильтр будет применяться ко всем запросам: как к основным запросам при посещении страницы, так и к запросам, инициированным через код с использованием new WP_Query ($args)
(дополнительные запросы).
Чтобы код не влиял на дополнительные запросы, добавьте проверку $query->is_main_query()
, тогда код примет вид:
if ( is_admin() || ! $query->is_main_query() ) return;
if ( in_array ( $query->get('post_type'), array('event','venue') ) ) {
$query->set( 'meta_key', '_ct_selectbox_52f65ae267764' );
$query->set( 'meta_value', $city );
return;
}

Привет, G.M. Большое спасибо. Это работает только на странице отдельного события. Я не могу получить текущий тип записи на страницах списка категорий с помощью $query->get('post_type') и get_post_type().

@ShaikhAezaz если на страницах списка категорий вы хотите смешать типы записей event, venue и стандартные посты, скорее всего, вы не сможете сделать это трюк с помощью фильтра pre_get_post
. Если таксономия показывает только event и/или venue (и никакие другие типы записей), вы можете использовать is_tax('your_taxonomy')
чтобы добавить еще один фильтр. Ваша цель не совсем ясна, возможно, вы можете добавить больше деталей в вопрос.

У WordPress есть отличная страница о условных тегах
Вместе с !is_admin()
вам может понадобиться добавить && $query->is_main_query()
В начале вашей функции вы можете использовать if(is_single() || is_page()) {return;}
, если не хотите, чтобы фильтр применялся на этих страницах.
Другие условные теги, которые могут быть полезны: is_post_type_archive('event') && is_post_type_archive('venue')
Редактирование: Не уверен, что полностью понял вашу проблему, но теперь думаю, что это может вам помочь:
$query->set('post_type',array('event','venue'));

Привет offroff, я использовал код, который предложил G.M., и он работает для меня на страницах категорий и таксономий, но теперь я не могу получить тип записи на страницах категорий и таксономий. Ты знаешь какое-нибудь решение для этого?
