Отобразить все термины в пользовательской таксономии

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

Я стремлюсь создать несколько различных отображений на домашней странице терминов в определенных таксономиях, а также их изображений, как определено в ACF.

Я искал информацию в интернете и нашел два основных способа сделать это и хотел бы сначала спросить, в чем разница между ними:

WP_Term_Query();

и

get_terms();

Это код, который у меня есть на данный момент, но он, похоже, не работает с the_title() и the_permalink().

Также он отображает поле изображения ACF первого результата, но затем повторяет то же самое изображение для остальных. Поле пользовательского изображения ACF для термина – ‘artist_thumbnail_image’

<?php
$args = array(
    'taxonomy'               => 'artist',
    'orderby'                => 'name',
    'order'                  => 'ASC',
    'hide_empty'             => false,
    'meta_key'               => 'artist_featured',
    'meta_value'             => '1',
    'meta_compare'           => '==',
);
$the_query = new WP_Term_Query($args);
foreach ($the_query->get_terms() as $term) { ?>
    <?php echo $term->name; ?>

    <?php
    $featuredartistid = $term->term_id;
    $featuredartist = get_field('artist', $featuredartistid);
    $featuredartistthumbnailimage = get_field('artist_thumbnail_image', $featuredartist);
    $featuredartistthumbnailimagesize="thumbnail"; ?>

    <a href="https://wordpress.stackexchange.com/questions/361052/<?php echo the_permalink(); ?>">
        <?php echo wp_get_attachment_image($artistthumbnailimage, $artistthumbnailimagesize); ?>
    </a>

<?php } ?>

  1. get_terms() создает WP_Term_Query(), а затем передает ему $args. Он также применяет get_terms фильтр к терминам перед их возвратом. get_terms() в этом случае является удобной функцией, которая используется, если вам не нужны все возможности, которые может предоставить WP_Term_Query.

  2. Что касается the_title() и the_permalink(), эти функции предназначены для работы с записями, а не с терминами таксономии. the_title() будет иметь смысл только если вы находитесь в Цикле, я так думаю. Вне Цикла вы можете использовать get_the_title(), но вам нужно передать ей запись или ID записи.

  3. Your image problem might be because you’re changing from featuredartistthumbnailimage and featuredartistthumbnailimagesize to artistthumbnailimage and artistthumbnailimagesize in your code.

Понял. Мои проблемы были связаны с неправильным featuredartistthumbnailimagesize на artistthumbnailimage.

Плюс к тому, я должен был использовать переменную $term, переданную в wp_get_attachment_image. А не $term->id.

Ниже находится мой рабочий код. Надеюсь, он поможет кому-то.

$fa_args = array(
    'taxonomy'               => 'artist',
    'hide_empty'             => false,
    'meta_key'               => 'artist_featured',
    'meta_value'             => '1',
);
$fa_query = new WP_Term_Query($fa_args);
if (!empty($fa_query->terms)) {
    foreach ($fa_query->terms as $fa_term) {

        $fa_id = $fa_term->term_id; // ID термина
        $fa_link = get_term_link($fa_id); // Ссылка на термин
        $fa_image_id = get_field('artist_thumbnail_image', $fa_term); // ID миниатюры артиста
        $fa_image = wp_get_attachment_image($fa_image_id, 'thumbnail');

        echo $fa_term->name;
        echo '<br>';
        echo $fa_image;
        echo '<br>';

    }
}

Ответ или решение

Для отображения всех терминов в пользовательской таксономии и их изображений, созданных с помощью Advanced Custom Fields (ACF), необходимо использовать определенные функции WordPress и правильно настраивать запросы. Рассмотрим два основных подхода: использование WP_Term_Query и get_terms, разберем, как их использовать и заодно устраним проблемы, возникшие в вашем изначальном коде.

Сравнение WP_Term_Query и get_terms

  1. get_terms():

    • Это вспомогательная функция, которая создает экземпляр класса WP_Term_Query и передает ему аргументы. Она значительно удобнее, если вам не нужно углубляться в сложные настройки запроса, например, для фильтрации или изменения порядка отображения.
    • Она поддерживает хуки, что позволяет легко изменять вывод значений перед их возвращением.
  2. WP_Term_Query:

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

В большинстве случаев, если ваши требования не являются слишком специфичными, использование get_terms() будет предпочтительнее благодаря своей простоте.

Исправление кода для отображения терминов и изображений

Ваш начальный код имел несколько недочетов, которые мешали корректному выполнению. Вот исправленный и упрощенный вариант кода для вывода терминов и изображений:

<?php
$fa_args = array(
    'taxonomy'   => 'artist', // Замените на вашу таксономию
    'hide_empty' => false,     // Отображать ли пустые термины
    'meta_query' => array(
        array(
            'key'     => 'artist_featured',
            'value'   => '1',
            'compare' => '=='
        ),
    ),
);

$fa_query = new WP_Term_Query($fa_args);
if (!empty($fa_query->terms)) {
    foreach ($fa_query->terms as $fa_term) {
        // Получаем ID термина
        $fa_id = $fa_term->term_id; 
        // Получаем ссылку на термин
        $fa_link = get_term_link($fa_id); 
        // Получаем ID изображения
        $fa_image_id = get_field('artist_thumbnail_image', $fa_term); // Использование ACF для получения ID изображения
        // Получаем HTML код изображения
        $fa_image = wp_get_attachment_image($fa_image_id, 'thumbnail');

        echo '<a href="' . esc_url($fa_link) . '">';
        echo '<h3>' . esc_html($fa_term->name) . '</h3>'; // Отображаем название термина
        echo $fa_image; // Отображаем изображение
        echo '</a>';
        echo '<br>';
    }
} else {
    echo 'Нет доступных терминов.';
}
?>

Пояснения к исправлениям:

  • В коде использовались встроенные функции WordPress для получения ссылки на термин и его названия, что позволяет избежать путаницы с the_permalink().
  • Вместо get_field используется правильный подход для получения изображения, что устраняет проблему с дублированием изображений.
  • Добавлено экранирование с помощью esc_url() и esc_html(), что делает код более защищенным и улучает SEO.

Заключение

Этот код позволит вам корректно отображать термины вашей пользовательской таксономии вместе с соответствующими изображениями, создаваемыми через ACF. Выбор между get_terms() и WP_Term_Query зависит от ваших конкретных потребностей, однако в большинстве случаев достаточно будет первого варианта. Следуя данным указаниям, вы получите функциональное решение для интеграции терминов ACF на ваш сайт.

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

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