私の店ではビニールステッカーを販売しています。各商品(ステッカー)には144種類のバリエーション(24色、3サイズ、2方向)があります。一意のSKUを割り当てるには、各バリエーションが必要です。
カタログを手動で入力するのは非現実的です。商品の名前、説明、メイン画像、可能なサイズや色をユーザーが指定するフォームを作成します。フォームを処理するときは、製品とそのすべてのバリエーションを作成する必要があります。
製品とそのバリエーションを作成する方法は?
私の店ではビニールステッカーを販売しています。各商品(ステッカー)には144種類のバリエーション(24色、3サイズ、2方向)があります。一意のSKUを割り当てるには、各バリエーションが必要です。
カタログを手動で入力するのは非現実的です。商品の名前、説明、メイン画像、可能なサイズや色をユーザーが指定するフォームを作成します。フォームを処理するときは、製品とそのすべてのバリエーションを作成する必要があります。
製品とそのバリエーションを作成する方法は?
私も同じような状況でした。これが私が見つけたものです。
製品は実際にはカスタム投稿タイプ(非常に明白です!:P)であるためwp_insert_post
、新しい製品を挿入するために使用できます。挿入後、新しい製品投稿タイプのIDを取得し、を使用update_post_meta
してメタキーとメタ値をそれぞれとに設定し_visibility
ますvisible
。可視性を設定しないと、新しく追加した商品がショップに表示されることはありません。または、バックエンドからの可視性を設定することもできます。製品のさまざまなサイズについては、その製品のバリエーションを使用してください。バリエーションごとに異なるタイプ、価格、SKUなどを設定できます。これらはすべてポストメタであるため、phpコードを使用してバリエーションなどを追加できます。表を調べpostmeta
て、キー名を確認してください。
Jasonがコメントで書いたように、RESTAPIはここに行く方法です。これは、HTTP RESTリクエストがなくても実行できるため、RESTインターフェイスが無効になっているWordpressインストールでも機能します。
これは私がこの目的のために作った簡単な関数です:
$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);
}
$rest_request
これは、通常REST経由で送信する配列です(こちらのドキュメントを参照してください)。
この$products_controler
関数を複数回呼び出す必要があり、毎回オブジェクトを再作成したくなかったため、変数はグローバルです。お気軽にローカルにしてください。
wp_insert_post
これはすべてのタイプの製品(シンプル、グループ化、可変など)で機能し、製品を手動で追加するよりも、WooCommerceの内部変更に対してより耐性があるはずですupdate_post_meta
。
編集:この回答がまだ時折賛成票を獲得していることを考えると、ここにWooCommerce3.0+のアップデートがあります。変更点は、バリエーションが自動的に追加されなくなったため、自分で追加する必要があることです。
これは、関数の現在のバージョンです。
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;
}
これは、ファイル内の(まもなく公開される)バージョン1.1以降のKite Print and DropshippingonDemandapi/publish_products.php
プラグインで使用されます。
データベースに直接書き込む、はるかに長い「高速」バージョンもあり、create_products_fast
将来のWP / WCの変更に対する復元力が低下する可能性がありますが、はるかに高速です(私のテストでは、34の製品範囲で数秒対数分)コンピューター)。
これは最も論理的で簡単な方法です。シンプルな製品は以下のコードを使用します:
$objProduct = new WC_Product();
可変製品の場合は、コード行の下で使用します。
$objProduct = new WC_Product_Variable();
次のステップは、名前、価格などのメタプロパティとバリアントデータ(可変商品の場合)を設定することです。
$objProduct->set_name("Product Title");
$objProduct->set_status("publish"); // can be publish,draft or any wordpress post status
$objProduct->set_catalog_visibility('visible'); // add the product visibility status
$objProduct->set_description("Product Description");
$objProduct->set_sku("product-sku"); //can be blank in case you don't have sku, but You can't add duplicate sku's
$objProduct->set_price(10.55); // set product price
$objProduct->set_regular_price(10.55); // set product regular price
$objProduct->set_manage_stock(true); // true or false
$objProduct->set_stock_quantity(10);
$objProduct->set_stock_status('instock'); // in stock or out of stock value
$objProduct->set_backorders('no');
$objProduct->set_reviews_allowed(true);
$objProduct->set_sold_individually(false);
$objProduct->set_category_ids(array(1,2,3)); // array of category ids, You can get category id from WooCommerce Product Category Section of Wordpress Admin
商品の画像をアップロードする場合は、以下のコードを使用します
function uploadMedia($image_url){
require_once('wp-admin/includes/image.php');
require_once('wp-admin/includes/file.php');
require_once('wp-admin/includes/media.php');
$media = media_sideload_image($image_url,0);
$attachments = get_posts(array(
'post_type' => 'attachment',
'post_status' => null,
'post_parent' => 0,
'orderby' => 'post_date',
'order' => 'DESC'
));
return $attachments[0]->ID;
}
// above function uploadMedia, I have written which takes an image url as an argument and upload image to wordpress and returns the media id, later we will use this id to assign the image to product.
$productImagesIDs = array(); // define an array to store the media ids.
$images = array("image1 url","image2 url","image3 url"); // images url array of product
foreach($images as $image){
$mediaID = uploadMedia($image); // calling the uploadMedia function and passing image url to get the uploaded media id
if($mediaID) $productImagesIDs[] = $mediaID; // storing media ids in a array.
}
if($productImagesIDs){
$objProduct->set_image_id($productImagesIDs[0]); // set the first image as primary image of the product
//in case we have more than 1 image, then add them to product gallery.
if(count($productImagesIDs) > 1){
$objProduct->set_gallery_image_ids($productImagesIDs);
}
}
製品を保存してWooCommerce製品IDを取得します
$product_id = $objProduct->save(); // it will save the product and return the generated product id
注:単純な製品の場合、上記の手順で十分です。以下の手順は、可変製品または属性を持つ製品の場合です。
以下のコードは、製品属性を追加するために使用されます。
$attributes = array(
array("name"=>"Size","options"=>array("S","L","XL","XXL"),"position"=>1,"visible"=>1,"variation"=>1),
array("name"=>"Color","options"=>array("Red","Blue","Black","White"),"position"=>2,"visible"=>1,"variation"=>1)
);
if($attributes){
$productAttributes=array();
foreach($attributes as $attribute){
$attr = wc_sanitize_taxonomy_name(stripslashes($attribute["name"])); // remove any unwanted chars and return the valid string for taxonomy name
$attr = 'pa_'.$attr; // woocommerce prepend pa_ to each attribute name
if($attribute["options"]){
foreach($attribute["options"] as $option){
wp_set_object_terms($product_id,$option,$attr,true); // save the possible option value for the attribute which will be used for variation later
}
}
$productAttributes[sanitize_title($attr)] = array(
'name' => sanitize_title($attr),
'value' => $attribute["options"],
'position' => $attribute["position"],
'is_visible' => $attribute["visible"],
'is_variation' => $attribute["variation"],
'is_taxonomy' => '1'
);
}
update_post_meta($product_id,'_product_attributes',$productAttributes); // save the meta entry for product attributes
}
以下のコードは、製品バリアントを追加するために使用されます。
$variations = array(
array("regular_price"=>10.11,"price"=>10.11,"sku"=>"ABC1","attributes"=>array(array("name"=>"Size","option"=>"L"),array("name"=>"Color","option"=>"Red")),"manage_stock"=>1,"stock_quantity"=>10),
array("regular_price"=>10.11,"price"=>10.11,"sku"=>"ABC2","attributes"=>array(array("name"=>"Size","option"=>"XL"),array("name"=>"Color","option"=>"Red")),"manage_stock"=>1,"stock_quantity"=>10)
);
if($variations){
try{
foreach($variations as $variation){
$objVariation = new WC_Product_Variation();
$objVariation->set_price($variation["price"]);
$objVariation->set_regular_price($variation["regular_price"]);
$objVariation->set_parent_id($product_id);
if(isset($variation["sku"]) && $variation["sku"]){
$objVariation->set_sku($variation["sku"]);
}
$objVariation->set_manage_stock($variation["manage_stock"]);
$objVariation->set_stock_quantity($variation["stock_quantity"]);
$objVariation->set_stock_status('instock'); // in stock or out of stock value
$var_attributes = array();
foreach($variation["attributes"] as $vattribute){
$taxonomy = "pa_".wc_sanitize_taxonomy_name(stripslashes($vattribute["name"])); // name of variant attribute should be same as the name used for creating product attributes
$attr_val_slug = wc_sanitize_taxonomy_name(stripslashes($vattribute["option"]));
$var_attributes[$taxonomy]=$attr_val_slug;
}
$objVariation->set_attributes($var_attributes);
$objVariation->save();
}
}
catch(Exception $e){
// handle exception here
}
}
上記のコードは、画像、属性、バリエーションを含むシンプルまたは可変のWooCommerce製品を追加するのに十分です。
Vedranの回答に基づいて、PHPを介してWooCommerce製品を投稿するための最小限のコードを次に示します。
$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 );
完全なコードが記載されているwoocommerce-with-php-codeを参照してください。
アバンギャルドが言ったように、製品はポストに追加されます:
post_type = "product"
私はこのコードを使用します:
$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');