Предотвращение фильтра pre_get_posts для определенного типа записи

15 февр. 2014 г., 18:00:18
Просмотры: 48.1K
Голосов: 8

У меня возникла проблема с фильтром 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

0
Все ответы на вопрос 2
3
21

Улучшите ваше условие, добавив проверку типа запрашиваемой записи. Это можно сделать с помощью метода 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;
}
15 февр. 2014 г. 21:25:39
Комментарии

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

Shaikh Aezaz Shaikh Aezaz
16 февр. 2014 г. 09:42:33

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

gmazzap gmazzap
16 февр. 2014 г. 19:38:58

G.M. Да, у меня есть и другие пользовательские типы записей. И я добавил мета-поле city только к event и place, но не к другим записям. Поэтому мне нужен фильтр, который возвращает текущий тип записи.

Shaikh Aezaz Shaikh Aezaz
17 февр. 2014 г. 19:48:09
2

У 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'));
15 февр. 2014 г. 18:18:23
Комментарии

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

Shaikh Aezaz Shaikh Aezaz
16 февр. 2014 г. 11:47:26

Возможно, тебе нужно установить тип записи, например if(is_category()) {$query->set('post_type',array('event','venue')); }. Сложно сказать, как решить твою проблему, потому что мы не знаем, какие шаблоны ты используешь.

offroff offroff
16 февр. 2014 г. 12:44:19