Добавьте фрагмент терминов определенных атрибутов продукта в виде класса CSS в Woocommerce

Я пытаюсь добавить имена значений атрибутов атрибута продукта в качестве имени класса для каждого элемента.

Например, у меня есть атрибут «Настроение», а имена значений: «Счастливый», «Холодный», «Энергичный», «Сосредоточенный» и «Сонный». Мне просто нужно обернуть каждое имя значения атрибута в тег span и добавить отдельный класс следующим образом:

Mood: <span class = "attribute-chill">Chill</span> <span class = "attribute-sleepy">Sleepy</span>

У меня есть код, который отображает атрибуты, но мне просто нужно добавить классы CSS.

add_action( 'woocommerce_after_shop_loop_item_title', 'display_applications_attribute_pa_mood', 5 );
    
    function display_applications_attribute_pa_mood() {
        global $product;
    
        $mood = $product->get_attribute('pa_mood');
        
        if ( $mood ) {
            printf('<span class = "attribute-mood">%1$s</span>', $mood );
        }
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ниже для конкретных определенных атрибутов продукта будет отображаться каждое имя термина, встроенное в тег <span>, с правильным желаемым значением свойства класса:

add_action( 'woocommerce_after_shop_loop_item_title', 'display_application_attributes', 5 );
function display_application_attributes() {
    global $product;

    // Define your desired product attribute taxonomies to be displayed
    $attribute_taxonomies = array('pa_mood', 'pa_potency'); 

    // Loop through defined taxonomies
    foreach ( $attribute_taxonomies as $taxonomy ) {
        // Get term names coma separated  string
        $term_names = $product->get_attribute($taxonomy);
        
        if ( $term_names ) {
            $output_terms = array(); // Initialize

            // Loop through term names
            foreach ( explode(', ', $term_names) as $term_name ) {
                $output_terms[] = sprintf( '<span class = "attribute-%s">%s</span>', 
                    sanitize_title($term_name), $term_name );
            }
            printf( '<div><strong>%s:</strong> %s</div>', 
                wc_attribute_label($taxonomy), implode(' ', $output_terms) );
        }
    }
}

Это должно работать так, как вы ожидаете.


Дополнение (на основе вашего комментария):

Показан только один термин (а если больше, то остальные учитываются):

add_action( 'woocommerce_after_shop_loop_item_title', 'display_application_attributes', 5 );
function display_application_attributes() {
    global $product;

    // Define your desired product attribute taxonomies to be displayed
    $attribute_taxonomies = array('pa_mood', 'pa_potency'); 

    // Loop through defined taxonomies
    foreach ( $attribute_taxonomies as $taxonomy ) {
        // Get term names coma separated  string
        $term_names = $product->get_attribute($taxonomy);
        
        if ( $term_names ) {
            $term_names   = (array) explode(', ', $term_names);
            $terms_count  = count($term_names) - 1;
            $term_name    = current($term_names);
            $count_string = $terms_count > 0 ? ' (+' . $terms_count . ')' : '';

            printf( '<div><strong>%s:</strong> <span class = "attribute-%s">%s%s</span></div>', 
                wc_attribute_label($taxonomy), sanitize_title($term_name), $term_name, $count_string
            );
        }
    }
}

Это должно работать так, как вы ожидаете.

@loictheaztec большое спасибо. Это было прекрасно. Если можно, еще кое-что... Можно ли как-нибудь показать только одно имя атрибута? (Даже если назначено несколько атрибутов). Пример: Настроение: Холод (+2) или просто Настроение: Холод.

Miguel Gomes 03.07.2024 17:11

@MiguelGomes Добавил дополнение для этого…

LoicTheAztec 06.07.2024 16:58

Еще раз спасибо... Что, если я хочу, чтобы эти атрибуты также отображались на страницах корзины/мини-корзины и оформления заказа под названием продукта?

Miguel Gomes 10.07.2024 14:58

@MiguelGomes Если вы хотите, чтобы эти атрибуты также отображались в корзине/мини-корзине и при оформлении заказа, вам следует сначала выполнить поиск, попытаться задать новый соответствующий подробный вопрос.

LoicTheAztec 10.07.2024 19:11

Я искал и не смог найти ничего подходящего. Вот почему я спросил здесь.

Miguel Gomes 10.07.2024 20:14

@MiguelGomes См. этот ответ или этот ответ адаптация вашего кода.

LoicTheAztec 10.07.2024 21:18

Я попробовал это решение, но, как я уже сказал, оно не сработало. Кроме того, этот код был написан 5 лет назад. Поверьте мне, я провожу исследование, прежде чем просить о помощи.

Miguel Gomes 10.07.2024 21:41

@MiguelGomes Код пятилетней давности все еще работает… Теперь это зависит от вашей темы, от того, используете ли вы блоки корзины/оформления заказа или нет, от типа продукта, добавленного в корзину, и многого другого… Так что ваш вопрос не может быть можно ответить в виде комментария к вопросу-комментарию.

LoicTheAztec 10.07.2024 23:01

Другие вопросы по теме