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

3
Josh933 13 Янв 2021 в 18:06

2 ответа

Лучший ответ

Метод WC_Product get_attribute() выдает строку значений, разделенных запятыми, когда имеется более одного значения… Вам также необходимо проверить, что каждый другой атрибут имеет в списке один термин

Чтобы получить имя метки атрибута продукта, вы можете использовать функцию атрибута продукта wc_attribute_label().

1). Если вы хотите получить каждый атрибут продукта с названием ярлыка и значением (ями) термина (ов) (каждый отдельный атрибут в одной строке), вы вместо этого воспользуетесь следующим.

Этот код обрабатывает также настраиваемые атрибуты продукта :

add_action('woocommerce_after_shop_loop_item_title', 'display_loop_product_attributtes', 10);
function display_loop_product_attributtes()
{
    global $product;
    
    // Here define your product attribute names (slugs)
    $attribute_names = array('color-month', 'finish', 'design'); 
    $attributes      = array(); // Initializing
    
    // Loop Through product attributes array
    foreach( $attribute_names as $attribute_name ) {
        if( taxonomy_exists( 'pa_' . $attribute_name )  ) {
            $attribute = 'pa_' . $attribute_name; // Custom taxonomy
        } else {
            $attribute = $attribute_name; // Custom attribute (not a taxonomy)
        }

        $values_str = $product->get_attribute($attribute);

        if ( $values_str ) {
            $attributes[] = '<strong>' . wc_attribute_label($attribute) . ':</strong> ' . $values_str;
        }
    }

    // Output product attribute label / values pairs (one by line)
    if( ! empty( $attributes ) ) { 
        echo '<span class="variation-display">' . implode( '<br>', $attributes ) . '</span>';
    }
}

2). Но если вы хотите получить все термины атрибутов вашего продукта в виде строки, разделенной запятыми, ваш код будет выглядеть примерно так: Отображать определенные атрибуты продукта под названием продукта на страницах архива Woocommerce .

Итак, для вашего кода:

add_action('woocommerce_after_shop_loop_item_title', 'display_loop_product_attributtes', 10);
function display_loop_product_attributtes()
{
    global $product;
        
    $color_month = $product->get_attribute('color-month');
    $finish      = $product->get_attribute('finish');
    $design      = $product->get_attribute('design');

    $attributes  = array(); // Initializing
    
    if ( $color_month ) {
        $attributes[] = $color_month;
    }
    if (  $finish ) {
        $attributes[] = $finish;
    }
    if ( $design ) {
        $attributes[] = $design;
    }

    // Output product attribute values
    if( ! empty( $attributes ) ) { 
        echo '<span class="variation-display">' . implode( ', ', $attributes ) . '</span>';
    }
}

Код находится в файле functions.php активной дочерней темы (или активной темы). Должно работать.

2
LoicTheAztec 13 Янв 2021 в 16:51

Соберите свои значения в массив, а затем implode в этот массив:

$values = [
    __($colormonth, 'woocommerce'),
    __($finish, 'woocommerce'),
    __($crossdesign, 'woocommerce'),
];

// if some values returned by `__()` are empty strings, 
// you can filter your array so as to remove them
$values = array_filter($values);

echo '<span class="variation-display">';
echo implode(', ', $values);
echo '</span>';
3
u_mulder 13 Янв 2021 в 15:47
65704578