私の店ではビニールステッカーを販売しています。各商品(ステッカー)には144種類のバリエーション(24色、3サイズ、2方向)があります。一意のSKUを割り当てるには、各バリエーションが必要です。
カタログに手動で入力するのは非現実的です。ユーザーが商品の名前、説明、メイン画像、および可能なサイズと色を指定するフォームを作成します。フォームを処理するときは、製品とそのすべてのバリエーションを作成する必要があります。
製品とそのバリエーションを作成する方法は?
私も同じような状況でした。これが私が見つけたものです。
商品は実際には カスタム投稿タイプ (非常に明白です!:P)なので、wp_insert_post
を使用して新しい商品を挿入できます。挿入後、新しい製品投稿タイプのIDを取得し、update_post_meta
を使用して、メタキーとメタ値をそれぞれ_visibility
とvisible
に設定します。可視性を設定しないと、新しく追加した商品がショップに表示されることはありません。または、バックエンドからの可視性を設定することもできます。製品のさまざまなサイズについては、その製品のバリエーションを使用してください。バリエーションごとに異なるタイプ、価格、SKUなどを設定できます。これらはすべてポストメタであるため、phpコードを使用してバリエーションなどを追加できます。 postmeta
テーブルを調べて、キー名を確認します。
Jasonが書いたように 彼のコメント 、REST APIはここに行く方法です。これは、HTTP RESTリクエストがなくても実行できます。 、WordpressRESTインターフェースが無効になっているインストール)でも機能するようにします。
これは私がこの目的のために作った簡単な関数です:
$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
およびupdate_post_meta
を介して製品を手動で追加するよりも、WooCommerceの内部変更に対する耐性が高いはずです。
編集:この回答がまだ時折賛成票を獲得していることを考えると、ここにWooCommerce 3.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;
}
これは、ファイルapi/publish_products.php
の(まもなく公開される)バージョン1.1以降の Kite Print and Dropshipping on Demand プラグインで使用されます。
データベースに直接書き込むcreate_products_fast
と呼ばれるはるかに長い「高速」バージョンもあり、将来のWP/WCの変更に対する復元力が低下する可能性がありますが、はるかに高速です(34の場合は数秒対数分)製品は私のテストコンピュータにあります)。
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');