Saltar al contenido

Cree programáticamente una variación del producto WooCommerce con nuevos attribute valores

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étodo get_name() en lugar de get_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:

ingrese la descripción de la imagen aquí

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *