Всем привет.
У нас на проекте появилась задача сделать страницу в WordPress, где будут отображаться дополнительные параметры для кастомных типов записей. Грубо говоря — вывести все сущности одного типа, по которым фильтруются кастомные типы записей.
К примеру: у вас есть типа записей games. Условно говоря — это запись с игрой. Для каждой игры, помимо категории своей, есть также такой параметр, как «Провайдер» (Provider). Вот его мы решили хранить в базе, как тег для нашего custom_post_type => ‘game’.
И наша задача состоит в том, что нужно вывести на странице все провайдеры, у которых есть хоть одна запись типа «game». Получился код у нас следующий:
function get_terms_by_custom_post_type( $post_type, $taxonomy ){
$args = array( 'post_type' => $post_type);
$loop = new WP_Query( $args );
$postids = array();
// build an array of post IDs
while ( $loop->have_posts() ) : $loop->the_post();
array_push($postids, get_the_ID());
endwhile;
// get taxonomy values based on array of IDs
$taxonomies = wp_get_object_terms( $postids, $taxonomy );
return $taxonomies;
}
Этот код работает. Все хорошо. Однако те, кто хорошо знает WordPress, заметит, что если эту функцию использовать, то сбиваются настройки для обьекта $post.
Для того, чтобы все работало как должно, нужно добавить еще одну строку:
wp_reset_postdata();
В итоге у нас получился следующий код, который нужно добавить в файл functions.php для вашей темы:
function get_terms_by_custom_post_type( $post_type, $taxonomy ){
$args = array( 'post_type' => $post_type);
$loop = new WP_Query( $args );
$postids = array();
// build an array of post IDs
while ( $loop->have_posts() ) : $loop->the_post();
array_push($postids, get_the_ID());
endwhile;
// get taxonomy values based on array of IDs
$taxonomies = wp_get_object_terms( $postids, $taxonomy );
wp_reset_postdata();
return $taxonomies;
}
Использовать эту функцию необходимо следующим образом:
<?$providers = get_terms_by_custom_post_type('game', 'post_tag');?>
Наш код в итоге для вывода провайдеров получился следующим:
<?$providers = get_terms_by_custom_post_type('game', 'post_tag');?>
<?if(count($providers)):?>
<div class="games__body">
<h1 class="entry-title text-center"><?=the_title();?></h1>
<div class="games-providers__grid">
<?foreach($providers as $provider):?>
<a href="<?=get_term_link($provider, 'post_tag');?>" class="games-providers__item" id="<?=$provider->name;?>">
</a>
<?endforeach;?>
</div>
</div>
<?endif;?>
Всем спасибо. Надеюсь будет полезна эта функция.
Добавить комментарий