Вопрос или проблема
Я стремлюсь создать несколько различных отображений на домашней странице терминов в определенных таксономиях, а также их изображений, как определено в 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 } ?>
-
get_terms()
создаетWP_Term_Query()
, а затем передает ему$args
. Он также применяетget_terms
фильтр к терминам перед их возвратом.get_terms()
в этом случае является удобной функцией, которая используется, если вам не нужны все возможности, которые может предоставитьWP_Term_Query
. -
Что касается
the_title()
иthe_permalink()
, эти функции предназначены для работы с записями, а не с терминами таксономии.the_title()
будет иметь смысл только если вы находитесь в Цикле, я так думаю. Вне Цикла вы можете использоватьget_the_title()
, но вам нужно передать ей запись или ID записи. -
Your image problem might be because you’re changing from
featuredartistthumbnailimage
andfeaturedartistthumbnailimagesize
toartistthumbnailimage
andartistthumbnailimagesize
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
-
get_terms()
:- Это вспомогательная функция, которая создает экземпляр класса
WP_Term_Query
и передает ему аргументы. Она значительно удобнее, если вам не нужно углубляться в сложные настройки запроса, например, для фильтрации или изменения порядка отображения. - Она поддерживает хуки, что позволяет легко изменять вывод значений перед их возвращением.
- Это вспомогательная функция, которая создает экземпляр класса
-
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 на ваш сайт.