Atributo añadido programáticamente, configurado para 'mostrar en página de producto' automáticamente. Woocommerce
He escrito un script para importar productos a una nueva instalación de Woocommerce.
Los productos tienen atributos configurados en el administrador. Este fragmento de código añade los atributos durante la importación.
update_post_meta($product_id, 'common_name', $product['common_name']);
wp_set_object_terms($product_id, $product['flowering_period'], 'pa_flowering');
wp_set_object_terms($product_id, $product['native_plant'], 'pa_native');
Sin embargo, cuando reviso el atributo del producto en el administrador, la casilla de verificación para 'mostrar en la página del producto' está desmarcada.
¿Hay alguna manera de configurar esto como marcado usando la función anterior? O ¿Importa si esto está marcado o no, si llamo al atributo en la plantilla directamente usando algo como get_the_term_list (aunque la mayoría de mis atributos tienen un solo término) se mostrará, o tener esta casilla marcada anula su visualización?
En realidad no importa porque WooCommerce usa esto, para mostrar:
$values = wc_get_product_terms( $product->id, $attribute['name'], array( 'fields' => 'names' ) );
Sin embargo, si no configuras la visualización como verdadera, tendrías que agregar este código a tus archivos de plantilla. Es posible que también tengas que hacer otras cosas (estilos, etc.). Si simplemente configuras la visualización como verdadera, no tienes que hacer nada. WooCommerce se encargará de ello.
Así es como WooCommerce lo hace, aproximadamente (/includes/class-wc-ajax.php):
wp_set_object_terms( $product_id, $values, $attribute_name);
// obtener atributos existentes
$attributes = get_post_meta( $product_id, '_product_attributes' );
$attributes[ sanitize_title( $attribute_name ) ] = array(
'name' => wc_clean( $attribute_name ),
'value' => $values,
'position' => $attribute_position, // el orden en que se muestra
'is_visible' => $is_visible, // este es el que querías, configurar como verdadero
'is_variation' => $is_variation, // configurar como verdadero si se usará para variaciones
'is_taxonomy' => $is_taxonomy // configurar como verdadero
);
// esta parte ordena los atributos antes de guardar basado en el valor de posición
// esto está definido por WooCommerce, pero si tu importación se ejecuta antes de que WooCommerce esté cargado, esta función no estará disponible
if ( ! function_exists( 'attributes_cmp' ) ) {
function attributes_cmp( $a, $b ) {
if ( $a['position'] == $b['position'] ) {
return 0;
}
return ( $a['position'] < $b['position'] ) ? -1 : 1;
}
}
uasort( $attributes, 'attributes_cmp' );
// actualizarlo de nuevo
update_post_meta( $post_id, '_product_attributes', $attributes );
