Как запросить произвольный тип записи с произвольной таксономией?
Мне нужно получить любые записи, используя произвольную таксономию.
$args = array(
'post_type' => 'adverts',
'advert_tag' => 'politics' // Не работает.
);
query_posts($args);
while ( have_posts() ) : the_post();
//Показать записи
endwhile;
Объявление таксономии:
add_action( 'init', 'add_custom_taxonomy', 0 );
function add_custom_taxonomy() {
register_taxonomy('advert_tag', 'Adverts',
array(
'hierarchical' => true,
'labels' => array(
'name' => _x( 'Рекламные метки', 'общее название таксономии' ),
'singular_name' => _x( 'Рекламная метка', 'единственное число таксономии' ),
'search_items' => __( 'Поиск рекламных меток' ),
'all_items' => __( 'Все рекламные метки' ),
'parent_item' => __( 'Родительская рекламная метка' ),
'parent_item_colon' => __( 'Родительская рекламная метка:' ),
'edit_item' => __( 'Редактировать рекламную метку' ),
'update_item' => __( 'Обновить рекламную метку' ),
'add_new_item' => __( 'Добавить новую рекламную метку' ),
'new_item_name' => __( 'Название новой рекламной метки' ),
'menu_name' => __( 'Рекламные метки' ),
),
'rewrite' => array(
'slug' => 'advert-tags',
'with_front' => false,
'hierarchical' => true
),
);
}
Объявление произвольного типа записи:
add_action( 'init', 'create_post_type' );
function create_post_type() {
register_post_type( 'Adverts',
array(
'labels' => array(
'name' => __( 'Реклама' ),
'singular_name' => __( 'Реклама' ),
'add_new' => __( 'Добавить новую' ),
'add_new_item' => __( 'Добавить новую рекламу' ),
'edit' => __( 'Редактировать' ),
'edit_item' => __( 'Редактировать рекламу' ),
'new_item' => __( 'Новая реклама' ),
'view' => __( 'Просмотр' ),
'view_item' => __( 'Просмотр рекламы' ),
'search_items' => __( 'Поиск рекламы' ),
'not_found' => __( 'Реклама не найдена' ),
'not_found_in_trash' => __( 'В корзине реклама не найдена' ),
),
'supports' => array(
'title',
'thumbnail',
),
'has_archive' => true,
'menu_position' => 10,
'public' => true,
'rewrite' => array(
'slug' => 'adverts'
),
'taxonomies' => array('advert_tag')
)
);
}
Прежде всего никогда не используйте query_posts()
, подробнее об этом можно прочитать здесь: Когда следует использовать WP_Query, query_posts() или get_posts()?.
Вам нужно использовать WP_Query
для получения необходимых записей. Прочтите документацию. В вашем случае запрос может выглядеть так:
$the_query = new WP_Query( array(
'post_type' => 'Adverts',
'tax_query' => array(
array (
'taxonomy' => 'advert_tag',
'field' => 'slug',
'terms' => 'politics',
)
),
) );
while ( $the_query->have_posts() ) :
$the_query->the_post();
// Отображение записей ...
endwhile;
/* Восстановление исходных данных записи
* Примечание: Поскольку мы используем новый WP_Query,
* мы не перезаписываем оригинальный $wp_query и его не нужно сбрасывать.
*/
wp_reset_postdata();

Только что заметил, что он, похоже, извлекает все записи с пользовательским типом записи 'Adverts'. Однако это, кажется, решает задачу:
$the_query = new WP_Query( array( 'post_type' => 'Adverts', 'advert_tag' => 'politics' ));

@Stephen {tax} был признан устаревшим начиная с версии 3.1 в пользу {tax_query}, и был введен {tax_query}. Это все еще работает, но мы не должны использовать устаревшие функции.
tax_query используется с массивом запросов таксономии. Я работал с пользовательским типом записей FAQ, и это работало для меня практически так же, как аргумент слага таксономии {tax} в WP_Query.

Я использую этот запрос для получения пользовательских записей (FAQ записей) с их пользовательской таксономией (faq_category). Поскольку параметр {taxonomy} в аргументах WP_Query был объявлен устаревшим начиная с версии 3.1 и введен {tax_query}. Ниже приведен код, который отлично работает.
$query = new WP_Query( array(
'post_type' => 'faqs', // название типа записи
'tax_query' => array(
array(
'taxonomy' => 'faq_category', // название таксономии
'field' => 'term_id', // term_id, slug или name
'terms' => 48, // id термина, ярлык термина или название термина
)
)
) );
while ( $query->have_posts() ) : $query->the_post();
// здесь выполняем нужные действия....
endwhile;
/**
* сбрасываем оригинальный запрос
* мы должны использовать это для сброса wp_query
*/
wp_reset_query();

Это правильный ответ - принятый ответ не будет фильтровать по таксономии, так как tax_query требует массив массивов. Этот вложенный метод необходим для того, чтобы это заработало. Спасибо за ваш ответ )

Да, это также помогло мне заставить работать шаблон таксономий. Спасибо!

Привет @AamerShahzad, у меня точно такой же вопрос, и я использовал ваш ответ, но страница не выводит никаких записей. Можете мне помочь? https://stackoverflow.com/questions/55783769/how-do-i-pull-only-one-category-from-custom-post-type-in-a-template

Вот код, который работает как магия. Я получаю все записи для пользовательского типа записей "university_unit" с пользовательской таксономией "unit_type" и несколькими терминами таксономии "directorate" и "office". Надеюсь, это поможет.
<?php
$args = array(
'post_type' => 'university_unit', // тип записи
'posts_per_page' => -1, // показать все записи
'orderby' => 'title', // сортировка по заголовку
'order' => 'ASC', // по возрастанию
'tax_query' => array(
array(
'taxonomy' => 'unit_type', // таксономия
'field' => 'slug', // поле для поиска
'terms' => array('directorate', 'office') // искомые термины
)
)
);
$Query = new WP_Query($args);
if($Query -> have_posts()):
while($Query -> have_posts()):
$Query -> the_post();
?>
<div class="cm-post-list-item">
<article>
<div class="cm-post-head">
<h3 class="cm-text-blue">
<a href="<?php the_permalink(); ?>"><?php the_title();?></a>
</h3>
</div>
<div class="cm-post-body"><?php the_excerpt();?></div>
</article>
</div>
<?php
endwhile;
else:
"Административные офисы не найдены. Попробуйте позже";
endif;
wp_reset_postdata();
?>

Это помогло мне получить список всех записей для каждого термина пользовательской таксономии для произвольного типа записей (CPT)
<?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, // указываем слаги терминов
),
),
);
// Запрос
$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 } ?>

Этот ответ больше не актуален, так как WordPress изменил информацию о параметрах таксономии. Пожалуйста, используйте следующий способ. Он будет работать. У меня он работает. "tax_query" заменяется на "tax". Надеюсь, это поможет.
$the_query = new WP_Query( array(
'post_type' => 'Adverts',
'tax' => array(
array (
'taxonomy' => 'advert_tag', // таксономия
'field' => 'slug', // поле
'terms' => 'politics', // значение
)
),
) );
while ( $the_query->have_posts() ) :
$the_query->the_post();
// Отображение записей ...
endwhile;
/* Восстанавливаем оригинальные данные записи
* Примечание: Поскольку мы используем new WP_Query,
* мы не затрагиваем оригинальный $wp_query и его не нужно сбрасывать.
*/
wp_reset_postdata();

Все наоборот - tax
был старым способом, tax_query
является текущим (v3.1+) способом.

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