Termos de atributo de produto separados por vírgula, se houver vários valores disponíveis

Jan 13 2021

No WooCommerce, estou atualmente construindo uma função que exibirá alguns atributos do produto na página da loja. Gostaria de separá-los com vírgulas se houver vários valores de atributos disponíveis, mas não sei como.

Meu código:

add_action('woocommerce_after_shop_loop_item_title', 'TitleVariations', 10);
function TitleVariations()
{
global $product; $colormonth = $product->get_attribute('color-month'); $finish = $product->get_attribute('finish'); $design = $product->get_attribute('design'); echo '<span class="variation-display">'; echo __($colormonth, 'woocommerce');
echo __($finish, 'woocommerce'); echo __($crossdesign, 'woocommerce');
echo '</span>';
}

Respostas

2 LoicTheAztec Jan 13 2021 at 22:50

O método WC_Product get_attribute()fornece uma string de valores separados por vírgulas quando há mais de um valor ... Você também precisa verificar se cada atributo diferente tem na lista um termo ...

Para obter o nome do rótulo do atributo do produto, você pode usar a wc_attribute_label()função de atributo do produto.

1). Se você deseja obter cada atributo do produto com o nome do rótulo e o (s) valor (es) do (s) termo (s) (cada atributo diferente em uma linha), você usará o seguinte.

Este código também lida com atributos de produtos personalizados :

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). Mas se você deseja obter todos os termos de atributos do produto como uma string separada por vírgulas, seu código será algo como Exibir atributos específicos do produto sob o título do produto nas páginas do arquivo Woocommerce .

Portanto, para o seu código:

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>';
    }
}

O código entra no arquivo functions.php do tema filho ativo (ou tema ativo). Deve funcionar.

3 u_mulder Jan 13 2021 at 22:14

Colete seus valores para a matriz e, em seguida, implodeesta matriz:

$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>';