У меня есть простая петля, которая проходит через категорию 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;
чтобы пропустить этот конкретный пост в вашем цикле. Однако это, скорее всего, сбросит счетчик количества сообщений, которые вы ожидаете получить из своего цикла.