2012-07-16 31 views
10

Mi tienda vende pegatinas de vinilo. Cada producto (pegatina) tiene 144 variaciones (24 colores, 3 tamaños y 2 orientaciones). Cada variación es necesaria para asignar un SKU único.WooCommerce: Crear producto por código

La carga manual del catálogo no es realista. Voy a hacer un formulario en el que el usuario especifique el nombre, la descripción y la imagen principal del producto, así como los posibles tamaños y colores. Al procesar el formulario, necesito crear un producto y todas sus variaciones.

¿Cómo crear un producto y sus variaciones?

+0

¿Es necesario crear una imagen o simplemente imprimir posible opciones? – Peon

+4

Ahora hay una API REST V2, recomendaría usar eso para crear productos. La API puede iniciar sesión como un usuario diferente y satisface todas las sutilezas que pueden pasarse por alto al construir un producto manualmente. También implica juntar una única estructura de datos grande y enviarla para que se configure en una sola acción. – Jason

Respuesta

16

Tuve una situación similar, esto es lo que descubrí.

Los productos son en realidad un custom post type (¡bastante obvio!: P), por lo que puede usar wp_insert_post para insertar un nuevo producto. Después de insertar, obtiene la identificación del nuevo tipo de publicación de producto, use update_post_meta para establecer una clave meta y un valor meta como _visibility y visible, respectivamente. Si no establece la visibilidad, su producto recién agregado nunca será visible en su tienda. Alternativamente, también puede configurar la visibilidad desde el back-end. Para los diversos tamaños del producto, use variaciones en ese producto. Puede establecer un tipo diferente, precio, SKU, etc. para cada variación. Todos estos son post meta, por lo tanto, puede usar el código php para agregar las variaciones y esas cosas. Estudie la tabla postmeta para ver los nombres de las teclas.

+0

cuando configuro 'update_post_meta ($ new_product_post_id, '_visibility', 'hidden');' pero en la página de back-end de detalles del producto. Aún muestra el valor ** visible **. Qué equivocado ? – huykon225

+0

Tengo un script PHP totalmente funcional para insertar/actualizar productos VARIABLE de JSON en Woocommerce 3.x. Si alguno quiere comprarlo, contácteme mani619cash AT gmail DOT com – Umair

0

Consulte woocommerce-with-php-code, donde se proporciona el código completo.

Como dijo Avant Garde, los productos se añaden en la entrada en:

post_type = "product"

10

Como Jason escribió en his comment, API REST es el camino a seguir aquí. Esto puede hacerse incluso sin solicitudes HTTP REST, lo que hace que funcione incluso en instalaciones de Wordpress que tienen su interfaz REST deshabilitada.

Aquí es una función simple que hice para este propósito:

$products_controler = new WC_REST_Products_Controller(); 
function create_item($rest_request) { 
    global $products_controler; 
    if (!isset($rest_request['status'])) 
     $rest_request['status'] = 'publish'; 
    $wp_rest_request = new WP_REST_Request('POST'); 
    $wp_rest_request->set_body_params($rest_request); 
    return $products_controler->create_item($wp_rest_request); 
} 

Aquí, $rest_request es una matriz que desea enviar por lo general a través de REST (véase los documentos here). La variable $products_controler es global porque necesitaba llamar a esta función varias veces y no quería volver a crear el objeto cada vez. Siéntase libre de hacerlo local.

Esto funciona para todo tipo de productos (simple, agrupado, variable, ...) y debería ser más resistente a los cambios internos de WooCommerce que agregar los productos manualmente a través de wp_insert_post y update_post_meta.

Editar: Dado que esta respuesta aún así obtener un upvote de vez en cuando, aquí es una WooCommerce 3.0+ actualización. El cambio es que las variaciones ya no se agregan automáticamente, por lo que tenemos que hacerlo por nosotros mismos.

Esta es la versión actual de la función:

protected function create_item($rest_request) { 
    if (! isset($rest_request['status'])) { 
     $rest_request['status'] = $this->plugin->get_option('default_published_status'); 
    } 
    if (! isset($this->products_controler)) { 
     $this->products_controler = new WC_REST_Products_Controller(); 
    } 
    $wp_rest_request = new WP_REST_Request('POST'); 
    $wp_rest_request->set_body_params($rest_request); 
    $res = $this->products_controler->create_item($wp_rest_request); 
    $res = $res->data; 
    // The created product must have variations 
    // If it doesn't, it's the new WC3+ API which forces us to build those manually 
    if (! isset($res['variations'])) 
     $res['variations'] = array(); 
    if (count($res['variations']) == 0 && count($rest_request['variations']) > 0) { 
     if (! isset($this->variations_controler)) { 
      $this->variations_controler = new WC_REST_Product_Variations_Controller(); 
     } 
     foreach ($rest_request['variations'] as $variation) { 
      $wp_rest_request = new WP_REST_Request('POST'); 
      $variation_rest = array(
       'product_id' => $res['id'], 
       'regular_price' => $variation['regular_price'], 
       'image' => array('id' => $variation['image'][0]['id'],), 
       'attributes' => $variation['attributes'], 
      ); 
      $wp_rest_request->set_body_params($variation_rest); 
      $new_variation = $this->variations_controler->create_item($wp_rest_request); 
      $res['variations'][] = $new_variation->data; 
     } 
    } 
    return $res; 
} 

Esto se utiliza en Kite Print and Dropshipping on Demand plugin, a partir de la versión (que pronto será publicado) 1.1, en el archivo api/publish_products.php.

También hay una versión "rápida" mucho más larga llamada create_products_fast que escribe directamente en la base de datos, lo que la hace potencialmente menos resistente a futuros cambios de WP/WC, pero es mucho más rápida (unos pocos segundos contra unos pocos minutos). gama de productos en mi computadora de prueba).

+0

Hola, la versión 'create_products_fast' es parte del WC o se usa en el complemento Kite Print? –

+1

@ JeansK.Real Es una función en el complemento del Kite (ahora descontinuado), en el que todas las solicitudes SQL normalmente realizadas a través de muchas funciones de WP (unos cientos de llamadas en nuestro caso) se agruparon en solo 5 o 6 llamadas SQL a granel, lo hace increíblemente rápido, pero tampoco muy resistente a los cambios de WP/WC. Como respaldo para tales casos, teníamos una configuración que activaría o desactivaría la característica (en este último caso, se usó la función anterior en su lugar). –

0

utilizo este código:

$sku = 21333; 
$size = 'S'; 
$stock = 2; 
$price_a = 60; 
$price_b = 30; 

$product_parent = get_product_by_sku($sku); 
$product = new WC_Product_Variable($product_parent->id); 
$variations = $product->get_available_variations(); 

// First off all delete all variations 
foreach($variations as $prod_variation) { 
    $metaid=mysql_query("SELECT meta_id FROM wp_postmeta WHERE post_id = ".$prod_variation['variation_id']); 
    while ($row = mysql_fetch_assoc($metaid)) { 
    mysql_query("DELETE FROM wp_postmeta WHERE meta_id = ".$row['meta_id']); 
    } 
    mysql_query("DELETE FROM wp_posts WHERE ID = ".$prod_variation['variation_id']); 
} 

// Now add new variation 
$thevariation = array(
    'post_title'=> '', 
    'post_name' => 'product-' . $product_parent->id . '-variation', 
    'post_status' => 'publish', 
    'post_parent' => $product_parent->id, 
    'post_type' => 'product_variation', 
    'guid'=>home_url() . '/?product_variation=product-' . $product_parent->id . '-variation' 
); 
$variation_id = wp_insert_post($thevariation); 
update_post_meta($variation_id, 'post_title', 'Variation #' . $variation_id . ' of '. $product_parent->id); 

wp_set_object_terms($variation_id, $size, 'pa_size'); 
update_post_meta($variation_id, 'attribute_pa_size', $size); 

update_post_meta($variation_id, '_regular_price', $price_a); 
update_post_meta($variation_id, '_downloadable_files', ''); 
update_post_meta($variation_id, '_download_expiry', ''); 
update_post_meta($variation_id, '_download_limit', ''); 
update_post_meta($variation_id, '_sale_price_dates_to', ''); 
update_post_meta($variation_id, '_sale_price_dates_from', ''); 
update_post_meta($variation_id, '_backorders', 'no'); 
update_post_meta($variation_id, '_stock_status', 'instock'); 
update_post_meta($variation_id, '_height', ''); 
update_post_meta($variation_id, '_manage_stock', 'yes'); 
update_post_meta($variation_id, '_width', ''); 
update_post_meta($variation_id, '_sale_price_dates_from', ''); 
update_post_meta($variation_id, '_backorders', 'no'); 
update_post_meta($variation_id, '_stock_status', 'instock'); 
update_post_meta($variation_id, '_manage_stock', 'yes'); 
update_post_meta($variation_id, '_height', ''); 
update_post_meta($variation_id, '_width', ''); 
update_post_meta($variation_id, '_length', ''); 
update_post_meta($variation_id, '_weight', ''); 
update_post_meta($variation_id, '_downloadable', 'no'); 
update_post_meta($variation_id, '_virtual', 'no'); 
update_post_meta($variation_id, '_thumbnail_id', '0'); 
update_post_meta($variation_id, '_sku', ''); 

update_post_meta($variation_id, '_sale_price', $price_b); 
update_post_meta($variation_id, '_price', $price_b); 
update_post_meta($product_parent->id, '_min_variation_price', $price_b); 
update_post_meta($product_parent->id, '_max_variation_price', $price_b); 
update_post_meta($product_parent->id, '_min_price_variation_id', $variation_id); 
update_post_meta($product_parent->id, '_max_price_variation_id', $variation_id); 
update_post_meta($product_parent->id, '_min_variation_regular_price', $price_a); 
update_post_meta($product_parent->id, '_max_variation_regular_price', $price_a); 
update_post_meta($product_parent->id, '_min_regular_price_variation_id', $variation_id); 
update_post_meta($product_parent->id, '_max_regular_price_variation_id', $variation_id); 
update_post_meta($product_parent->id, '_min_variation_sale_price', $price_b); 
update_post_meta($product_parent->id, '_max_variation_sale_price', $price_b); 
update_post_meta($product_parent->id, '_min_sale_price_variation_id', $variation_id); 
update_post_meta($product_parent->id, '_max_sale_price_variation_id', $variation_id); 
update_post_meta($product_parent->id, '_price', $price_b); 

update_post_meta($variation_id, '_stock', $stock); 
update_post_meta($product_parent->id, 'post_status', 'publish'); 
4

Basado en Vedran's answer, aquí está el código mínimo para publicar un producto WooCommerce a través de PHP:

$data = [ 
    'name' => 'Test product', 
    'description' => 'Lorem ipsum', 
]; 
$request = new WP_REST_Request('POST'); 
$request->set_body_params($data); 
$products_controller = new WC_REST_Products_Controller; 
$response = $products_controller->create_item($request); 
+1

¡Gracias! De esta manera es absolutamente correcto, ya que usa la API de WooCommerce, que funciona cada vez. Probé este código y crea todos los datos de productos necesarios en meta y otras tablas. – realmag777

Cuestiones relacionadas