Después de tanto batallar ya hallamos el arreglo de este atolladero que ciertos de nuestros lectores de este espacio han presentado. Si deseas compartir alguna información puedes compartir tu conocimiento.
Solución:
Actualización de enero de 2020: Cambiado a
WC_Product
métodoget_name()
en lugar deget_title()
Actualización de septiembre de 2018: Manejo de la creación de taxonomía (Gracias a Carl F. Corneil)
A partir de una ID de producto variable definida A continuación, encontrará una función personalizada que agregará (creará) una variación de Producto. El producto padre variable debe tener configurado el necesario attributes.
Deberá proporcionar cierta información como:
- los array de attributes/valores
- el Sku, precios y stock….
Estos datos deben almacenarse en un formato multidimensional. array (ver un ejemplo al final).
Esta función comprobará si el attributes los valores (nombre del término) ya existen y si no:
- lo crea para el producto attribute
- configúrelo en el producto de la variable principal.
El código de función personalizado:
/**
* Create a product variation for a defined variable product ID.
*
* @since 3.0.0
* @param int $product_id | Post ID of the product parent variable product.
* @param array $variation_data | The data to insert in the product.
*/
function create_product_variation( $product_id, $variation_data )
// Get the Variable product object (parent)
$product = wc_get_product($product_id);
$variation_post = array(
'post_title' => $product->get_name(),
'post_name' => 'product-'.$product_id.'-variation',
'post_status' => 'publish',
'post_parent' => $product_id,
'post_type' => 'product_variation',
'guid' => $product->get_permalink()
);
// Creating the product variation
$variation_id = wp_insert_post( $variation_post );
// Get an instance of the WC_Product_Variation object
$variation = new WC_Product_Variation( $variation_id );
// Iterating through the variations attributes
foreach ($variation_data['attributes'] as $attribute => $term_name )
$taxonomy = 'pa_'.$attribute; // The attribute taxonomy
// If taxonomy doesn't exists we create it (Thanks to Carl F. Corneil)
if( ! taxonomy_exists( $taxonomy ) )
register_taxonomy(
$taxonomy,
'product_variation',
array(
'hierarchical' => false,
'label' => ucfirst( $attribute ),
'query_var' => true,
'rewrite' => array( 'slug' => sanitize_title($attribute) ), // The base slug
),
);
// Check if the Term name exist and if not we create it.
if( ! term_exists( $term_name, $taxonomy ) )
wp_insert_term( $term_name, $taxonomy ); // Create the term
$term_slug = get_term_by('name', $term_name, $taxonomy )->slug; // Get the term slug
// Get the post Terms names from the parent variable product.
$post_term_names = wp_get_post_terms( $product_id, $taxonomy, array('fields' => 'names') );
// Check if the post term exist and if not we set it in the parent variable product.
if( ! in_array( $term_name, $post_term_names ) )
wp_set_post_terms( $product_id, $term_name, $taxonomy, true );
// Set/save the attribute data in the product variation
update_post_meta( $variation_id, 'attribute_'.$taxonomy, $term_slug );
## Set/save all other data
// SKU
if( ! empty( $variation_data['sku'] ) )
$variation->set_sku( $variation_data['sku'] );
// Prices
if( empty( $variation_data['sale_price'] ) )
$variation->set_price( $variation_data['regular_price'] );
else
$variation->set_price( $variation_data['sale_price'] );
$variation->set_sale_price( $variation_data['sale_price'] );
$variation->set_regular_price( $variation_data['regular_price'] );
// Stock
if( ! empty($variation_data['stock_qty']) )
$variation->set_stock_quantity( $variation_data['stock_qty'] );
$variation->set_manage_stock(true);
$variation->set_stock_status('');
else
$variation->set_manage_stock(false);
$variation->set_weight(''); // weight (reseting)
$variation->save(); // Save the data
El código va en el archivo function.php de su tema hijo activo (o tema) o también en cualquier archivo de complemento.
Uso (ejemplo con 2 attributes):
$parent_id = 746; // Or get the variable product id dynamically
// The variation data
$variation_data = array(
'attributes' => array(
'size' => 'M',
'color' => 'Green',
),
'sku' => '',
'regular_price' => '22.00',
'sale_price' => '',
'stock_qty' => 10,
);
// The function to be run
create_product_variation( $parent_id, $variation_data );
Probado y funciona.
Parte 2: Cree programáticamente un producto variable y dos nuevos attributes en WooCommerce
Obtendrá esto en el backend:
Y funcionará perfectamente en la parte delantera.
Relacionado: Cree programáticamente un producto utilizando métodos CRUD en Woocommerce 3
Solo voy a lanzar esto, ya que no pude hacer funcionar ninguno de los ejemplos anteriores. No me preguntes por qué otras personas parecen tener éxito. Entonces, tomé el enfoque minimalista y traté de descubrir lo esencial para un producto. attribute + variación (creándola manualmente en wp y mirando la base de datos) y se le ocurrió esto.
$article_name = 'Test';
$post_id = wp_insert_post( array(
'post_author' => 1,
'post_title' => $article_name,
'post_content' => 'Lorem ipsum',
'post_status' => 'publish',
'post_type' => "product",
) );
wp_set_object_terms( $post_id, 'variable', 'product_type' );
$attr_label = 'Test attribute';
$attr_slug = sanitize_title($attr_label);
$attributes_array[$attr_slug] = array(
'name' => $attr_label,
'value' => 'alternative 1 | alternative 2',
'is_visible' => '1',
'is_variation' => '1',
'is_taxonomy' => '0' // for some reason, this is really important
);
update_post_meta( $post_id, '_product_attributes', $attributes_array );
$parent_id = $post_id;
$variation = array(
'post_title' => $article_name . ' (variation)',
'post_content' => '',
'post_status' => 'publish',
'post_parent' => $parent_id,
'post_type' => 'product_variation'
);
$variation_id = wp_insert_post( $variation );
update_post_meta( $variation_id, '_regular_price', 2 );
update_post_meta( $variation_id, '_price', 2 );
update_post_meta( $variation_id, '_stock_qty', 10 );
update_post_meta( $variation_id, 'attribute_' . $attr_slug, 'alternative 1' );
WC_Product_Variable::sync( $parent_id );
$variation_id = wp_insert_post( $variation );
update_post_meta( $variation_id, '_regular_price', 2 );
update_post_meta( $variation_id, '_price', 2 );
update_post_meta( $variation_id, '_stock_qty', 10 );
update_post_meta( $variation_id, 'attribute_' . $attr_slug, 'alternative 2' );
WC_Product_Variable::sync( $parent_id );
Esto no está utilizando un producto global. attributes, pero específicos del artículo. Espero que ayude a alguien, ya que estaba a punto de arrancarme el pelo antes de hacerlo funcionar.
Ampliando la respuesta de LoicTheAztec, puede comprobar si el attribute Existe combinación con la siguiente modificación a su código.
function create_update_product_variation( $product_id, $variation_data )
if(isset($variation_data['variation_id']))
$variation_id = $variation_data['variation_id'];
else
// if the variation doesn't exist then create it
// Get the Variable product object (parent)
$product = wc_get_product($product_id);
$variation_post = array(
'post_title' => $product->get_title(),
'post_name' => 'product-'.$product_id.'-variation',
'post_status' => 'publish',
'post_parent' => $product_id,
'post_type' => 'product_variation',
'guid' => $product->get_permalink()
);
// Creating the product variation
$variation_id = wp_insert_post( $variation_post );
// ...
Uso de ejemplo
// The variation data
$variation_data = array(
'attributes' => array(
'size' => 'M',
'color' => 'Green',
),
'sku' => '',
'regular_price' => '22.00',
'sale_price' => '1',
'stock_qty' => 1,
);
// check if variation exists
$meta_query = array();
foreach ($variation_data['attributes'] as $key => $value)
$meta_query[] = array(
'key' => 'attribute_pa_' . $key,
'value' => $value
);
$variation_post = get_posts(array(
'post_type' => 'product_variation',
'numberposts' => 1,
'post_parent' => $parent_id,
'meta_query' => $meta_query
));
if($variation_post)
$variation_data['variation_id'] = $variation_post[0]->ID;
create_update_product_variation( $product_id, $variation_data );
Te mostramos reseñas y valoraciones
Recuerda algo, que tienes la opción de esclarecer si descubriste tu impedimento en el momento justo.