He creado una variable de un producto («padre» del producto) en WooCommerce versión 3+. A partir de un plugin de WordPress, me gustaría crear mediante programación las variaciones del producto («los niños» producto) con los nuevos valores de atributo.

La variación de los atributos ya están establecidos en WooCommerce.

Así que cada vez que una variación es creado, el nuevo atributo de los valores debe ser creado mediante programación demasiado y se establece en la Variable primaria de productos.

Cómo puede hacerse esto? es posible?


Actualización : yo había escrito más líneas de códigos en este que yo lo deseaba, y probado muchas cosas para resolver, usando woocommerce objetos, y se añadió la falta de datos acerca de los términos, termmeta, la relación del término con el post, en la base de datos con el objeto de base de datos de WordPress – pero nada ha sido suficiente para hacer que funcione. Y yo no podía pin-punto de donde me salió mal – que es la razón por la que no podía proporcionar un más estrecho problema – las cosas por las que stackoverflow es más hecha.

  • Compartir su investigación ayuda a todos. Cuéntanos lo que has probado y por qué no satisfacer sus necesidades. Esto demuestra que usted ha tomado el tiempo para tratar de ayudarse a sí mismo, nos salva de la reiterando respuestas obvias, y la mayoría de todo lo que le ayuda a obtener una más específicos y relevantes respuesta! Véase también: Cómo Pedir
  • Debe cerrar uno de estos – stackoverflow.com/questions/47518333/…
InformationsquelleAutor Cedric | 2017-11-27

6 Comentarios

  1. 35

    Actualización de septiembre de 2018: el Manejo de la taxonomía de creación de (Gracias a Carl F. Corneil)

    De una variable definida por el ID de producto Que se encuentra abajo, una función personalizada que se va a añadir (crear) un Producto de la variación. La variable de los padres de las necesidades de producto que se han establecido para los atributos que necesitaba.

    Usted tendrá que proporcionar cierta información como:

    • la matriz de atributos/valores
    • el Sku, precios y stock….

    Estos datos se almacenan en un formato de múltiples dimensiones de la matriz de (ver ejemplo al final).

    Esta función se encargará de comprobar si los valores de los atributos (término nombre) ya existe y si no:
    – se crea el atributo de producto
    – establecer en la variable primaria de productos.

    La función personalizada código:

    /**
    * 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_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 );
    //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
    }

    Código va en function.php archivo de su niño activo tema (o temas) o también en cualquier plugin de archivo.

    De uso (por ejemplo con 2 atributos):

    $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: Crear mediante programación un producto variable y dos nuevos atributos en Woocommerce

    Usted recibirá este backend:

    Crear mediante programación un WooCommerce producto de la variación con nuevos valores de atributo

    Y funcionará perfectamente en el front-end.

    Relacionados con: Crear mediante programación un producto con los métodos CRUD en Woocommerce 3

    • La acción podría ser 0 – así que tal vez no deberíamos tener :: if( ! empty($variation_data[‘stock_qty’]) ){ ::pero :: if (isset($variation_data[‘stock_qty’]) && is_numeric($variation_data[‘stock_qty’])) {
    • He añadido algunos datos de peso (si no estoy equivocado, una variación podría tener un peso diferente de la de los padres/variable u otra variación), la descripción, la babosa .
    • si (is_numeric(($variation_data[‘peso’]))) $variación->set_weight($variation_data[‘peso’]); if (is_string(($variation_data[‘long_description’])) && strlen($variation_data[‘long_description’])) $variación->set_description($variation_data[‘long_description’]); if (is_string(($variation_data[‘slug’])) && strlen($variation_data[‘slug’])) $variación->set_slug($variation_data[‘slug’]);
    • una vez que hemos aclarado la nota anterior, se podría añadir un maniquí respuesta a la stackoverflow.com/questions/47518333/… – resolviendo el producto de la variación-con-nuevo-atributo-valor post, se han resuelto para mí el otro. Así que podría atributo que el otro post de la recompensa también.
    • Me parece algo de código es generalmente aceptable, pero seguro, no hay problema. He publicado mi sugerencia como una nueva respuesta, esperemos que usted o los demás la encuentren útil. Gracias por el código, se trabajó mucho!
    • Gracias por las soluciones que guardar mi día a día y la mayoría de todas las cosas están funcionando bien, como por su código de arriba. Es realmente necesitan ayuda completa para mí.
    • Esta respuesta no tiene sentido para mí. Usted dice que se ponga en su functions.php archivo, pero que se ejecuta en cada carga de página. Seguramente esto va a añadir constantemente las variaciones más y más?
    • ¿Cuál es la relación con mostaza? Esta respuesta responde a una pregunta y es útil para muchos. Si no se ajusta a sus necesidades, hay muchos otros temas relacionados con en internet.
    • Código anterior funciona muy bien cuidado, ten cuidado, por alguna razón, los precios deben ser cadena, no entero. El mismo código ha trabajado para el producto con el entero, pero la variación debe ser cadena. sale_price, regular_price, etc
    • será genial si pudieras por favor, hágamelo saber cómo puedo crear $variation_data si tengo los datos de esa manera imgur.com/cT1sFGJ

  2. 3

    Voy a tirar esto por ahí, ya que no pude conseguir en cualquiera de los ejemplos anteriores de trabajo. No me preguntes por qué, ya que otras personas parecen tener éxito. Así que me tomé el enfoque minimalista y tratamos de averiguar lo esencial para un atributo del producto + variación (creando manualmente en wp y buscando en la base de datos) y me encontré con 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 );

    Este no es el uso global de los atributos del producto, pero el artículo específicas. Espero que ayude a alguien como yo estaba a punto de sacar mi cabello antes de que yo tengo trabajo.

    • Estoy trabajando con este script, pero recibiendo el error «Invalid valor publicado para el atributo» y el producto no es un añadido a la cesta. ¿cómo podemos resolver el problema?
    • Esto es un poco fuera del alcance de esta respuesta, pero si tuviera que adivinar, yo diría que la variación atributo de la variante específica no coincide con los atributos asignados podría tener (como «la alternativa 1 alternativa 2»). De cualquier manera, estamos tratando con la actualización de la meta de los campos directamente en el nivel de post aquí y honestamente esto (mi solución) que en realidad debería ser un último recurso, a menos que usted realmente no puede conseguir que el trabajo con los métodos proporcionados por el oficial de WooCommerce API. Trate de mirar el producto en el nivel de base de datos (phpmyadmin o tal).
  3. 2

    Expansión en LoicTheAztec la respuesta, usted puede comprobar si el atributo de combinación que existe 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 );
    }
    //...
    }

    Ejemplo de uso de

    //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 );
    • será genial si pudieras por favor, hágamelo saber cómo puedo crear $variation_data si tengo los datos de esa manera imgur.com/cT1sFGJ
  4. 1

    Puede tener un problema si el de la taxonomía de que el producto no está registrado previamente en algún otro lugar. Si desea asegurarse de que la taxonomía existe, se puede añadir un condicional para LoicTheAztec la respuesta.

    Algo como esto.

    foreach ($variation_data['attributes'] as $attribute => $term_name )
    {
    //echo 'attribute ' . $attribute . ' term name ' . $term_name;
    $taxonomy = 'pa_' . $attribute; //The attribute taxonomy
    //Check if the Taxonomy exists, and if not we create it.
    if (! taxonomy_exists($taxonomy)){
    register_taxonomy(  
    $taxonomy,  //The name of the taxonomy. Name should be in slug form (must not contain capital letters or spaces). 
    'product',        //post type name
    array(  
    'hierarchical' => false,  
    'label' => ucfirst($taxonomy),  //Display name
    'query_var' => true,
    'rewrite' => array(
    'slug' => $taxonomy, //This controls the base slug that will display before each term
    'with_front' => false //Don't display the category base before 
    ),
    )  
    ); 
    }
    ...
    • cómo preparar variation_data?
  5. 1

    Si quieres generar productos para las pruebas en WooCommerce, puede utilizar WooCommerce Suave Generador, hecha por WooCommerce sí mismo.

    https://github.com/woocommerce/wc-smooth-generator

    Ejemplo:

    //Generate WC_Product object and save it to database
    //70% change generated product is simple
    //30% chance generated product is variable
    $product = \WC\SmoothGenerator\Generator\Product::generate();
    //Returns WC_Product object of Simple product and don't save it  to database
    $product = \WC\SmoothGenerator\Generator\Product::generate_simple_product();
    //Returns WC_Product object of Variable Product and saves it to database
    $variable_product = \WC\SmoothGenerator\Generator\Product::generate_variable_product();

    Src: https://github.com/woocommerce/wc-smooth-generator/blob/master/includes/Generator/Product.php

    Si quieres crear productos mediante programación, puede la clase de Producto con sus necesidades.

  6. 1

    que funciona, pero se necesita un poco de correcciones (2 comas en las funciones de la matriz), me hice con la edición del código para mis necesidades.

    (trabajando en wp 4.9 | wc 3.5)

    Primero los productos que necesita tener el atributo ya creada y asociada, mi taxonomía es «pa_r» nombre descriptivo «R»
    backend atributo associeated img

    la función con la corrección

    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_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 );
    //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( $taxonomy ),
    'query_var' => true,
    'rewrite' => array( 'slug' => '$taxonomy') //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
    }

    Hice un array con los datos que necesito en las variaciones [id_post, atributo, sku, regular_price, stock]

    $hijos = array(
    [9623,'265/70 R16','NE-CT-CO-USA-016-005','0',53],
    [9624,'235/65 R17','NE-AU-CO-EUR-017-050','189000',56]
    );

    y el foreach para crear dinámicamente todas las variaciones a mis productos

    foreach ($hijos as $vari) {
    //The variation data
    $variation_data =  array(
    'attributes' => array(
    'r'  => $vari[1],
    ),
    'sku'           => $vari[2],
    'regular_price' => str_replace('.', '', $vari[3]),
    'stock_qty'     => $vari[4]
    );
    //var_dump($variation_data);
    create_product_variation( $vari[0], $variation_data );
    }
    • ¿cómo puedo crear los datos de variación de los datos si se dispone de id de producto nombre del atributo, opciones , más o menos, el precio de 1647, Cobre Gskt No + 0.0000<br / > 1647 Cobre Gskt Sí + 14.9500<br / > 1647 Línea de Drenaje No + 0.0000<br / > 1647 Línea de Drenaje Sí + 3.0000<br / > de 1647, en la Línea de Alimentación No + 0.0000<br / > de 1647, en la Línea de Alimentación Sí + 45.0000<br> 1647 Línea de Drenaje No + 0.0000<br / > 1647 Línea de Drenaje Sí + 45.0000<br / >
    • en su matriz [id_post, atributo, sku, regular_price, stock] ¿qué acerca de los valores de atributo, por ejemplo. colores es un atributo y negro rojo blanco son los valores de atributo

Dejar respuesta

Please enter your comment!
Please enter your name here