php - variaciones - Obtenga atributos de productos personalizados en WooCommerce
plugin variaciones woocommerce (9)
Estoy tratando de obtener productos con valores de atributo personalizados, pero estoy fallando miserablemente en hacerlo.
Intenté hacer:
global $woocommerce, $post, $product;
$res = get_post_meta($product->id);
print_r(unserialize($res[''_product_attributes''][0]));
Y obtengo estos datos sin procesar:
[pa_koostis] => Array
(
[name] => pa_koostis
[value] =>
[position] => 0
[is_visible] => 1
[is_variation] => 0
[is_taxonomy] => 1
)
Sé que hay un valor porque lo muestra en la sección de atributos, pero no puedo encontrar la manera de mostrarlo en mi código personalizado.
Editado :
woocommerce_get_product_terms
está en desuso desde Woocommerce versión 3
Vaya con lo siguiente como @datafeedr escribió en su respuesta :
global $product;
$koostis = array_shift( wc_get_product_terms( $product->id, ''pa_koostis'', array( ''fields'' => ''names'' ) ) );
o incluso más compacto:
global $product;
$koostis = $product->get_attribute( ''pa_koostis'' );
Respuesta original:
$result = array_shift(woocommerce_get_product_terms($product->id, ''pa_koostis'', ''names''));
Actualización para 2016. Puede usar:
global $product;
echo $product->list_attributes();
Para personalizar el resultado, copie plugins/woocommerce/templates/single-product/product-attributes.php
a themes/theme-child/woocommerce/single-product/product-attributes.php
y modifique eso.
Intente obtener una matriz de nombre de atributo => valor (es) de atributo:
global $product;
$formatted_attributes = array();
$attributes = $product->get_attributes();
foreach($attributes as $attr=>$attr_deets){
$attribute_label = wc_attribute_label($attr);
if ( isset( $attributes[ $attr ] ) || isset( $attributes[ ''pa_'' . $attr ] ) ) {
$attribute = isset( $attributes[ $attr ] ) ? $attributes[ $attr ] : $attributes[ ''pa_'' . $attr ];
if ( $attribute[''is_taxonomy''] ) {
$formatted_attributes[$attribute_label] = implode( '', '', wc_get_product_terms( $product->id, $attribute[''name''], array( ''fields'' => ''names'' ) ) );
} else {
$formatted_attributes[$attribute_label] = $attribute[''value''];
}
}
}
//print_r($formatted_attributes);
return $formatted_attributes;
Es poco ineficiente, pero funciona.
La respuesta a "¿Alguna idea para obtener todos los atributos a la vez?" la pregunta es solo para llamar a la función con solo id del producto:
$array=get_post_meta($product->id);
la clave es opcional, consulte http://codex.wordpress.org/Function_Reference/get_post_meta
Obtendrá atributos como matriz en "$ formatted_attributes"
$attributes = $product->get_attributes();
foreach($attributes as $attr=>$attr_deets){
$attribute_label = wc_attribute_label($attr);
if ( isset( $attributes[ $attr ] ) || isset( $attributes[ ''pa_'' . $attr ] ) ) {
$attribute = isset( $attributes[ $attr ] ) ? $attributes[ $attr ] : $attributes[ ''pa_'' . $attr ];
if ( $attribute[''is_taxonomy''] ) {
$formatted_attributes[$attribute_label] = wc_get_product_terms( $product->id, $attribute[''name'']);
} else {
$formatted_attributes[$attribute_label] = $attribute[''value''];
}
}
}
print_r($formatted_attributes);
Puede obtener el valor único para el atributo con el siguiente código:
$pa_koostis_value = get_post_meta($product->id, ''pa_koostis'', true);
Use el código a continuación para obtener todos los atributos con detalles
global $wpdb;
$attribute_taxonomies = $wpdb->get_results( "SELECT * FROM " . $wpdb->prefix . "woocommerce_attribute_taxonomies WHERE attribute_name != '''' ORDER BY attribute_name ASC;" );
set_transient( ''wc_attribute_taxonomies'', $attribute_taxonomies );
$attribute_taxonomies = array_filter( $attribute_taxonomies ) ;
prin_r($attribute_taxonomies);
woocommerce_get_product_terms()
ahora está en desuso.
Use wc_get_product_terms()
lugar.
Ejemplo:
global $product;
$koostis = array_shift( wc_get_product_terms( $product->id, ''pa_koostis'', array( ''fields'' => ''names'' ) ) );
Más actualizada:
$product->get_attribute( ''your_attr'' );
Deberá definir $product
si no está en la página.