Как показать архив тегов только одного типа записи


У меня есть сайт с несколькими пользовательскими типами записей и таксономиями. Таксономии являются общими для всех типов записей.

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

Мне также нужно будьте в состоянии сделать то же самое для других типов записей и таксономий, например, когда в архиве типов записей "галереи" отображается облако тегов, которое ссылается на архив тегов, показывающий только галереи.

Я думаю, что это должно быть легко, но я просто не могу этого понять!

Нужно ли мне создавать шаблоны архивов, которые принимают аргументы, передаваемые по URL-адресу? Например. mysite.com/country/canada?type=video

..а затем как-то манипулировать функцией get_tags? Я действительно просто не могу собраться с мыслями вокруг этого.

Спасибо за вашу помощь.

Author: kdev, 2012-03-23

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'); ?>, изменив "страну" для таксономии, которую вы хотите вернуть.

К созданным ссылкам в конце добавляется запрос, возвращающий только тот тип записи, который вы просматриваете в данный момент. Если вы находитесь на странице архива "видео", она будет ссылаться на архив таксономии, показывающий только видеозаписи.

 2
Author: kdev, 2012-04-03 09:32:10

Я думаю, что могу ответить на часть этого вопроса. Вам нужен фильтр в вашем 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' ); 

Надеюсь, это поможет. Это мой первый ответ на вопрос здесь:)

 0
Author: Ben Pearson, 2012-03-27 21:15:29

Хорошо, у меня есть частичный ответ на мой собственный вопрос.

Я могу использовать следующее для вывода списка терминов таксономии со ссылками, показывающими только текущий тип записи:

$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>';
}

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

 0
Author: kdev, 2012-04-03 08:54:00