programing

Woocommerce 3에서 CRUD 메서드를 사용하여 프로그래밍 방식으로 제품 생성

lastmoon 2023. 3. 23. 23:04
반응형

Woocommerce 3에서 CRUD 메서드를 사용하여 프로그래밍 방식으로 제품 생성

PHP 코드를 사용하여 프로그래밍 방식으로 새로운 Woocommerce 제품을 만들고 싶은데 Woocommerce 3 CRUD 방식으로 사용해 보았습니다.

//Woocommerce CRUD
$objProduct = new WC_Product_Simple();

$objProduct->set_name('My Product 1'); //Set product name.
$objProduct->set_status('publish'); //Set product status.
//$objProduct->set_featured(FALSE); //Set if the product is featured.                          | bool
$objProduct->set_catalog_visibility('visible'); //Set catalog visibility.                   | string $visibility Options: 'hidden', 'visible', 'search' and 'catalog'.
$objProduct->set_description('My custom long description'); //Set product description.
//$objProduct->set_short_description('My short description'); //Set product short description.
//$objProduct->set_sku('U-123'); //Set SKU

$objProduct->set_price(5.00); //Set the product's active price.
//$objProduct->set_regular_price(5.00); //Set the product's regular price.
//$objProduct->set_sale_price(); //Set the product's sale price.
//$objProduct->set_date_on_sale_from(); //Set date on sale from.                              | string|integer|null $date UTC timestamp, or ISO 8601 DateTime. If the DateTime string has no timezone or offset, WordPress site timezone will be assumed. Null if their is no date.
//$objProduct->set_date_on_sale_to();//Set date on sale to.                                   | string|integer|null $date UTC timestamp, or ISO 8601 DateTime. If the DateTime string has no timezone or offset, WordPress site timezone will be assumed. Null if their is no date.

//$objProduct->set_manage_stock(TRUE); //Set if product manage stock.                         | bool
//$objProduct->set_stock_quantity(10); //Set number of items available for sale.
//$objProduct->set_stock_status('instock'); //Set stock status.                               | string $status 'instock', 'outofstock' and 'onbackorder'
//$objProduct->set_backorders('no'); //Set backorders.                                        | string $backorders Options: 'yes', 'no' or 'notify'.
//$objProduct->set_sold_individually(FALSE); //Set if should be sold individually.            | bool

//$objProduct->set_weight(); //Set the product's weight.
//$objProduct->set_length(); //Set the product length.
//$objProduct->set_width(); //Set the product width.
//$objProduct->set_height(); //Set the product height.

//$objProduct->set_upsell_ids($upsell_ids); //Set upsell IDs.                               | array $upsell_ids IDs from the up-sell products.
//$objProduct->set_cross_sell_ids($cross_sell_ids); //Set crosssell IDs.                    | array $cross_sell_ids IDs from the cross-sell products.

$objProduct->set_reviews_allowed(TRUE); //Set if reviews is allowed.                        | bool

//$objProduct->set_purchase_note($purchase_note); //Set purchase note.                      | string $purchase_note Purchase note.


$attribute = new WC_Product_Attribute();
$attribute->set_id(wc_attribute_taxonomy_id_by_name('pa_color')); //if passing the attribute name to get the ID
$attribute->set_name('pa_color'); //attribute name
$attribute->set_options('red'); // attribute value
$attribute->set_position(1); //attribute display order
$attribute->set_visible(1); //attribute visiblity
$attribute->set_variation(0);//to use this attribute as varint or not

$raw_attributes[] = $attribute; //<--- storing the attribute in an array

$attribute = new WC_Product_Attribute();
$attribute->set_id(25);
$attribute->set_name('pa_size');
$attribute->set_options('XL');
$attribute->set_position(2);
$attribute->set_visible(1);
$attribute->set_variation(0);

$raw_attributes[] = $attribute; //<--- storing the attribute in an array

$objProduct->set_attributes($raw_attributes); //Set product attributes.                   | array $raw_attributes Array of WC_Product_Attribute objects.

//$objProduct->set_category_ids($term_ids); //Set the product categories.                   | array $term_ids List of terms IDs.
//$objProduct->set_tag_ids($term_ids); //Set the product tags.                              | array $term_ids List of terms IDs.

//$objProduct->set_image_id(); //Set main image ID.                                         | int|string $image_id Product image id.
//$objProduct->set_gallery_image_ids(); //Set gallery attachment ids.                       | array $image_ids List of image ids.

$new_product_id = $objProduct->save(); //Saving the data to create new product, it will return product ID.

return;
}

하지만 다음 오류가 발생합니다.

2018년 10월 22일 20:25:19 UTC] PHP 치명적인 오류: 검출되지 않은 오류: 클래스 'WC_Product_Simple'을 /home/u1771p590/class/famyfuerza.com/public_html/store/wp-content/plugins/ff-dropship-data-scraper/ff-dropship-data-scraper.php:165 스택 트레이스에서 찾을 수 없습니다.
- #0 / home / u1771p590 / http/famyfuerza.com/public_html/store/wp-content/plugins/ff-dropship-data-scraper/ff-dropship-data-scraper.php(233) : curl _ parameters : //www . ban ...'
- #1 / home / u1771p590 / famyfuerza.com/public_html/store/wp-settings.php(305) : include_oncefaces / home / u1771p590 ... )
- #2 / home / u1771p590 / famyfuerza.com/public_html/store/wp-config.php(112) : require_oncefirm / home / u1771p590 ... )
- #3 / home / u1771p590 / famyfuerza.com/public_html/store/wp-load.php(37) : require_onceparams / home / u1771p590 ... )
- #4 / home / u1771p590 / famyfuerza.com/public_html/store/wp-admin/admin.php(31) : require_oncefirm / home / u1771p590 ... )
- #5 / home / u1771p590 / famyfuerza.com/public_html/store/wp-admin/index.php(10) : require_oncefirm / home / u1771p590 ... )
- #6 { main }
165행의 /home/u1771p590/http/famyfuerza.com/public_html/store/wp-content/plugins/ff-dropship-data-scraper/ff-dropship-data-scraper.php에 삽입

심플한 상품 클래스를 포함하려고 했지만, 또 다른 클래스가 누락되었다는 오류가 발생했습니다.

이거 고칠 줄 아는 사람 있어?아니면 코드를 통해 woocommerce 제품을 만드는 다른 방법이 있나요?

에 액세스 하고 있지 않다.WC_Product_simple사용자 지정 Dropship Data Scraper 플러그인의 인스턴스 개체.

죄는 크게 두 가지로 나눌 수 있습니다.

  1. Woocommerce를 설치하지 않았습니다.
  2. 플러그인 Dropship Data Scraper가 오래되어 woocommerce를 처리하기 위해 변경해야 합니다.

글로벌 Woocommerce 개체를 포함하여 플러그인에 Woocommerce 지원을 활성화해 보십시오.


Woocommerce 3에서 도입된 CRUD 방식을 사용하여 프로그래밍 방식으로 제품을 작성하는 것이 올바른 작동 방법입니다.

제품 속성 생성 또는 제품 변형 생성을 처리해야 하는 경우 다음을 참조하십시오.

모든 제품 속성과 해당 용어 을 미리 생성해야 합니다.제품 카테고리 및 제품 태그도 동일합니다.

1) 코드는 다음과 같이 기능합니다.

    // Custom function for product creation (For Woocommerce 3+ only)
    function create_product( $args ){

        if( ! function_exists('wc_get_product_object_type') && ! function_exists('wc_prepare_product_attributes') )
            return false;

        // Get an empty instance of the product object (defining it's type)
        $product = wc_get_product_object_type( $args['type'] );
        if( ! $product )
            return false;

        // Product name (Title) and slug
        $product->set_name( $args['name'] ); // Name (title).
        if( isset( $args['slug'] ) )
            $product->set_name( $args['slug'] );

        // Description and short description:
        $product->set_description( $args['description'] );
        $product->set_short_description( $args['short_description'] );

        // Status ('publish', 'pending', 'draft' or 'trash')
        $product->set_status( isset($args['status']) ? $args['status'] : 'publish' );

        // Visibility ('hidden', 'visible', 'search' or 'catalog')
        $product->set_catalog_visibility( isset($args['visibility']) ? $args['visibility'] : 'visible' );

        // Featured (boolean)
        $product->set_featured(  isset($args['featured']) ? $args['featured'] : false );

        // Virtual (boolean)
        $product->set_virtual( isset($args['virtual']) ? $args['virtual'] : false );

        // Prices
        $product->set_regular_price( $args['regular_price'] );
        $product->set_sale_price( isset( $args['sale_price'] ) ? $args['sale_price'] : '' );
        $product->set_price( isset( $args['sale_price'] ) ? $args['sale_price'] :  $args['regular_price'] );
        if( isset( $args['sale_price'] ) ){
            $product->set_date_on_sale_from( isset( $args['sale_from'] ) ? $args['sale_from'] : '' );
            $product->set_date_on_sale_to( isset( $args['sale_to'] ) ? $args['sale_to'] : '' );
        }

        // Downloadable (boolean)
        $product->set_downloadable(  isset($args['downloadable']) ? $args['downloadable'] : false );
        if( isset($args['downloadable']) && $args['downloadable'] ) {
            $product->set_downloads(  isset($args['downloads']) ? $args['downloads'] : array() );
            $product->set_download_limit(  isset($args['download_limit']) ? $args['download_limit'] : '-1' );
            $product->set_download_expiry(  isset($args['download_expiry']) ? $args['download_expiry'] : '-1' );
        }

        // Taxes
        if ( get_option( 'woocommerce_calc_taxes' ) === 'yes' ) {
            $product->set_tax_status(  isset($args['tax_status']) ? $args['tax_status'] : 'taxable' );
            $product->set_tax_class(  isset($args['tax_class']) ? $args['tax_class'] : '' );
        }

        // SKU and Stock (Not a virtual product)
        if( isset($args['virtual']) && ! $args['virtual'] ) {
            $product->set_sku( isset( $args['sku'] ) ? $args['sku'] : '' );
            $product->set_manage_stock( isset( $args['manage_stock'] ) ? $args['manage_stock'] : false );
            $product->set_stock_status( isset( $args['stock_status'] ) ? $args['stock_status'] : 'instock' );
            if( isset( $args['manage_stock'] ) && $args['manage_stock'] ) {
                $product->set_stock_status( $args['stock_qty'] );
                $product->set_backorders( isset( $args['backorders'] ) ? $args['backorders'] : 'no' ); // 'yes', 'no' or 'notify'
            }
        }

        // Sold Individually
        $product->set_sold_individually( isset( $args['sold_individually'] ) ? $args['sold_individually'] : false );

        // Weight, dimensions and shipping class
        $product->set_weight( isset( $args['weight'] ) ? $args['weight'] : '' );
        $product->set_length( isset( $args['length'] ) ? $args['length'] : '' );
        $product->set_width( isset(  $args['width'] ) ?  $args['width']  : '' );
        $product->set_height( isset( $args['height'] ) ? $args['height'] : '' );
        if( isset( $args['shipping_class_id'] ) )
            $product->set_shipping_class_id( $args['shipping_class_id'] );

        // Upsell and Cross sell (IDs)
        $product->set_upsell_ids( isset( $args['upsells'] ) ? $args['upsells'] : '' );
        $product->set_cross_sell_ids( isset( $args['cross_sells'] ) ? $args['upsells'] : '' );

        // Attributes et default attributes
        if( isset( $args['attributes'] ) )
            $product->set_attributes( wc_prepare_product_attributes($args['attributes']) );
        if( isset( $args['default_attributes'] ) )
            $product->set_default_attributes( $args['default_attributes'] ); // Needs a special formatting

        // Reviews, purchase note and menu order
        $product->set_reviews_allowed( isset( $args['reviews'] ) ? $args['reviews'] : false );
        $product->set_purchase_note( isset( $args['note'] ) ? $args['note'] : '' );
        if( isset( $args['menu_order'] ) )
            $product->set_menu_order( $args['menu_order'] );

        // Product categories and Tags
        if( isset( $args['category_ids'] ) )
            $product->set_category_ids( $args['category_ids'] );
        if( isset( $args['tag_ids'] ) )
            $product->set_tag_ids( $args['tag_ids'] );


        // Images and Gallery
        $product->set_image_id( isset( $args['image_id'] ) ? $args['image_id'] : "" );
        $product->set_gallery_image_ids( isset( $args['gallery_ids'] ) ? $args['gallery_ids'] : array() );

        ## --- SAVE PRODUCT --- ##
        $product_id = $product->save();

        return $product_id;
    }

    // Utility function that returns the correct product object instance
    function wc_get_product_object_type( $type = 'simple' ) {
        // Get an instance of the WC_Product object (depending on his type)
        if( $type === 'variable' ){
            $product = new WC_Product_Variable();
        } elseif( $type === 'grouped' ){
            $product = new WC_Product_Grouped();
        } elseif( $type === 'external' ){
            $product = new WC_Product_External();
        } else {
            $product = new WC_Product_Simple(); // "simple" By default
        } 
        
        if( ! is_a( $product, 'WC_Product' ) )
            return false;
        else
            return $product;
    }

    // Utility function that prepare product attributes before saving
    function wc_prepare_product_attributes( $attributes ){
        global $woocommerce;

        $data = array();
        $position = 0;

        foreach( $attributes as $taxonomy => $values ){
            if( ! taxonomy_exists( $taxonomy ) )
                continue;

            // Get an instance of the WC_Product_Attribute Object
            $attribute = new WC_Product_Attribute();

            $term_ids = array();

            // Loop through the term names
            foreach( $values['term_names'] as $term_name ){
                if( term_exists( $term_name, $taxonomy ) )
                    // Get and set the term ID in the array from the term name
                    $term_ids[] = get_term_by( 'name', $term_name, $taxonomy )->term_id;
                else
                    continue;
            }

            $taxonomy_id = wc_attribute_taxonomy_id_by_name( $taxonomy ); // Get taxonomy ID

            $attribute->set_id( $taxonomy_id );
            $attribute->set_name( $taxonomy );
            $attribute->set_options( $term_ids );
            $attribute->set_position( $position );
            $attribute->set_visible( $values['is_visible'] );
            $attribute->set_variation( $values['for_variation'] );

            $data[$taxonomy] = $attribute; // Set in an array

            $position++; // Increase position
        }
        return $data;
    }

2) 사용방법: - "색상"과 "크기"의 2가지 제품 특성을 가진 단순한 제품 작성 예:


    $product_id = create_product( array(
        'type'               => '', // Simple product by default
        'name'               => __("The product title", "woocommerce"),
        'description'        => __("The product description…", "woocommerce"),
        'short_description'  => __("The product short description…", "woocommerce"),
        // 'sku'                => '',
        'regular_price'      => '5.00', // product price
        // 'sale_price'         => '',
        'reviews_allowed'    => true,
        'attributes'         => array(
            // Taxonomy and term name values
            'pa_color' => array(
                'term_names' => array('Red', 'Blue'),
                'is_visible' => true,
                'for_variation' => false,
            ),
            'pa_size' =>  array(
                'term_names' => array('X Large'),
                'is_visible' => true,
                'for_variation' => false,
            ),
        ),
    ) );  

// Displaying the created product ID
echo $product_id;

Woocommerce 3 CRUD 방식만 사용하여 테스트 및 동작합니다.

다른 방법: https://wordpress.stackexchange.com/a/137578/74284 , 사용wp_insert_post★★★★★★ 。

https://lukasznowicki.info/insert-new-woocommerce-product-programmatically/

$item = array(
    'Name' => 'Product A',
    'Description' => 'This is a product A',
    'SKU' => '10020030A',
);
$user_id = get_current_user(); // this has NO SENSE AT ALL, because wp_insert_post uses current user as default value
// $user_id = $some_user_id_we_need_to_use; // So, user is selected..
$post_id = wp_insert_post( array(
    'post_author' => $user_id,
    'post_title' => $item['Name'],
    'post_content' => $item['Description'],
    'post_status' => 'publish',
    'post_type' => "product",
) );
wp_set_object_terms( $post_id, 'simple', 'product_type' );
update_post_meta( $post_id, '_visibility', 'visible' );
update_post_meta( $post_id, '_stock_status', 'instock');
update_post_meta( $post_id, 'total_sales', '0' );
update_post_meta( $post_id, '_downloadable', 'no' );
update_post_meta( $post_id, '_virtual', 'yes' );
update_post_meta( $post_id, '_regular_price', '' );
update_post_meta( $post_id, '_sale_price', '' );
update_post_meta( $post_id, '_purchase_note', '' );
update_post_meta( $post_id, '_featured', 'no' );
update_post_meta( $post_id, '_weight', '' );
update_post_meta( $post_id, '_length', '' );
update_post_meta( $post_id, '_width', '' );
update_post_meta( $post_id, '_height', '' );
update_post_meta( $post_id, '_sku', $item['SKU'] );
update_post_meta( $post_id, '_product_attributes', array() );
update_post_meta( $post_id, '_sale_price_dates_from', '' );
update_post_meta( $post_id, '_sale_price_dates_to', '' );
update_post_meta( $post_id, '_price', '' );
update_post_meta( $post_id, '_sold_individually', '' );
update_post_meta( $post_id, '_manage_stock', 'no' );
update_post_meta( $post_id, '_backorders', 'no' );
update_post_meta( $post_id, '_stock', '' );

언급URL : https://stackoverflow.com/questions/52937409/create-programmatically-a-product-using-crud-methods-in-woocommerce-3

반응형