2015-05-21 2 views
1

У меня есть два пользовательских типа сообщений, например «Автомобили» и «Велосипеды». Я использовал категорию по умолчанию Wordpress для категоризации сообщений из двух типов сообщений. Скажем, например, категории «Красный», «Синий» и «Черный».Wordpress: Сегрегация пользовательского типа сообщений на странице категории

То, что я пытаюсь достичь здесь, заключается в том, что когда я перехожу на страницу категории «Красный», я хочу увидеть «Автомобили» и «Велосипеды», которые классифицируются под «Красным». Я использую category.php и это вопрос, который я пытаюсь запустить:

$car_args = array(
        'posts_per_page' => -1, 
        'orderby'   => 'date', 
        'order'   => 'DESC', 
        'post_type'  => 'cars', 
        'post_status'  => 'publish', 
        'cat'    => $cat 
       ); 

       // The Query 
       $car_query = new WP_Query($car_args); 

       // The Loop 
       if ($car_query ->have_posts()) { 
       echo "<h3>Cars</h3>"; 
        while ($car_query->have_posts()) { 
         $car_query->the_post(); 
         echo get_post_type() . '<a href="'. get_permalink() .'">' . get_the_title() . '</a><br />'; 
        } 
       } else { 
        // no posts found 
       } 

$bikes_args = array(
        'posts_per_page' => -1, 
        'orderby'   => 'date', 
        'order'   => 'DESC', 
        'post_type'  => 'bikes', 
        'post_status'  => 'publish', 
        'cat'    => $cat 
       ); 

       // The Query 
       $bikes_query = new WP_Query($bikes_args); 

       // The Loop 
       if ($bikes_query ->have_posts()) { 
       echo "<h3>Bikes</h3>"; 
        while ($bikes_query->have_posts()) { 
         $bikes_query->the_post(); 
         echo get_post_type() . '<a href="'. get_permalink() .'">' . get_the_title() . '</a><br />'; 
        } 
       } else { 
        // no posts found 
       } 

       /* Restore original Post Data */ 
       wp_reset_postdata(); 

в $ кот в запросе получает категорию идентификатор категории «Red». Оба эти запроса правильно ограничивают сообщения по категории «Красный», но сообщения из типа сообщений «Автомобили» и типа «Велосипеды» отображаются, хотя я пытался ограничить тип сообщения. Я читал в нескольких статьях, что Wordpress игнорирует args типа post на странице категории. Это правда, и если это так, есть ли обходной путь для этого?

+0

высадить вас на заказ запрос, вернитесь к циклу по умолчанию, а затем используйте 'pre_get_posts', чтобы установить свой тип сообщения и пользовательские сообщения на страницу на страницу архива категории. –

+0

Hi @PieterGoosen. Спасибо, попробуем это. Но если я сделаю это так, должен ли я иметь категорию {color} .php для каждого цвета, который у меня есть в категориях? – NJT

+0

Нет, только один categoty.php будет хорошо –

ответ

1

То, что вы пытаетесь сделать, возможно только с одним запросом и только с основным запросом без каких-либо пользовательских запросов.

Прежде всего, сначала добавьте свои пользовательские типы сообщений на свою страницу категории. По умолчанию пользовательские типы пиков исключаются из страниц категорий. Поэтому нам нужно добавить это вручную к основным аргументам запроса через pre_get_posts. Добавьте следующие строки в functions.php: (РИСКОВАННЫХ: Непроверено, а также требует PHP 5.3+)

add_action('pre_get_posts', function ($q) 
{ 
    if (!is_admin() && $q->is_main_query() && $q->is_category()) { 
     $q->set('post_type', array('post', 'cars', 'bikes')); // Change this according to your post types 
     $q->set('nopaging', true); // This will get all posts, same as posts_per_page=-1 
    } 
}); 

Теперь вы должны иметь все сообщения от кликнутой категории Вашего набора типов сообщения в вашей категории страницах.

Далее, мы должны отсортировать ваши петли. Удалите все ваши пользовательские запросы в category.php и замените его циклом по умолчанию. Как вы хотели бы два блока, заказанный после типа, мы будем использовать rewind_posts() таким образом, мы можем запустить цикл дважды

if (have_posts()) { 
    while (have_posts()) { 
    the_post(); 

     if ($post->post_type == 'cars') { //Change accordingly to only show cars in this loop 

      // Your loop 

     } 
    } 

    rewind_posts(); 

    while (have_posts()) { 
    the_post(); 

     if ($post->post_type == 'bikes') { // Change accordingly to only show bikes 

      // Your loop 

     } 
    } 
} 

Это теперь должно отображать свои сообщения в два блока сортируются по типу записи

+0

Вы, сэр, вы гений. : D Первоначальное тестирование показывает, что это именно то, что я пытаюсь сделать. Еще раз спасибо. :) – NJT

+0

Мое удовольствие, рад, что это сработало для вас. Наслаждайтесь :-) –

+0

Привет @Pieter Goosen, я до сих пор использую это в своем проекте и отлично работаю. Теперь я пытаюсь добавить параметр таксономии в if ($ post-> post_type == 'bikes'), но не добился успеха. Сможете ли вы помочь? – NJT

Смежные вопросы