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

25 сент. 2012 г., 17:24:45
Просмотры: 137K
Голосов: 33

Есть ли способ вывести список всех записей определенного произвольного типа записей и упорядочить их по прикрепленным к ним терминам произвольной таксономии?

Например:

Термин таксономии #1
Тип записи
Тип записи
Тип записи

Термин таксономии #2
Тип записи
Тип записи

Буду благодарен за любую помощь.

Спасибо.

0
Все ответы на вопрос 5
3
68

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

$custom_terms = get_terms('custom_taxonomy');

foreach($custom_terms as $custom_term) {
    wp_reset_query();
    $args = array('post_type' => 'custom_post_type',
        'tax_query' => array(
            array(
                'taxonomy' => 'custom_taxonomy',
                'field' => 'slug',
                'terms' => $custom_term->slug,
            ),
        ),
     );

     $loop = new WP_Query($args);
     if($loop->have_posts()) {
        echo '<h2>'.$custom_term->name.'</h2>';

        while($loop->have_posts()) : $loop->the_post();
            echo '<a href="'.get_permalink().'">'.get_the_title().'</a><br>';
        endwhile;
     }
}

Мы получаем все элементы таксономии, перебираем их и выводим заголовок со ссылкой на каждый пост, принадлежащий этому элементу. Если вам нужно изменить порядок элементов таксономии, это можно легко сделать с помощью плагина. Например, Reorder Taxonomy. Но обратите внимание, что этот плагин добавляет(!) еще один столбец в вашу таблицу при активации и не удаляет его при деактивации!

25 сент. 2012 г. 19:10:39
Комментарии

Привет @GhostToast, это работает отлично. У меня есть конкретный вопрос: как можно отфильтровать по таксономии? У меня есть теннис, гольф, футбол, волейбол. Этот код выводит все таксономии с их записями, где отмечена таксономия. Как можно отфильтровать, чтобы показывались только записи с таксономией "Футбол"?

Rodrigo Zuluaga Rodrigo Zuluaga
7 мар. 2017 г. 16:00:57

@RodrigoZuluaga тогда это будет простой одиночный запрос. Уберите $custom_terms и цикл foreach(), а просто вручную задайте 'terms', указав slug или что вам нужно.

GhostToast GhostToast
7 мар. 2017 г. 20:04:35

Я сделал немного по-другому, но твой код очень помог: $args = array('post_type' => 'publica', 'tax_query' => array( array( 'taxonomy' => 'comision-publicaciones', 'field' => 'name', 'terms' => array($ter_name) ), ), );

Rodrigo Zuluaga Rodrigo Zuluaga
8 мар. 2017 г. 05:43:41
0

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

<?php

// Первый запрос для постов, соответствующих term1
$args = array(
    'tax_query' => array(
        array(
            'taxonomy' => 'taxonomy_1',
            'field' => 'slug',
            'terms' => array( 'term1' )
        ),
    ),
    'post_type' => 'my-post-type'
);
$query = new WP_Query( $args );

if ( have_posts() ) {

    $term = $query->queried_object;

    echo 'Все найденные записи в категории ' . $term->name;

    while ( have_posts() ) : the_post();
        // Выводим нужные данные
        the_title();
        the_content();
    endwhile;
}

// СБРАСЫВАЕМ ПЕРЕМЕННЫЕ ЗАПРОСА
wp_reset_query();

// Второй запрос для term2
$args = array(
    'tax_query' => array(
        array(
            'taxonomy' => 'taxonomy_1',
            'field' => 'slug',
            'terms' => array( 'term2' )
        ),
    ),
    'post_type' => 'my-post-type'
);
$query = new WP_Query( $args );

if ( have_posts() ) {

    $term = $query->queried_object;

    echo 'Все найденные записи в категории ' . $term->name;

    while ( have_posts() ) : the_post();
        // Выводим нужные данные
        the_title();
        the_content();
    endwhile;
}
25 сент. 2012 г. 18:55:17
0

Отлично! Решение GhostOne было именно тем, что я искал. В моем случае пользовательский тип записи был 'minining_accidents', а связанные с ним пользовательские таксономии - 'accident-types', содержащие несколько терминов. Моей идеей было создать пользовательский виджет для отображения списка записей по терминам в этих таксономиях. В тестовом запуске я получил желаемый результат. Остальное - доводка. Вот мой код:

function fn_get_list_of_mining_accident_types()
{
    $custom_taxonomy='accident-types';  
    $custom_terms = get_terms($custom_taxonomy);    
    $str_return='<ul>';
    foreach($custom_terms as $custom_term) 
    {
        wp_reset_query();
        $args = array(
            'post_type' => 'minining_accidents',
            'tax_query' => array(               
                array(
                    'taxonomy' => $custom_taxonomy,
                    'field' => 'slug',
                    'terms' => $custom_term->slug,
                ),
            ),
        );  

        $loop = new WP_Query($args);

        $term_name=$custom_term->name;
        $term_slug=$custom_term->slug;
        $term_link=get_term_link($term_slug, $custom_taxonomy);

        $str_return.='<li><a href="'.$term_link.'">'.$term_name.'</a>';

        if($loop->have_posts()) 
        {
            $str_return.='<ol>';

            while($loop->have_posts()) : $loop->the_post();
                $str_return.='<li><a href="'.get_permalink().'">'.get_the_title().'</a></li> ';
            endwhile;

            $str_return.='</ol>';           
         }
         $str_return.='</li>';
    }
    $str_return.='</ul>';
    return $str_return;
}

Да! Всегда есть возможность дальнейшего улучшения кода.

10 июл. 2014 г. 15:16:29
1

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

        <?php
    // Получаем список всех терминов таксономии  -- Проще говоря, заголовки категорий
    $args = array(
                'taxonomy' => 'project_category',
                'orderby' => 'name',
                'order'   => 'ASC'
            );
    $cats = get_categories($args);

    // Для каждого термина таксономии получаем записи по term_id
    foreach($cats as $cat) {
        ?>
        <a href="<?php echo get_category_link( $cat->term_id ) ?>">
            <?php echo $cat->name; ?> <br>
            <?php // echo $cat->term_id; ?> <br>
        </a>


            <?php
                // Аргументы запроса
                $args = array(
                    'post_type' => 'portfolio', // тип записи
                    'tax_query' => array(
                        array(
                            'taxonomy' => 'project_category', // пользовательская таксономия
                            'field'    => 'term_id',          // term_id, slug или name (определяет по чему искать указанный ниже термин)    
                            'terms'    => $cat->term_id,      // передаем ID термина
                        ),
                    ),
                );

                // Запрос
                $the_query = new WP_Query( $args );

                // Цикл
                if ( $the_query->have_posts() ) {
                    echo '<h2> Список записей с этим тегом </h2>';

                    echo '<ul>';
                    $html_list_items = '';
                    while ( $the_query->have_posts() ) {
                        $the_query->the_post();
                        $html_list_items .= '<li>';
                        $html_list_items .= '<a href="' . get_permalink() . '">';
                        $html_list_items .= get_the_title();
                        $html_list_items .= '</a>';
                        $html_list_items .= '</li>';
                    }
                    echo $html_list_items;
                    echo '</ul>';

                } else {
                    // записей не найдено
                }

                wp_reset_postdata(); // сброс глобальной переменной $post;

                ?>

    <?php } ?>
14 июн. 2020 г. 15:38:02
Комментарии

О боже, спасибо! Надо было сначала попробовать это.

Mike Mike
15 сент. 2021 г. 13:29:46
0
-1

Для отображения списка записей из пользовательской таксономии

$args = array(
    'tax_query' => array(
        array(
            'taxonomy' => 'your-custom-taxonomy', // Ваша пользовательская таксономия
            'field' => 'slug', // Поле для поиска (слаг)
            'terms' => array( 'your-term' ) // Термин таксономии
        ),
    ),
    'post_type' => 'your-post-type' // Тип записи
);
$loop = new WP_Query($args);
     if($loop->have_posts()) {
    $term = $wp_query->queried_object;
     while($loop->have_posts()) : $loop->the_post();
        // Вывод данных       
   echo '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
      endwhile;
}

Заголовок

  • Элемент списка
  • Элемент списка
  • Элемент списка
29 июл. 2014 г. 08:58:25