joanfust
  • 0
Новичок

Как отфильтровать сообщения из категорий, только если сообщения появляются в одной из них, а не в другой?

  • 0

Сценарий таков, некоторые посты имеют одну категорию, хорошо. Некоторые другие имеют более одной категории. Я должен создать пост с содержимым, а также миниатюры слайд-шоу для использования с галереей плагинов Nivo. Ok.

Я хочу отфильтровать все сообщения в категории «слайд-шоу» на индексных страницах, поэтому я использую простой

query_posts($query_string. ‘&cat=-1,-36’);

Категория № 1 — «Не определено», а № 36 — «Слайд-шоу». Ok. Но… У меня есть несколько постов в другой категории, скажем, под номером 50, «Приложения», и я хочу показать эти посты, несмотря на то, что они тоже в категории «Слайд-шоу».

Я не могу найти способ сказать WP «покажи мне сообщения, кроме тех, что в категориях 1 и 36, но покажи мне их, если у них больше категорий».

Погуглив и прочитав массу документов и страниц, я не нашел способа узнать количество категорий по сообщениям (а не количество сообщений по категориям), возможно, для создания запроса типа «покажи мне это, отфильтруй это, ЗА ИСКЛЮЧЕНИЕМ, если количество (категории мой пост присутствует) > 2 ).

Некоторые идеи?

Спасибо!

Share
  1. Я думаю, что ваша логика слишком сложна. Настройка query_posts() — это, по сути, настройка запроса MySQL для базы данных. Ни в коем случае запрос не сможет легко подсчитать количество назначенных категорий на лету и выполнить условия против этого.

    Давайте перевернем ваше состояние. Вместо постов, которые не относятся только к категории слайд-шоу, мы можем делать гораздо более простые посты, принадлежащие к любой категории, кроме слайд-шоу.

    Попробуй это:

    $categories = get_categories( array( 'exclude' => '1,36' ) );
    $include = array();
    
    foreach ( $categories as $category )
        $include[] = $category->term_id;
    
    query_posts( array( 'category__in' => $include ) );
    

    PS Я бы рассмотрел другой способ пометить посты для слайд-шоу (например, метаполе) и вообще не смешивать его с категориями.

    • 0
  2. так что вам нужен цикл, который будет отображать сообщения, которые находятся в категории 50, но не в категории 36?

    Не пробовал, но не могли бы вы сделать что-то вроде:

    query_posts($query_string . '&cat=50,-36');
    

    В противном случае вам понадобятся все идентификаторы сообщений из категории, которую вы хотите исключить:

    $excluded_category = WP_Query($query_string . '&cat=36');
    //array of just the post info
    $excluded_posts = $excluded_category->posts;//might be 'post', and not 'posts'??
    //get just the ID's of the post into an array
    foreach ($excluded_posts as $post){
        $excluded_post_ids[] = $post->id;
    }
    //query for required category
    $required_category = WP_Query($query_string . '&cat=50');
    
    //start the loop
    if($required_category->have_posts()):while ($required_category->have_posts()): $required_category->thepost();?>
    
    //filter out unwanted category
    if (!in_array(get_the_ID(),$excluded_post_ids):
    
    
    //your loop here
    
    
    endif;
    endwhile;
    endif;
    

    это из памяти, поэтому может потребоваться некоторая отладка.

    • 0
  3. Другим методом было бы просто использовать пользовательские типы сообщений, а не стандартные сообщения. Вы можете использовать таксономии для соединения разных типов записей, когда это необходимо.

    • 0
  4. Чтобы основываться на последнем комментарии Рарста, ваши посты в слайд-шоу просто должны принадлежать к одной категории (или вообще не принадлежать к ним), и вы должны создать настраиваемое поле и настраиваемое значение для постов, которые должны быть включены в слайд-шоу. Затем используйте «meta_key» и «meta_value» в вызове query_posts().

    query_posts('meta_key=includeInSlideshow&meta_value=true');
    

    В этом примере вы создаете настраиваемое поле с именем «includeInSlideshow» и пишете «true» в текстовом поле значения в области записи сообщения.

    Вы можете позволить стандартному запросу WP заполнить Цикл на странице вашего индекса как обычно.

    • 0

Оставить ответ

You must login to add an answer.