Исключить категорию из цикла WordPress
У меня есть этот код для цикла, и мне нужно исключить категорию 4
из этого цикла. Есть ли предложения, как это сделать?
Код, который запускает цикл
<?php if(have_posts()): ?>
<ol class="item_lists">
<?php
// Массив для определения конечных элементов
$end = array(3,6,9,12,15,18,21,24,27,30,33,36,39,42,45);
$i = 0;
while (have_posts()) : the_post();
$i++;
global $post;
?>
Вы можете использовать wp_parse_args() для объединения ваших аргументов с запросом по умолчанию
// Определяем аргументы запроса по умолчанию
global $wp_query;
$defaults = $wp_query->query_vars;
// Ваши пользовательские аргументы
$args = array('cat'=>-4);
// Объединяем аргументы по умолчанию с вашими
$args = wp_parse_args( $args, $defaults );
// Запрашиваем посты на основе объединенных аргументов
query_posts($args);
хотя, я считаю, что более элегантным решением будет использование действия pre_get_posts(). Оно изменяет запрос до его выполнения, что позволяет избежать двойного выполнения запроса.
Посмотрите:
http://codex.wordpress.org/Custom_Queries#Category_Exclusion
На основе этого примера, чтобы исключить рубрику 4 из главной страницы, добавьте это в ваш functions.php:
add_action('pre_get_posts', 'wpa_44672' );
function wpa_44672( $wp_query ) {
//$wp_query передается по ссылке. Нам не нужно ничего возвращать. Любые изменения, сделанные внутри этой функции, автоматически повлияют на глобальную переменную
$excluded = array(4); //сделано массивом на случай, если нужно исключить несколько рубрик
// исключаем только на главной странице
if( is_home() ) {
set_query_var('category__not_in', $excluded);
//что является более элегантным способом записи:
//$wp_query->set('category__not_in', $excluded);
}
}

Проголосуйте за Helga, так как она первой упомянула pre_get_posts.

вместо 'category__not_in' или 'category__in' можно использовать 'cat' со строковым значением, например '2,-4'
. Таким образом будут включены/исключены не только указанные категории, но и их дочерние элементы.

Мадам, вы совершили ужасное преступление. Вам должно быть стыдно! Имя функции "wpa_44672"? Серьёзно? :P

Из вашего файла functions.php
function remove_home_category( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'cat', '-4' );
}
}
add_action( 'pre_get_posts', 'remove_home_category' );
Этот код изменяет запрос до его выполнения, поэтому это наиболее эффективный хук для модификации цикла в данном случае.

Перед строкой
<?php if(have_posts()): ?>
Вставьте что-то вроде этого
<?php query_posts($query_string . '&cat=-4'); ?>
Это исключает категорию с ID 4. Как показано здесь

На самом деле он удаляет записи из этой категории, но это своего рода портфолио на странице пользователя, и теперь пагинация не работает на 3 странице.

У меня также есть это кастомное правило в theme_setup.php: $newrules["user/({$author->nicename})/(portfolio)/?$"] = 'index.php?author_name=$matches[1]&baction=$matches[2]'; $newrules["user/({$author->nicename})/(portfolio)/page/?([0-9]+)/?$"] = 'index.php?author_name=$matches[1]&baction=$matches[2]&paged=$matches[3]';
