Это решение, которое выводит список категорий, содержащих сообщения, разделяющие текущий тег один раз на странице, а не внутри цикла. Я тестировал его только на странице тегов, где доступен запрос «tag» var. Он использует пользовательские запросы с использованием $wpdb
класса . (Это может быть очень полезно для изучения).
Вам нужно определить свой собственный префикс таблицы в начале или установить как ''
.
Тестирование
Я проверил этот код, поместив его прямо в tag.php. Было бы разумнее поместить его в свой собственный плагин или файл functions.php темы. Может потребоваться некоторая настройка, чтобы убедиться, что объект $ wp_query доступен внутри этой функции.
Термины и таксономия
Помните, что теги и категории считаются равными в базе данных WordPress. Все сообщения, страницы, редакции и черновики - это «посты», категории и теги - «термины». Различие между ними заключается в их «таксономии», которая заключается просто в том, является ли термин «категорией» или «тегом».
Таблица «термины» содержит все теги и категории. «Term_taxonomy» хранит, является ли термин тегом, категорией или ссылкой на публикацию. Таблица 'term_relationships' объединяет сообщения и таксономии. Столбец 'object_id' может содержать идентификаторы записей или терминов в этой таблице.
Схема кода
- Устанавливает префикс таблицы
- Получает имя тега из query_vars
- Получает тег term_id из таблицы терминов
- Получает идентификаторы поста (с именем 'object_id') из таблицы term_relationships как численно проиндексированный массив
- Превращает этот числовой массив в строку через запятую
- Обрезает запятую
- Выбирает все term_taxonomy_id (категории и теги), которые имеют идентификаторы поста от # 4 из term_relationships в качестве многомерного ассоциативного массива
- Создайте массив терминов во всех сообщениях с этим тегом.
- Элемент Foreach в этом массиве, выберите таксономию (будь то «категория» или «тег») и, если это категория, поместите term_id в массив.
- Превратить этот массив в строку для использования на следующем шаге.
- вызов
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>';
}