2012-07-16 20 views
10

Mój sklep sprzedaje naklejki winylowe. Każdy produkt (naklejka) ma 144 odmiany (24 kolory, 3 rozmiary i 2 orientacje). Każda zmiana jest konieczna, aby przypisać unikalny kod SKU.WooCommerce: Utwórz produkt według kodu

Ręczne wypełnianie katalogu jest nierealistyczne. Mam zamiar zrobić formularz, w którym użytkownik określa nazwę, opis i główny obraz produktu, a także możliwe rozmiary i kolory. Podczas przetwarzania formularza muszę utworzyć produkt i wszystkie jego odmiany.

Jak utworzyć produkt i jego odmiany?

+0

Czy trzeba utworzyć obraz lub po prostu wydrukować możliwe opcje? – Peon

+4

Teraz jest interfejs API REST V2, polecam używanie go do tworzenia produktów. Interfejs API może zalogować się jako inny użytkownik i uwzględnia wszystkie subtelności, które mogą zostać pominięte podczas ręcznego tworzenia produktu. Obejmuje to również po prostu łączenie jednej dużej struktury danych i wysyłanie jej w jednym kroku. – Jason

Odpowiedz

16

Miałem podobną sytuację, oto co się dowiedziałem.

Produkty są w rzeczywistości custom post type (całkiem oczywiste!: P), więc można użyć wp_insert_post, aby wstawić nowy produkt. Po wstawieniu otrzymasz identyfikator nowego typu wpisu produktu, użyj update_post_meta, aby ustawić odpowiednio klucz meta i wartość meta jako _visibility i . Jeśli nie ustawisz widoczności, nowo dodany produkt nigdy nie będzie widoczny w twoim sklepie. Alternatywnie możesz ustawić widoczność również z tyłu. W przypadku różnych rozmiarów produktu należy stosować odmiany tego produktu. Możesz ustawić inny typ, cenę, SKU itp. Dla każdej odmiany. Wszystkie te są post meta, dlatego możesz użyć kodu php, aby dodać odmiany i takie tam. Przestudiuj tabelę postmeta, aby zobaczyć nazwy klawiszy.

+0

po ustawieniu 'update_post_meta ($ new_product_post_id, '_visibility', 'hidden');' ale na stronie backendu szczegółów produktu. Wciąż pokazuje ** widoczną ** wartość. co złego ? – huykon225

+0

Mam w pełni działający skrypt PHP do wstawiania/aktualizacji produktów VARIABLE z JSON do Woocommerce 3.x. Jeśli ktoś chce go kupić, skontaktuj się ze mną mani619cash AT gmail DOT com – Umair

0

Proszę odnieść się do woocommerce-with-php-code, gdzie podany jest pełny kod.

Jak powiedział Avant Garde, produkty są dodawane w poście z:

post_type = "product"

10

Jako Jason napisał w his comment, REST API jest do zrobienia tutaj. Można to zrobić nawet bez żądań HTTP REST, dzięki czemu działa nawet w instalacjach Wordpress, które mają wyłączony interfejs REST.

Oto prosta funkcja, że ​​zrobiłem w tym celu:

$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); 
} 

Tutaj $rest_request jest tablicą, że chcesz wysłać zwykle poprzez REST (patrz docs here).

Zmienna $products_controler jest globalna, ponieważ musiałem wywołać tę funkcję wiele razy i nie chciałem odtwarzać obiektu za każdym razem. Możesz to zrobić lokalnie.

Działa to dla wszystkich typów produktów (proste, zgrupowane, zmienne, ...) i powinno być bardziej odporne na zmiany wewnętrzne WooCommerce niż ręczne dodawanie produktów poprzez wp_insert_post i update_post_meta.

Edit: Biorąc pod uwagę, że ta odpowiedź jest wciąż okolicznościowy upvote, tutaj jest woocommerce 3.0+ aktualizacji. Zmiana polega na tym, że odmiany nie są już dodawane automatycznie, więc musimy to zrobić sami.

Jest to aktualna wersja funkcji:

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; 
} 

ta jest stosowana w Kite Print and Dropshipping on Demand wtyczki, zaczynając od (wkrótce zostanie opublikowany) wersji 1.1, w pliku api/publish_products.php.

Istnieje również znacznie dłuższa "szybka" wersja o nazwie create_products_fast, która zapisuje bezpośrednio do bazy danych, dzięki czemu jest potencjalnie mniej odporna na przyszłe zmiany WP/WC, ale jest znacznie szybsza (kilka sekund w porównaniu do kilku minut dla naszego 34) asortyment produktów na moim komputerze testowym).

+0

Witaj, wersja 'create_products_fast' jest częścią WC lub użyta na wtyczce Kite Print? –

+1

@ JeansK.Real Jest to funkcja wtyczki Kite (obecnie nieaktualna), w której wszystkie żądania SQL normalnie wykonywane za pomocą wielu funkcji WP (kilkaset wywołań w naszym przypadku) zostały zgrupowane tylko w 5 lub 6 masowych wywołaniach SQL, co sprawia, że ​​jest niesamowicie szybki, ale także mało odporny na zmiany WP/WC. Jako kopię zapasową dla takich przypadków mieliśmy ustawienie, które włączałoby lub wyłączało tę funkcję (w tym drugim przypadku użyto powyższej funkcji). –

0

używam tego kodu:

$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

Na podstawie Vedran's answer, tutaj jest minimalny kod do umieszczenia produktu woocommerce poprzez 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

Dziękujemy! Ta metoda jest absolutnie słuszna, ponieważ używa API WooCommerce, które chnages za każdym razem. Przetestowałem ten kod i tworzy on wszystkie niezbędne dane produktów w meta i innych tabelach. – realmag777

Powiązane problemy