Как отобразить названия тегов товаров WooCommerce на главной странице и страницах категорий

4 окт. 2017 г., 15:31:25
Просмотры: 28.2K
Голосов: 1

Я пытаюсь отобразить теги товаров WooCommerce на главной странице и страницах категорий. Вместе с названием товара тема должна отображать все теги в алфавитном порядке, разделенные символом "·".

Например: Тег 1 · Тег 2 · Тег 3

Вот что у меня есть на данный момент:

<?php echo get_the_tag_list('<span class="woocommerce-display-tag">Теги: ',' · ','</span>');?>

Результат пустой.

Как можно это исправить?

0
Все ответы на вопрос 2
2

Я думаю, что функция 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> }. Не хватает кавычки '.

4 окт. 2017 г. 15:56:57
Комментарии

Спасибо! Теперь я использую:

`// получаем 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>

}`

Знаете, как можно убрать последнюю ·?

illmasterj illmasterj
4 окт. 2017 г. 19:04:01

@illmasterj вы можете убрать последнюю · с помощью CSS или PHP. Я только что обновил свой ответ двумя разными методами.

LWS-Mo LWS-Mo
6 окт. 2017 г. 13:49:51
1

Теперь вы можете использовать функцию 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>
12 окт. 2020 г. 18:27:37
Комментарии

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

Howdy_McGee Howdy_McGee
12 окт. 2020 г. 19:11:58