Исключить категорию из цикла WordPress

7 мар. 2012 г., 01:37:35
Просмотры: 28K
Голосов: 6

У меня есть этот код для цикла, и мне нужно исключить категорию 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;
 ?>
0
Все ответы на вопрос 4
4
13

Вы можете использовать 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);
    }
}
7 мар. 2012 г. 08:15:58
Комментарии

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

Brad Dalton Brad Dalton
4 сент. 2014 г. 08:33:01

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

honk31 honk31
6 июн. 2019 г. 17:01:40

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

Ares Ares
26 апр. 2020 г. 00:42:53

Ты правда троллишь в посте восьмилетней давности, чтобы поиздеваться над тем, что я использовал уникальное имя функции с почти нулевой вероятностью конфликта?

helgatheviking helgatheviking
27 апр. 2020 г. 17:18:08
0

Из вашего файла 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' );

Этот код изменяет запрос до его выполнения, поэтому это наиболее эффективный хук для модификации цикла в данном случае.

3 сент. 2014 г. 18:56:52
3

Перед строкой

<?php if(have_posts()): ?>

Вставьте что-то вроде этого

<?php query_posts($query_string . '&cat=-4'); ?>

Это исключает категорию с ID 4. Как показано здесь

7 мар. 2012 г. 01:46:37
Комментарии

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

jimilesku jimilesku
7 мар. 2012 г. 01:50:46

У меня также есть это кастомное правило в 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]';

jimilesku jimilesku
7 мар. 2012 г. 01:51:00

Пагинация отображается, и я могу по ней кликать, но на 2 странице те же записи, что и на 1 странице, а 3 страница показывает ошибку 404? Пожалуйста, помогите :)

jimilesku jimilesku
7 мар. 2012 г. 02:05:11
0

Адам прав. Кроме того, для того чтобы пагинация работала, вам нужно иметь что-то вроде этого:

<?php query_posts('post_type=post&paged='.$paged.'&cat=-4');  ?>
7 мар. 2012 г. 04:39:20