Как показать архив тегов только одного типа записи
У меня есть сайт с несколькими пользовательскими типами записей и таксономиями. Таксономии являются общими для всех типов записей.
На странице архива типа публикации "видео" я хочу показать список всех тегов "страна", связанных с видео. При нажатии на эту ссылку я хотел бы иметь возможность перейти в архив для этой страны, но там отображаются только "видео", а не другие типы сообщений, которые могут иметь тот же тег страны.
Мне также нужно будьте в состоянии сделать то же самое для других типов записей и таксономий, например, когда в архиве типов записей "галереи" отображается облако тегов, которое ссылается на архив тегов, показывающий только галереи.
Я думаю, что это должно быть легко, но я просто не могу этого понять!
Нужно ли мне создавать шаблоны архивов, которые принимают аргументы, передаваемые по URL-адресу? Например. mysite.com/country/canada?type=video
..а затем как-то манипулировать функцией get_tags? Я действительно просто не могу собраться с мыслями вокруг этого.
Спасибо за вашу помощь.
3 answers
Я разработал решение этой проблемы. Я надеюсь, что это может помочь кому-то еще.
Сначала добавьте следующие две функции в свой functions.php (или плагин) файл:
function get_terms_by_post_type( $taxonomies, $post_types ) {
global $wpdb;
$query = $wpdb->prepare( "SELECT t.*, COUNT(*) from $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id INNER JOIN $wpdb->posts AS p ON p.ID = r.object_id WHERE p.post_type IN('".join( "', '", $post_types )."') AND tt.taxonomy IN('".join( "', '", $taxonomies )."') GROUP BY t.term_id");
$results = $wpdb->get_results( $query );
return $results;
}
function show_post_type_terms($taxonomy, $posttype = null ) {
global $post;
if(!isset($posttype)) $posttype = get_post_type( $post->ID );
$terms = get_terms_by_post_type( array($taxonomy), array($posttype) );
echo '<ul>';
foreach($terms as $term) {
$output = '<li><a href="'.get_bloginfo('url').'/'.$taxonomy.'/'.$term->slug.'/?post_type='.$posttype.'">'.$term->name.'</a></li>';
echo $output;
}
echo '</ul>';
}
Теперь на страницах архива пользовательских типов записей вы можете использовать <?php show_post_type_terms('country'); ?>
, изменив "страну" для таксономии, которую вы хотите вернуть.
К созданным ссылкам в конце добавляется запрос, возвращающий только тот тип записи, который вы просматриваете в данный момент. Если вы находитесь на странице архива "видео", она будет ссылаться на архив таксономии, показывающий только видеозаписи.
Я думаю, что могу ответить на часть этого вопроса. Вам нужен фильтр в вашем functions.php чтобы заставить петлю в вашем tag.php шаблон для сотрудничества.
/**
* Function and filter to force tag.php (tag archives) to display only video custom post types.
*/
function add_custom_types_to_tag_archives( $query ) {
if( is_tag() && empty( $query->query_vars['suppress_filters'] ) ) {
$post_types = array( 'video' );
$query->set( 'post_type', $post_types );
return $query;
}
}
add_filter( 'pre_get_posts', 'add_custom_types_to_tag_archives' );
Надеюсь, это поможет. Это мой первый ответ на вопрос здесь:)
Хорошо, у меня есть частичный ответ на мой собственный вопрос.
Я могу использовать следующее для вывода списка терминов таксономии со ссылками, показывающими только текущий тип записи:
$args = array( 'taxonomy' => 'country' );
$terms = get_terms('country', $args);
$count = count($terms); $i=0;
if ($count > 0) {
$term_list = '<ul class="my_term-archive">';
foreach ($terms as $term) {
$i++;
$term_list .= '<li><a href="/country/' . $term->slug . '/?post_type='.get_post_type( $post->ID ).'" title="' . sprintf('View all posts filed under %s', $term->name) . '">' . $term->name . '</a></li>';
}
echo $term_list.'</ul>';
}
Моя оставшаяся проблема заключается в том, что здесь все еще перечислены термины таксономии, к которым не прикреплены видео. Например, возможно, другому типу сообщений присвоен тег "страна" "Канада". Даже если нет "видео" с тегом "Канада", "Канада" все равно будет отображаться в этом списке.