Вопрос или проблема
У меня есть пользовательский тип записи под названием “Fruit” и иерархическая таксономия под названием “Fruit Categories”.
Когда я создаю новую запись под “Fruit”, я могу присвоить ей “термин” – так же, как вы бы это сделали с обычной категорией записи, но в таксономии “Fruit Categories”.
Я добавил три записи в “Fruit”, каждая из которых прикреплена к одному термину; “Apples”, “Pears” и “Bananas”.
Все работает нормально, но теперь я хочу создать архивную страницу, которая просто перечисляет термины в UL для этого пользовательского типа записи, следующим образом:
mysite.com/fruit
- Apples
- Pears
- Bananas
Проблема, с которой я сталкиваюсь, заключается в том, что каждый запрос, который я использовал, кажется, возвращает только первый термин, Apples. Остальные два не отображаются, и я пробовал многие фрагменты кода, все с одинаковым результатом.
Некоторые вещи, которые я пробовал:
$term_list = wp_get_post_terms($post->ID, 'fruit_categories', array("fields" => "all")); print_r($term_list);
И
$terms = wp_get_post_terms($post->ID,'fruit_categories');
$count = count($terms);
if ( $count > 0 ){
echo "<ul>";
foreach ( $terms as $term ) {
echo '<li><a href="'.get_term_link($term->slug, 'fruit_categories').'">'. $term->name . "</a></li>";
}
echo "</ul>";
}
Я также пробовал советы, предложенные здесь, однако это все равно приводит к той же проблеме — выводится только первый термин.
https://stackoverflow.com/questions/15502811/display-current-post-custom-taxonomy-in-wordpress
Это свежая установка без плагинов.
Мне нужно добавить цикл foreach, чтобы вытянуть дополнительные термины? Или я что-то упускаю?
Я также рассматривал wp_get_object_terms, но я не совсем понимаю, как его использовать.
Когда я делаю снимок экрана, я получаю следующее на mysite/fruit
Apples
Array ( [0] => stdClass Object ( [term_id] => 43 [name] => Apples[slug] => apples [term_group] => 0 [term_taxonomy_id] => 43 [taxonomy] => fruit_categories wp_get_post_terms not working as expected => [parent] => 0 [count] => 2 ) )
Для справки, вот мой код регистрации пользовательского типа записи и таксономии http://pastebin.com/K8kwuzqt
Любая помощь очень ценится.
Я неправильно понял, что вы пытались сделать раньше. Я думал, что вы хотите перечислить термины, связанные с одной конкретной записью — той, на которой вы находитесь. Ой!
Попробуйте так:
$terms = get_terms('fruit_category');
if(!empty($terms)){
echo "<ul>";
foreach ( $terms as $term ) {
echo '<li><a href="'.get_term_link($term->slug, 'fruit_categories').'">'. $term->name . "</a></li>";
}
echo "</ul>";
}
Это даст вам список всех ссылок на страницы term
, при условии, что у каждого термина есть хотя бы один пост.
Обновление:
Чтобы получить термины таксономии более динамически, можно сделать это:
// архивы терминов таксономии
$post_type = get_post_type();
$taxonomies = get_object_taxonomies($post_type);
if(!empty($taxonomies)){
foreach($taxonomies as $taxonomy){
$terms = get_terms($taxonomy);
if(!empty($terms)){
echo "<ul>";
foreach ( $terms as $term ) {
echo '<li><a href="'.get_term_link($term->slug, $taxonomy).'">'. $term->name . "</a></li>";
}
echo "</ul>";
}
}
}
Ответ или решение
Проблема, с которой вы сталкиваетесь при использовании wp_get_post_terms
, заключается в том, что этот метод пытается вытащить термины для конкретной записи (поста), а не для всех терминов таксономии вашего пользовательского типа записей "Fruit". Поскольку вы хотите создать архивную страницу, показывающую все термины в таксономии "Fruit Categories", вам нужен другой подход.
Ваша цель — вывести список всех терминов в рамках этой таксономии. В данном случае, вместо wp_get_post_terms
, вам следует использовать функцию get_terms
.
Вот улучшенное решение для вашей задачи:
$terms = get_terms(array(
'taxonomy' => 'fruit_categories', // ваша таксономия
'hide_empty' => true, // выводить только термины, к которым прикреплены записи
));
if (!is_wp_error($terms) && !empty($terms)) {
echo "<ul>";
foreach ($terms as $term) {
echo '<li><a href="' . esc_url(get_term_link($term)) . '">' . esc_html($term->name) . "</a></li>";
}
echo "</ul>";
} else {
echo "<p>Термины не найдены.</p>";
}
Пояснения:
-
Данная функция
get_terms
извлекает все термины для указанной таксономии. Аргумент'hide_empty' => true
гарантирует, что будут отображены только те термины, к которым прикреплены записи. -
Проверка на наличие ошибок с помощью
is_wp_error
предотвращает проблемы с выводом в случае, если что-то пойдет не так во время выполнения запроса. -
Безопасность: использование
esc_url
иesc_html
помогает предотвратить XSS-атаки, обеспечивая безопасный вывод URL и текстов.
Дополнительные советы:
-
SEO-оптимизация: Убедитесь, что URL каждой ссылки содержат ключевые слова, которые соответствуют содержанию терминов. Это может помочь улучшить видимость вашей страницы в поисковых системах.
-
Профессиональное восприятие: Добавление описаний или изображений рядом с терминами может сделать вашу страницу более информативной и приятной для восприятия пользователями.
Пожалуйста, проверьте, зарегистрированы ли правильно ваши пользовательские типы записей и таксономии в коде (как указано в вашем Pastebin) и что запросы соответствуют им. Если после применения этого кода проблема сохраняется, возможно, стоит проверить логи сервера на наличие ошибок, а также убедиться, что отсутствуют конфликты с темой оформления.