在Woocommerce 3中以编程方式创建产品时设置产品类型

时间:2018-12-03 03:48:45

标签: php wordpress class methods woocommerce

在Woocommerce中,我试图找到一种类似于WC_Product方法set_name()set_status()的方法,以将产品类型设置为简单变体

实际上,我像这样使用WC_Product对象:

    $product = new WC_Product;

    $product->set_name($data['product']['title']);

    $product->set_status('pending');

    $product->save();

如果用户选中“简单产品”或“可变产品”,如何设置产品类型

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

WC_Product类没有类型方法。产品类型由产品子类管理...

您首先将获得所需产品类型的WC_Product对象的空实例:

  1. 变量类型:$product = new WC_Product_Variable();
  2. 分组类型:$product = new WC_Product_Grouped();
  3. 外部类型:$product = new WC_Product_External();
  4. 简单类型:$product = new WC_Product_Simple();

然后您可以在所选产品类型上使用任何WC_product方法或$product对象上相应的Product sub Class方法:

$product->set_name($data['product']['title']);
$product->set_status('publish');

然后您将保存产品(它将返回产品ID)

$product_id = $product->save();
  

请参阅: Create programmatically a product using CRUD methods in Woocommerce 3


产品变体

对于产品变体,这是不同的,因为它们始终是现有变量产品的一部分...

// Get the Variable product object (parent) from an existing product ID
$product = wc_get_product( $product_id );

// Define the variation data
$variation_post = array(
    'post_title'  => $product->get_title(),
    'post_name'   => 'product-'.$product_id.'-variation',
    'post_status' => 'publish',
    'post_parent' => $product_id,
    'post_type'   => 'product_variation',
    'guid'        => $product->get_permalink()
);

// Creating the product variation
$variation_id = wp_insert_post( $variation_post );

// Get an instance of the product variation Object
$variation = new WC_Product_Variation( $variation_id );

// Set existing product attribute values (defined in the variable product)
$variation->update_meta_data( 'attribute_'.'pa_color', 'blue' );
$variation->update_meta_data( 'attribute_'.'pa_size', 'xxl' );

# You can use any WC_Product allowed setter methods on the $variation object

$variation->set_regular_price( 25 );
$variation->set_price( 25 );

$variation->save();

请参阅这2个相关线程:

答案 1 :(得分:0)

通常在创建产品时设置类型:

$prod_data = [
    'name'          => 'A great product',
    'type'          => 'simple',
    'regular_price' => '15.00',
    'description'   => 'A very meaningful product description',
    'images'        => [
        [
            'src'      => 'https://shop.local/path/to/image.jpg',
            'position' => 0,
        ],
    ],
    'categories'    => [
        [
            'id' => 1,
        ],
    ],
];

$woocommerce->post( 'products', $prod_data );

我不确定是否具有修改产品类型的功能,但是可以使用REST API对其进行修改:

$api_response = wp_remote_post( 'https://your-website/wp-json/wc/v2/products/{PRODUCT ID}', array(
    //'method'    => 'PUT',
    'headers' => array(
        'Authorization' => 'Basic ' . base64_encode( 'KEY:SECRET' )
    ),
    'body' => array(
        'type' => 'simple', // just update the product type
        // Options: simple, grouped, external and variable
        // more params http://woocommerce.github.io/woocommerce-rest-api-docs/?shell#product-properties
    )
) );

$body = json_decode( $api_response['body'] );
//print_r( $body );

if( wp_remote_retrieve_response_message( $api_response ) === 'OK' ) {
    echo 'The product ' . $body->name . ' has been updated';
}

答案 2 :(得分:0)

尽管WooCommerce没有公开用于更改产品类型的API,但实际上WooCommerce确实实现了此功能,因为有必要使用诸如https:的管理页面上的“产品类型”选择框来支持更改产品类型。 //aaa.bbb.ccc/wp-admin/post.php?post=12345&action=edit。基本上,代码如下:

    $classname = WC_Product_Factory::get_product_classname( $post_id, $product_type );
    $product   = new $classname( $post_id );
    $product->save();

请注意,此处正在进行产品类型转换,因为ID == $ post_id的现有产品的产品类型可能与$ product_type不同。显然,可以使用与最初构造产品所用类型不同的产品构造函数。似乎很奇怪,但这就是当您在管理页面中更改产品类型时WooCommerce代码所做的事情。

REST API基本上以相同的方式实现产品类型的更改。