Показать тег категории - PullRequest
       1

Показать тег категории

0 голосов
/ 09 ноября 2010

При просмотре страницы тега можно ли каким-либо образом выводить (в цикле) категории, в которых присутствует тег, а не перечислять его сообщения?

Внешний вид моей домашней страницы выглядит следующим образом, я ищу то же самое, но на странице тегов.

            <ul class="thumb-grid">
            <?php query_posts('meta_key=is_front_page&posts_per_page=5&paged=$paged'); ?>
            <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
                <li id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                    <a href="<?php bloginfo('url'); ?>/movies/<?php $category = get_the_category(); echo $category[0]->category_nicename; ?>">
                        <img src="<?php echo $my_image_url = get('movie_thumbnail'); ?>" alt="" />
                        <span class="title"><?php $category = get_the_category(); echo $category[0]->cat_name; ?></span>
                        <span class="feat"><?php $articletags = strip_tags(get_the_tag_list('',', ',''));echo $articletags;?></span>
                    </a>
                </li>
            <?php endwhile; endif; ?>
            <?php wp_reset_query(); ?>
            </ul>

1 Ответ

0 голосов
/ 10 ноября 2010

Это решение, которое выводит список категорий, содержащих сообщения, разделяющие текущий тег один раз на странице, а не внутри цикла. Я тестировал его только на странице тегов, где доступен запрос «tag» var. Он использует пользовательские запросы с использованием $wpdb класса . (Это может быть очень полезно для изучения).

Вам нужно определить свой собственный префикс таблицы в начале или установить как ''.

Тестирование Я проверил этот код, поместив его прямо в tag.php. Было бы разумнее поместить его в свой собственный плагин или файл functions.php темы. Может потребоваться некоторая настройка, чтобы убедиться, что объект $ wp_query доступен внутри этой функции.

Термины и таксономия Помните, что теги и категории считаются равными в базе данных WordPress. Все сообщения, страницы, редакции и черновики - это «посты», категории и теги - «термины». Различие между ними заключается в их «таксономии», которая заключается просто в том, является ли термин «категорией» или «тегом».

Таблица «термины» содержит все теги и категории. «Term_taxonomy» хранит, является ли термин тегом, категорией или ссылкой на публикацию. Таблица 'term_relationships' объединяет сообщения и таксономии. Столбец 'object_id' может содержать идентификаторы записей или терминов в этой таблице.

Схема кода

  1. Устанавливает префикс таблицы
  2. Получает имя тега из query_vars
  3. Получает тег term_id из таблицы терминов
  4. Получает идентификаторы поста (с именем 'object_id') из таблицы term_relationships как численно проиндексированный массив
  5. Превращает этот числовой массив в строку через запятую
  6. Обрезает запятую
  7. Выбирает все term_taxonomy_id (категории и теги), которые имеют идентификаторы поста от # 4 из term_relationships в качестве многомерного ассоциативного массива
  8. Создайте массив терминов во всех сообщениях с этим тегом.
  9. Элемент Foreach в этом массиве, выберите таксономию (будь то «категория» или «тег») и, если это категория, поместите term_id в массив.
    1. Превратить этот массив в строку для использования на следующем шаге.
    2. вызов wp_list_categories() со строкой category_id в качестве категорий для включения.

Пример кода

//define table prefix
$wp_pre = 'wp_';
//get tag name from url
$tag_name = $wp_query->get('tag');
//get term_id from database
$term_id = $wpdb->get_var("
     SELECT term_id
     FROM ".$wp_pre."terms
     WHERE name ='".$tag_name."'");

//select post id's with this tag
$posts_with_tag = $wpdb->get_results("
      SELECT object_id
      FROM ".$wp_pre."term_relationships
      WHERE term_taxonomy_id = '".$term_id."'",
      ARRAY_N);

//make string out of returned array in an array
 $posts_with_tag_as_string = implode(',',$posts_with_tag[0]);

//trim trailing comma
$posts_with_tag_as_string = rtrim($posts_with_tag_as_string,',');
//select all terms having post id
$terms_having_post = $wpdb->get_results("
      SELECT term_taxonomy_id
      FROM ".$wp_pre."term_relationships
      WHERE object_id
      IN ('".$posts_with_tag_as_string."')",
      ARRAY_A);

 foreach($terms_having_post as $key=>$val){
      $post_terms[] = $val['term_taxonomy_id'];
 }

 //get taxonomy name for each term_having_post    
 foreach($post_terms as $term_id){
      $taxonomy = $wpdb->get_var("
           SELECT taxonomy
           FROM ".$wp_pre."term_taxonomy
           WHERE term_id = '".$term_id."'");

      if($taxonomy == 'category'){
          $cats[] = $term_id;
      }
 }

 $category_ids = implode(',',$cats);
 //trim trailing comma
 $category_ids = rtrim($category_ids,',');

 //output list of categories with the included id's.
 wp_list_categories('include='.$category_ids);

Я надеюсь, что это работает для вас.

UPDATE В ответ на ваш комментарий, чтобы получить категории , а также описания и другие метаданные cat, вы можете заменить wp_list_categories на get_categories, передавая при этом include='.$category_ids. Это вернет массив объектов категории, которые вы можете просмотреть по своему усмотрению, и отобразит категорию, описание, количество сообщений и многое другое.

Новый пример кода (со страницы кодекса)

$args=array(
  'orderby' => 'name',
  'order' => 'ASC'
  );

$categories=get_categories($args);
foreach($categories as $category) { 
    echo '<p>Category: <a href="' . get_category_link( $category->term_id ) . '" title="' . sprintf( __( "View all posts in %s" ), $category->name ) . '" ' . '>' . $category->name.'</a> </p> ';
    echo '<p> Description:'. $category->description . '</p>';
    echo '<p> Post Count: '. $category->count . '</p>';  
 } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...