Intereting Posts
получить функцию атрибута откуда этот $ post_id? Ошибка при добавлении метабоксов, но только при добавлении 3 с тем же обратным вызовом Создайте фид статей из других источников Безопасно ли использовать редактор файлов для настройки? Как отображать и использовать все существующие теги на моей панели «post-at-front-panel»? мета-окно на новой странице администратора Как остановить отображение меню на статической домашней странице Как изменить URL логотипа входа и заголовок? Плагин списка рассылки WordPress работает в фоновом режиме Показать персонализированную категорию сообщений для отдельной записи Где я должен добавить необходимый код для добавления дополнительного атрибута в массив тегов kses? URL-адрес плагина префикс для размещения постоянных ссылок без влияния на категорию permas Metabox сохраняет зачистки частей короткого кода

Исключить подкатегорию из wp_query

У меня есть простая петля, которая проходит через категорию street-style :

 $street_style_tags = array( 'category_name' => 'street-style', 'posts_per_page' => 25, 'post_type' => 'post', 'post_status' => 'publish', 'orderby' => 'date', 'order' => 'DESC' ); 

Тем не менее, он появляется в цикле в другом месте на сайте (из-за его родительской категории). Есть ли способ исключить street-style из любого другого цикла на сайте, кроме этого?

Это довольно легко. WP_Query имеет разные аргументы, которые можно использовать для исключения категории. (Небольшой) проблематичной частью является то, как исключить эту категорию из всех циклов, будучи в состоянии все еще напрямую запрашивать ее.

Вы можете использовать 'pre_get_post' action hook, проверить аргумент 'category_name' текущего запроса, и если он отличается от 'street-style' , исключите его с помощью аргумента WP_Query 'category__not_in' .

Если вы не проверяете is_main_query() он будет применяться ко всем запросам, основным и is_main_query() .

Чтобы не использовать аргумент 'category__not_in' в своем пользовательском запросе, вы также должны проверить, установлен ли этот параметр, и если так объединить фактический аргумент с той, которая включена в категорию «уличный стиль».

Возможно, код чище, чем слова:

 add_action('pre_get_posts', function($query) { if ( is_admin() ) return; if ( $query->get('category_name') !== 'street-style' ) { $not_now = $query->get('category__not_in') ? : array(); $street_style = get_term_by('slug', 'street-style', 'category'); if ( is_object($street_style) && isset($street_style->term_id) ) { $query->set('category__not_in', array_merge($not_now, $street_style->term_id ) ); } } }); 

Используя этот код, вы сможете получать сообщения в категории «уличный стиль», явно указывая 'category_name' на «street-style», как и код OP.

Обратите внимание, что для моего кода требуется PHP 5.3 или новее.

Если вы хотите глобально исключить категорию, добавьте фильтр на pre_get_posts .

 function exclude_cat_wpse_136798($qry) { $qry->set('category__not_in',array(1)); } add_action('pre_get_posts','exclude_cat_wpse_136798'); 

Это применимо к каждому запросу на сайте, который, как я подозреваю, вызовет проблемы. Я не знаю, какие условия применять. Ваш вопрос не дает достаточно подробностей. Однако, чтобы сделать этот один запрос, просто удалите запрос заранее и верните его потом

 remove_action('pre_get_posts','exclude_cat_wpse_136798'); // your query add_action('pre_get_posts','exclude_cat_wpse_136798'); 

В ваших запросах для других циклов вы можете использовать

 'category__not_in' => array( get_cat_ID('street-style') ) 

в ваших параметрах запроса.

Кроме того, в тех же циклах, где вы не хотите, чтобы эти сообщения отображались, вы можете использовать

 if ( in_category('street-style') ) continue; 

чтобы пропустить этот конкретный пост в вашем цикле. Однако это, скорее всего, сбросит счетчик количества сообщений, которые вы ожидаете получить из своего цикла.