Сортировка записей по названию пользовательской таксономии

15 окт. 2012 г., 21:09:55
Просмотры: 18.8K
Голосов: 2

Возможно ли сортировать записи (произвольного типа) по категории/таксономии (по названию, по убыванию)?

Например, мои категории:

  • Сезон 2012
    • какая-то запись
    • какая-то запись
    • какая-то запись
  • Сезон 2011
    • какая-то запись
    • какая-то запись
    • какая-то запись
  • Сезон 2010
  • и так далее..
0
Все ответы на вопрос 3
4
11

Одно из решений:

// Получаем все термины таксономии
$terms = get_terms('taxonomy-name');
// Перебираем каждый термин
foreach($terms as $term) {
    // Получаем все записи для текущего термина
    $posts = get_posts(array(
            'post_type' => 'custom_post_type_name', // Тип записи
            'tax_query' => array( // Запрос по таксономии
                array(
                    'taxonomy' => 'taxonomy-name', // Название таксономии
                    'field' => 'slug', // Поле для сопоставления (слаг)
                    'terms' => $term->slug // Слаг текущего термина
                )
            ),
            'numberposts' => -1 // Получить все записи
        ));
    // Перебираем все найденные записи
    foreach($posts as $post) {
        // Здесь можно выполнить нужные действия с записями
    }
}
15 окт. 2012 г. 21:24:18
Комментарии

Хороший ответ, хотя вам стоит следить за отступами ;)

kovshenin kovshenin
15 окт. 2012 г. 21:59:06

Вы правы, в будущем буду внимательнее. Отредактировал ответ выше

Mridul Aggarwal Mridul Aggarwal
15 окт. 2012 г. 22:07:11

Есть ли способ отсортировать foreach $term->name по убыванию (DESC)?

Iladarsda Iladarsda
15 окт. 2012 г. 22:11:32

да, есть. Измените первую строку на - $terms = get_terms('taxonomy-name', array('order' => 'DESC')); Полную документацию смотрите на этой странице кодекса - http://codex.wordpress.org/Function_Reference/get_terms

Mridul Aggarwal Mridul Aggarwal
15 окт. 2012 г. 22:17:00
0

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

Вы также можете немного адаптировать (превосходное) решение Mridul, если хотите, чтобы это работало на странице архива для таксономии. Другими словами, вы можете сортировать архив произвольной таксономии по другой таксономии с помощью этого решения.

Я делюсь этим, потому что сегодня потратил четыре часа на борьбу с этой проблемой, и если кто-то ещё пытается создать архив произвольной таксономии, отсортированный по другой таксономии, вот как это можно сделать. (Кстати, это мой первый ответ на StackExchange — пожалуйста, будьте снисходительны! :))

Начинается всё точно так же, как в решении Mridul. Сначала запрашиваем таксономию, по которой хотим сортировать записи.

$terms = get_terms( array(
    'taxonomy' => 'custom_taxonomy_one',
    'parent' => 0, // Это помогло мне избежать повторяющихся таксономий; возможно, вам это не нужно
) );

foreach($terms as $term) {
    echo '<h2>' . $term->name . '</h2>'; // Выводим название термина

Здесь начинаются отличия от ответа Mridul. Нам нужно запросить две таксономии и убедиться, что отношение между ними установлено как "AND", что означает, что перечисленные записи соответствуют критериям обеих таксономий.

В данном случае записи в "custom_post_type" должны соответствовать слагу первого термина и названию другого. Надеюсь, код будет понятен всем!

    $posts = get_posts(array(
            'post_type' => 'custom_post_type', // Получаем записи из произвольного типа записей
            'tax_query' => array(
                'relation' => 'AND', // записи должны соответствовать обеим таксономиям
                array(
                    'taxonomy' => 'custom_taxonomy_one',
                    'field' => 'slug',
                    'terms' => $term->slug // соответствие слагу термина из предыдущего массива
                ),
                array(
                    'taxonomy' => 'custom_taxonomy_two',
                    'field' => 'slug',
                    'terms' => 'custom_taxonomy_two_term_name'
                )
            ),
            'numberposts' => -1
        ));
    foreach($posts as $post) {
       // Делаем что нужно
    }
}
13 авг. 2016 г. 03:33:43
1

Альтернативный цикл, где tax = category и пользовательский post type = "results"

$args = array( 'taxonomy' => 'category' );
$terms = get_terms( 'category', $args);

//НАЧАЛО ЦИКЛА FOREACH
foreach ($terms as $term) {

            $post_type = 'results';
            $tax = 'category';
            $tax_terms = get_terms( $tax );
            if ($tax_terms) {
                foreach ($tax_terms  as $tax_term) {
                $args = array(
                    'post_type' => $post_type,
                    "$tax" => $tax_term->slug,
                    'post_status' => 'publish',
                    'posts_per_page' => -1,
                    'caller_get_posts'=> 1
                );



                $my_query = null;
                $my_query = new WP_Query($args);

                if( $my_query->have_posts() ) : ?>

                        // ЦИКЛ WHILE
                        <?php while ( $my_query->have_posts() ) : $my_query->the_post(); ?>

                        // Выполнить действия

                        <?php endwhile; ?>
                        // КОНЕЦ ЦИКЛА WHILE


                <?php else : ?>
    <?php endif; wp_reset_query(); ?>

}
// КОНЕЦ ЦИКЛА FOREACH
15 окт. 2012 г. 21:45:48
Комментарии

"caller_get_posts" устарел, кстати. Используйте "ignore_sticky_posts" Источник - http://codex.wordpress.org/Class_Reference/WP_Query#Sticky_Post_Parameters

Mridul Aggarwal Mridul Aggarwal
15 окт. 2012 г. 22:02:15