Группировка WP_Query по категориям в WordPress

27 дек. 2011 г., 07:57:18
Просмотры: 14.8K
Голосов: 5

OK, вот моя структура:

Пользовательский тип записи "issues" (для журнала) Записи с пользовательским метаполем, соответствующим ID записи соответствующего выпуска.

Когда я нахожусь на странице отдельного выпуска, я хочу получить все связанные записи и отобразить их сгруппированными по связанным категориям. У меня работает сам запрос записей, но я не могу разобраться с группировкой по категориям.

Вот мой запрос:

   <?php
    global $post;

    // Получаем записи по терминам произвольной таксономии для любого типа записи   
    $current    = get_the_ID($post->ID);
    $args = array(
        'post_type'         => 'post',
        'post_status'       => 'publish',
        'posts_per_page'    => -1,
        'orderby'           => 'title',
        'meta_key'          => '_rkv_issue_select',
        'meta_value'        => $current
    );

    $issue_cats = new WP_Query($args);

    if( $issue_cats->have_posts() ) :
    ?>
    <ul>
    <?php while ( $issue_cats->have_posts() ) : $issue_cats->the_post(); ?>

        <li><?php the_title(); ?></li>
    <?php endwhile; // конец цикла ?>
    <?php else : ?>
    <?php endif; // если есть записи ?>
    </ul>
    <?php wp_reset_query(); ?>
0
Все ответы на вопрос 1
4

Вы можете попробовать изменить WP_Query с помощью SQL-команды для группировки, но это немного выходит за рамки моих текущих знаний MySQL. Однако я всегда делал это, перебирая таксономию с помощью http://codex.wordpress.org/Function_Reference/get_categories

Вот пример кода:

<?php
    global $post;

    $current = get_the_ID($post->ID);
    $cargs = array(
        'child_of'      => 0, // Дочерние категории
        'orderby'       => 'name', // Сортировка по имени
        'order'         => 'ASC', // По возрастанию
        'hide_empty'    => 1, // Скрыть пустые
        'taxonomy'      => 'category', // Измените на нужную таксономию
    );
    foreach (get_categories($cargs) as $tax) :
        // Вывод записей по терминам для произвольной таксономии любого типа записи   
        $args = array(
            'post_type'         => 'post', // Тип записи
            'post_status'       => 'publish', // Только опубликованные
            'posts_per_page'    => -1, // Все записи
            'orderby'           => 'title', // Сортировка по заголовку
            'meta_key'          => '_rkv_issue_select', // Мета-ключ
            'meta_value'        => $current, // Текущее значение
            'tax_query' => array( // Запрос по таксономии
                array(
                    'taxonomy'  => 'category', // Таксономия
                    'field'     => 'slug', // Поле для сравнения
                    'terms'     => $tax->slug // Термины
                )
            )
        );
        if (get_posts($args)) : // Если есть записи
    ?>
        <h2><?php echo $tax->name; ?></h2> // Заголовок категории
        <ul>
            <?php foreach(get_posts($args) as $p) : ?> // Перебор записей
                <li><a href="<?php echo get_permalink($p); ?>"><?php echo $p->post_title; ?></a></li> // Ссылка на запись
            <?php endforeach; ?>
        </ul>
    <?php 
        endif;
    endforeach; 
?>

Этот код перебирает все категории с записями (hide_empty установлен в true) и выполняет get_posts для каждой (а также проверяет наличие записей перед выводом).

Я не был уверен, какой заголовок вы хотите использовать для разделения групп, поэтому использовал h2 и добавил ссылки на записи.

Я изменил WP_Query на get_posts, так как это более эффективно - не перезаписывает глобальную переменную $post (меньше запросов к базе данных, меньше необходимости в wp_reset_query()).

27 дек. 2011 г. 15:28:24
Комментарии

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

Maor Barazany Maor Barazany
6 окт. 2012 г. 20:09:16

Так какой же оптимальный подход, @MaorBarazany?

lkraav lkraav
26 янв. 2013 г. 04:02:27

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

Warface Warface
3 сент. 2013 г. 17:38:57

Это сработало для меня. Кэширование может помочь, если производительность страдает из-за слишком большого количества запросов.

squarecandy squarecandy
23 дек. 2016 г. 02:20:02