Как показать, что архив тега одного сообщения вводит только

У меня есть сайт с несколькими пользовательскими типами сообщения и taxonomies. taxonomies совместно используются через все типы сообщения.

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

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

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

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

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

Аплодисменты для Вашей справки.

1
28.03.2012, 11:35
3 ответа

Я разработал решение этого. Я надеюсь, что это может помочь кому-то еще.

Сначала добавьте следующие две функции к своему 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
19.02.2020, 22:56

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

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

$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
19.02.2020, 22:56

Я думаю, что могу ответить на часть этого. Вам нужен фильтр в Вашем 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
19.02.2020, 22:56
  • 1
    спасибо за ответ. Этот метод означал бы, что только 'видео' будут когда-либо показывать на шаблоне tag.php? Я должен буду смочь сделать это для всех типов сообщения. Например, у Меня есть тип сообщения 'галерей', для которого я должен буду сделать то же самое. Т.е. облако тегов на 'галереях' архивирует ссылки на архив тега, показывающий только галереи. –  kdev 28.03.2012, 11:39
  • 2
    я предполагаю Вас, редактирует код выше, чтобы показать и видео и галереи и затем изменить запрос для Вашего цикла в tag.php для показа только одного или другого. Я не знаю, какое условное выражение Вы использовали бы в tag.php все же.Прошу прощения. –  Ben Pearson 29.03.2012, 10:07

Теги

Похожие вопросы