Как отобразить названия тегов товаров WooCommerce на главной странице и страницах категорий
Я пытаюсь отобразить теги товаров WooCommerce на главной странице и страницах категорий. Вместе с названием товара тема должна отображать все теги в алфавитном порядке, разделенные символом "·".
Например: Тег 1 · Тег 2 · Тег 3
Вот что у меня есть на данный момент:
<?php echo get_the_tag_list('<span class="woocommerce-display-tag">Теги: ',' · ','</span>');?>
Результат пустой.
Как можно это исправить?

Я думаю, что функция get_the_tag_list
используется только для стандартных тегов WordPress. Теги товаров WooCommerce — это пользовательская таксономия под названием product_tag
. Поэтому вы не можете использовать эту функцию для получения этих тегов. (поправьте меня, если я ошибаюсь).
Вместо этого вы можете использовать функцию WordPress get_the_terms()
, чтобы получить аналогичный результат.
Базовый пример:
// получаем product_tags текущего товара
$current_tags = get_the_terms( get_the_ID(), 'product_tag' );
// начинаем только если есть теги
if ( $current_tags && ! is_wp_error( $current_tags ) ) {
// создаем список для тегов
echo '<ul class="product_tags">';
// для каждого тега создаем пункт списка
foreach ($current_tags as $tag) {
$tag_title = $tag->name; // название тега
$tag_link = get_term_link( $tag ); // ссылка на архив тега
echo '<li><a href="'.$tag_link.'">'.$tag_title.'</a></li>';
}
echo '</ul>';
}
Если вам нужен специальный разделитель и прочее, придется повозиться.
Обновление по разделителям:
Есть несколько вариантов, как убрать последний разделитель или работать с разделителями в целом.
Первый способ — использование только CSS. Для этого сначала оборачиваем каждый $tag_title
в HTML-элемент (здесь <span>
). Это нужно, чтобы мы могли стилизовать каждый заголовок.
// для каждого тега создаем элемент
foreach ($current_tags as $tag) {
$tag_title = $tag->name; // название тега
echo '<span>'.$tag_title.'</span>';
}
Затем добавляем два новых CSS-стиля (с вашей разметкой):
/* добавляем " · " после каждого span внутри .woocommerce-Price-amount */
.woocommerce-Price-amount span:after { content: " · "; }
/* убираем " · " у последнего span */
.woocommerce-Price-amount span:last-child:after { content: ""; }
Также можно добавить разделитель через PHP.
Для этого сначала получаем новый массив всех ключей массива $current_tags
. Затем находим последний ключ в этом новом массиве. Далее в цикле foreach
сравниваем текущий ключ с последним найденным. Если они совпадают, значит, это последний элемент.
Изменяем ваш блок if
:
// начинаем только если есть теги
if ( $current_tags && ! is_wp_error( $current_tags ) ) {
// создаем контейнер для тегов
echo '<span class="woocommerce-Price-amount amount">';
// получаем все ключи массива $current_tags
$get_keys = array_keys($current_tags);
// получаем последний ключ
$last_key = array_pop($get_keys);
// для каждого тега выводим название
foreach ($current_tags as $key => $value) {
$tag_title = $value->name; // название тега
if($key == $last_key) {
echo $tag_title;
} else {
echo $tag_title.' · ';
}
}
echo '</span>';
}
P.S. Проверьте свой код! В вашем примере есть ошибка в строке echo '</span> }
. Не хватает кавычки '
.

Спасибо! Теперь я использую:
`// получаем product_tags текущего товара $current_tags = get_the_terms( get_the_ID(), 'product_tag' );
// начинаем только если есть теги if ( $current_tags && ! is_wp_error( $current_tags ) ) {
// создаем список для хранения наших тегов
echo '<span class="woocommerce-Price-amount amount">';
// для каждого тега создаем элемент списка
foreach ($current_tags as $tag) {
$tag_title = $tag->name; // название тега
echo $tag_title.' · ';
}
echo '</span>
}`
Знаете, как можно убрать последнюю ·?

Теперь вы можете использовать функцию wc_get_product_tag_list()
для получения списка тегов товара. Она поддерживает указание разделителя, а также элементов before и after.
Пример
<?php
global $product;
?>
<div class="product-tags">
<?php echo wc_get_product_tag_list( $product->get_id(), ', ' ); ?>
</div>

Здравствуйте и спасибо за ваш ответ! Пожалуйста, будьте осторожны при копировании/вставке этого ответа в несколько вопросов. Убедитесь, что он соответствует конкретному вопросу. Возможно, используйте код из конкретного вопроса для реализации в вашем ответе в качестве примера. Это предотвратит помечение системы как спам-поведение.
