wp_get_post_terms не работает как ожидалось

Вопрос или проблема

У меня есть пользовательский тип записи под названием “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>";
}

Пояснения:

  1. Данная функция get_terms извлекает все термины для указанной таксономии. Аргумент 'hide_empty' => true гарантирует, что будут отображены только те термины, к которым прикреплены записи.

  2. Проверка на наличие ошибок с помощью is_wp_error предотвращает проблемы с выводом в случае, если что-то пойдет не так во время выполнения запроса.

  3. Безопасность: использование esc_url и esc_html помогает предотвратить XSS-атаки, обеспечивая безопасный вывод URL и текстов.

Дополнительные советы:

  • SEO-оптимизация: Убедитесь, что URL каждой ссылки содержат ключевые слова, которые соответствуют содержанию терминов. Это может помочь улучшить видимость вашей страницы в поисковых системах.

  • Профессиональное восприятие: Добавление описаний или изображений рядом с терминами может сделать вашу страницу более информативной и приятной для восприятия пользователями.

Пожалуйста, проверьте, зарегистрированы ли правильно ваши пользовательские типы записей и таксономии в коде (как указано в вашем Pastebin) и что запросы соответствуют им. Если после применения этого кода проблема сохраняется, возможно, стоит проверить логи сервера на наличие ошибок, а также убедиться, что отсутствуют конфликты с темой оформления.

Оцените материал
Добавить комментарий

Капча загружается...