Список всех записей в произвольном типе записей по таксономии
Есть ли способ вывести список всех записей определенного произвольного типа записей и упорядочить их по прикрепленным к ним терминам произвольной таксономии?
Например:
Термин таксономии #1
Тип записи
Тип записи
Тип записи
Термин таксономии #2
Тип записи
Тип записи
Буду благодарен за любую помощь.
Спасибо.

Попробуйте это
$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. Но обратите внимание, что этот плагин добавляет(!) еще один столбец в вашу таблицу при активации и не удаляет его при деактивации!

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

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

Не самое изящное решение, но вы можете создать несколько запросов - каждый для конкретных терминов, а затем вывести их. Надеюсь, кто-то предложит более элегантный способ автоматического получения терминов для модификации вывода/сортировки. Но этот вариант поможет вам начать.
<?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;
}

Отлично! Решение 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;
}
Да! Всегда есть возможность дальнейшего улучшения кода.

Это длинное решение, которое я пробовал до того, как нашел эту ветку. Надеюсь, оно поможет кому-то лучше разобраться.
<?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 } ?>

Для отображения списка записей из пользовательской таксономии
$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;
}
Заголовок
- Элемент списка
- Элемент списка
- Элемент списка
