WooCommerce: 코드로 제품 생성
저희 가게는 비닐 스티커를 팝니다.각 제품(스티커)은 144가지 종류(24가지 색상, 3가지 크기, 2가지 방향)가 있습니다.고유한 SKU를 할당하려면 각 변형이 필요합니다.
수동으로 카탈로그를 채우는 것은 비현실적입니다.제품의 이름, 설명, 메인 이미지, 가능한 사이즈, 색상을 사용자가 지정하는 폼을 만듭니다.양식을 처리할 때 제품과 그 모든 변형을 만들어야 합니다.
제품 및 그 변형을 만드는 방법
저도 비슷한 상황이었는데, 제가 알아낸 사실은 이렇습니다.
제품은 실제로는 커스텀 포스트 타입(매우 당연한!:P)이므로,wp_insert_post
새 제품을 삽입합니다.삽입 후 새 제품 게시물 유형의 ID를 얻습니다.update_post_meta
메타키와 메타값을 설정하다_visibility
그리고.visible
각각 다음과 같다.가시성을 설정하지 않으면 새로 추가된 제품이 상점에 표시되지 않습니다.또는 백엔드에서 가시성을 설정할 수도 있습니다.제품의 다양한 사이즈는 해당 제품의 변형을 사용하십시오.종류별, 가격, SKU 등을 다르게 설정할 수 있습니다.이것들은 모두 포스트 메타이기 때문에, php 코드를 사용해 바리에이션등을 추가할 수 있습니다.를 조사하다postmeta
테이블에서 키 이름을 확인합니다.
Jason이 댓글로 쓴 것처럼 REST API가 여기 가는 길이에요.이는 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
이 함수를 여러 번 호출해야 하고 매번 개체를 다시 만들고 싶지 않았기 때문에 변수는 글로벌합니다.자유롭게 로컬로 만들 수 있습니다.
이것은 모든 종류의 제품(심플, 그룹화, 변수 등)에 대응합니다.또한 WooCommerce의 내부 변경에 대해 WooCommerce를 통해 제품을 수동으로 추가하는 것보다 내성이 높아야 합니다.wp_insert_post
그리고.update_post_meta
.
편집: 이 답변은 여전히 가끔 상향투표를 받을 수 있습니다.다음은 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;
}
이것은, (곧 공개 예정)버전 1.1부터의 주문형 Kite Print and Dropshipping 플러그 인에서 사용되고 있습니다.api/publish_products.php
.
긴 "인 "빠른" 버전도 .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 );
이것이 가장 논리적이고 쉬운 방법이다.심플한 제품은 다음 코드를 사용합니다.
$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 제품을 추가하는 데 충분합니다.
완전한 코드가 기재되어 있는 「woocommerce-with-php-code」를 참조해 주세요.
Avant Garde가 말했듯이, 제품에는 다음과 같은 기능이 추가되어 있습니다.
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');
언급URL : https://stackoverflow.com/questions/11503646/woocommerce-create-product-by-code
'programing' 카테고리의 다른 글
외부 키 및 외부 키가 Oracle DB에서 참조하는 테이블 목록 (0) | 2023.03.01 |
---|---|
AngularJS: Angular 외부에서 서비스를 업데이트해야 합니다. (0) | 2023.03.01 |
Spring Boot 앱의 웹 소켓 - 403 금지 (0) | 2023.03.01 |
WooCommerce get_sku(); 제품 바리에이션 순서 (0) | 2023.03.01 |
Spring ResponseStatusException이 이유를 반환하지 않음 (0) | 2023.03.01 |