Obtener atributos de producto Simple en WooCommerce
Necesito obtener los atributos de un producto en WooCommerce, del tipo producto Simple. Algunos productos pueden tener atributos como desplegable (dropdown), pero muchas opciones como botones de radio.
¿Cómo puedo hacer esto? ¿Cómo es posible?
Con las variaciones no tengo problema, pero para productos simples no puedo obtenerlos.
// Obtener todos los atributos de un producto simple
$product = wc_get_product($product_id);
$attributes = $product->get_attributes();
foreach($attributes as $attribute) {
// Obtener el nombre del atributo
$attribute_name = $attribute->get_name();
// Obtener los términos/valores del atributo
if($attribute->is_taxonomy()) {
$attribute_terms = wp_get_post_terms($product->get_id(), $attribute_name, array('fields' => 'names'));
} else {
$attribute_terms = $attribute->get_options();
}
// Mostrar los resultados
echo "Atributo: " . wc_attribute_label($attribute_name);
echo "Valores: " . implode(', ', $attribute_terms);
}
Utilizarás el método WC_Product
llamado get_attributes()
que devuelve un array como:
global $product;
if ( get_post_type( $post ) === 'product' && ! is_a($product, 'WC_Product') ) {
$product = wc_get_product( get_the_id() ); // Obtiene el Objeto WC_Product
}
$product_attributes = $product->get_attributes(); // Obtiene los atributos del producto
// Salida en bruto
echo '<pre>'; print_r( $product_attributes ); echo '</pre>';
Debería funcionar (para atributos reales del producto).
Ahora bien, si utilizas algunos plugins de terceros, como complementos de productos adicionales, por ejemplo, estos agregan campos personalizados al producto, pero no son atributos del producto…

Esto obtiene un array de todos los atributos, que puede usarse para obtener un atributo individual reemplazando print_r($product_attributes)
con algo como print_r($product_attributes['pa_color'])
sin embargo eso solo devuelve un ID del término, por lo que se necesitaría hacer más para obtener el título del término a partir de ese ID.

Basado en la respuesta de Loic para un atributo de pa_manufacturer
:
if ( get_post_type( $post ) === 'product' && ! is_a($product, 'WC_Product') ) {
$product = wc_get_product( get_the_id() ); // Obtiene el objeto WC_Product
}
$product_attributes = $product->get_attributes(); // Obtiene los atributos del producto
// Salida
$manufacturer_id = $product_attributes['pa_manufacturer']['options']['0']; // devuelve el ID del término
$manufacturer_name = get_term( $manufacturer_id )->name; // obtiene el nombre del término desde el ID
echo '<p class="manufacturer">'.$manufacturer_name.'</p>'; // muestra el nombre real del término
