Отображение переменных атрибутов и условий продукта в архивах Woocommerce

Я пытаюсь создать список атрибутов и терминов на странице магазина с помощью крючка woocommerce_shop_loop_item_title. Цель состоит в том, чтобы получить атрибут (ы) и термин (ы) для продукта, а затем отобразить их, как в этом примере:

Цвет: красный, синий, зеленый

Размер: маленький, средний, большой

Размеры: 90 * 90, 100 * 100 и 120 * 120

но без пробелов между рядами.

Он должен «извлекать» все атрибуты, используемые с продуктом и терминами атрибутов.

Я пробовал это, но получил фатальную ошибку.

add_action( 'woocommerce_shop_loop_item_title', 'variable_att_and_terms_on_loop');
function variable_att_and_terms_on_loop() {

    foreach( $product->get_variation_attributes() as $taxonomy => $terms_slug ) {

    $taxonomy_label = wc_attribute_label( $taxonomy, $product );

    foreach($terms_slug as $term) {
        $term_name  = get_term_by('slug', $term, $taxonomy)->name;
        $attributes_and_terms_names[$taxonomy_label][$term] = $term_name;
    }
}
foreach ( $attributes_and_terms_names as $attribute_name => $terms_name ) {
    $terms_string = implode( ', ', $terms_name );
    echo '<p>' . $attribute_name . ': ' . $terms_string . '</p>';
}
}

Я тоже пробовал это:

add_action('woocommerce_shop_loop_item_title','add_attribute', 5);
function add_attribute() {
    global $product;

    $product_attributes = array( 'pa_weight', 'pa_quantity', 'pa_length', 'pa_color' );
    $attr_output = array();

    foreach( $product_attributes as $taxonomy ){
        if( taxonomy_exists($taxonomy) ){
            $label_name = get_taxonomy( $taxonomy )->labels->singular_name;
            $value = $product->get_attribute('pa_weight');

            if( ! empty($value) ){
                $attr_output[] = '<span class="'.$taxonomy.'">'.$label_name.': '.$value.'</span>';
            }
        }
    }
    echo '<div class="product-attributes">'.implode( '<br>', $attr_output ).'</div>';
}

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


person Community    schedule 01.05.2019    source источник


Ответы (1)


Обновление 2020 - устранена ошибка при попытке получить название термина из заголовка термина.

В вашем первом фрагменте кода есть несколько ошибок:

  • переменная $product не была определена
  • Функцию нужно было ограничить только переменными товарами.
  • переменная $attributes_and_terms_names не была инициализирована…

Вот обновленный код (без пробелов между строками):

add_action( 'woocommerce_shop_loop_item_title', 'variable_att_and_terms_on_loop');
function variable_att_and_terms_on_loop() {
    global $product;

    if( ! $product->is_type('variable') ) return; // Only for variable products

    $variation_attributes = $product->get_variation_attributes();

    if( sizeof($variation_attributes ) == 0 ) return; // Exit if empty

    $attributes = array(); // Initializing

    foreach( $product->get_variation_attributes() as $taxonomy => $terms_slug ) {
        $taxonomy_label = wc_attribute_label( $taxonomy, $product );

        $terms_name = array();

        foreach($terms_slug as $term_slug ) {
            // We try to get the term name when it's a term slug
            $term         = get_term_by('slug', $term_slug, $taxonomy);
            $terms_name[] = ! is_a($term, 'WP_Term') ? $term_slug : $term->name; 
        }
        $attributes[] = $taxonomy_label . ':&nbsp;' . implode( ', ', $terms_name );
    }

    echo '<div class="product-attributes">';
    echo '<span>' . implode('</span><br><span>', $attributes) . '</span>';
    echo '</div>';
}

Код находится в файле function.php вашей активной дочерней темы (активной темы). Проверено и работает.

person LoicTheAztec    schedule 02.05.2019
comment
спасибо, это работает. Всего одна мелочь; он вставляет новую строку / строку после атрибута и помещает термины в новую строку. - person ; 02.05.2019
comment
Я обновил свой первоначальный вопрос и добавил картинку, на которой показан результат. - person ; 02.05.2019
comment
@KevinAronsson Обновлено - мой настоящий ответ просто отвечает на ваш первоначальный вопрос ... Размеры и вес - это нечто другое, требующее чего-то другого, и их следует задать в новом вопросе. Задавать сразу несколько вопросов нельзя, и этого следует избегать. - person LoicTheAztec; 02.05.2019
comment
Я понимаю это, но в своем первоначальном вопросе я четко объясняю, как мне нужны представленные данные. Но это нормально. Можете ли вы помочь, чтобы не вводить термины с новой строки, как показано на рисунке? - person ; 02.05.2019
comment
@KevinAronsson Обновлено, чтобы отображать имя атрибута и термины в одной строке. - person LoicTheAztec; 02.05.2019
comment
здорово, большое спасибо за вашу помощь. Я действительно ценю это. - person ; 02.05.2019
comment
@KevinAronsson Я удалил <strong>tag, потому что кажется, что проблема заключается в правилах CSS вашей темы, связанных с этим тегом html. - person LoicTheAztec; 02.05.2019
comment
так как же нам добавить ссылку на добавленный атрибут? например:? attribute_pa_size = xl - person Solomax; 04.03.2021
comment
Используйте $term_link = get_term_link($term, $taxonomy);… см. developer.wordpress.org/reference/functions/get_term_link - person LoicTheAztec; 04.03.2021
comment
@Solomax Вам лучше задать новый связанный вопрос (добавив в свой вопрос вашу собственную реальную попытку кода), так как я не улавливаю то, что вы хотите ... Я не могу ответить в качестве комментария ... - person LoicTheAztec; 05.03.2021