在WooCommerce中以编程方式创建可变产品和两个新属性

我想以编程方式创建具有两个新的Variant属性的变量产品(“父”产品)-所有这些都来自WordPress插件(因此,无需向API发送HTTP请求)。

这两个变量属性也应该动态创建。

如何才能做到这一点 ?

(使用WooCommerce版本3)


更新:我已经在此上编写了更多行代码,并使用wooCommerce对象尝试了许多解决方案,并使用WordPress数据库在数据库中添加了有关术语,termmeta,术语与文章的关系的缺失数据对象-

但没有任何东西足以使它起作用。而且我无法指出我哪里出了错-这就是为什么我不能提供一个更狭窄的问题-这些都是针对stackoverflow的。

回答:

在这里,您将获得创建具有新产品属性+值的新变量产品的方法:

/**

* Save a new product attribute from his name (slug).

*

* @since 3.0.0

* @param string $name | The product attribute name (slug).

* @param string $label | The product attribute label (name).

*/

function save_product_attribute_from_name( $name, $label='', $set=true ){

if( ! function_exists ('get_attribute_id_from_name') ) return;

global $wpdb;

$label = $label == '' ? ucfirst($name) : $label;

$attribute_id = get_attribute_id_from_name( $name );

if( empty($attribute_id) ){

$attribute_id = NULL;

} else {

$set = false;

}

$args = array(

'attribute_id' => $attribute_id,

'attribute_name' => $name,

'attribute_label' => $label,

'attribute_type' => 'select',

'attribute_orderby' => 'menu_order',

'attribute_public' => 0,

);

if( empty($attribute_id) ) {

$wpdb->insert( "{$wpdb->prefix}woocommerce_attribute_taxonomies", $args );

set_transient( 'wc_attribute_taxonomies', false );

}

if( $set ){

$attributes = wc_get_attribute_taxonomies();

$args['attribute_id'] = get_attribute_id_from_name( $name );

$attributes[] = (object) $args;

//print_r($attributes);

set_transient( 'wc_attribute_taxonomies', $attributes );

} else {

return;

}

}

/**

* Get the product attribute ID from the name.

*

* @since 3.0.0

* @param string $name | The name (slug).

*/

function get_attribute_id_from_name( $name ){

global $wpdb;

$attribute_id = $wpdb->get_col("SELECT attribute_id

FROM {$wpdb->prefix}woocommerce_attribute_taxonomies

WHERE attribute_name LIKE '$name'");

return reset($attribute_id);

}

/**

* Create a new variable product (with new attributes if they are).

* (Needed functions:

*

* @since 3.0.0

* @param array $data | The data to insert in the product.

*/

function create_product_variation( $data ){

if( ! function_exists ('save_product_attribute_from_name') ) return;

$postname = sanitize_title( $data['title'] );

$author = empty( $data['author'] ) ? '1' : $data['author'];

$post_data = array(

'post_author' => $author,

'post_name' => $postname,

'post_title' => $data['title'],

'post_content' => $data['content'],

'post_excerpt' => $data['excerpt'],

'post_status' => 'publish',

'ping_status' => 'closed',

'post_type' => 'product',

'guid' => home_url( '/product/'.$postname.'/' ),

);

// Creating the product (post data)

$product_id = wp_insert_post( $post_data );

// Get an instance of the WC_Product_Variable object and save it

$product = new WC_Product_Variable( $product_id );

$product->save();

## ---------------------- Other optional data ---------------------- ##

## (see WC_Product and WC_Product_Variable setters methods)

// THE PRICES (No prices yet as we need to create product variations)

// IMAGES GALLERY

if( ! empty( $data['gallery_ids'] ) && count( $data['gallery_ids'] ) > 0 )

$product->set_gallery_image_ids( $data['gallery_ids'] );

// SKU

if( ! empty( $data['sku'] ) )

$product->set_sku( $data['sku'] );

// STOCK (stock will be managed in variations)

$product->set_stock_quantity( $data['stock'] ); // Set a minimal stock quantity

$product->set_manage_stock(true);

$product->set_stock_status('');

// Tax class

if( empty( $data['tax_class'] ) )

$product->set_tax_class( $data['tax_class'] );

// WEIGHT

if( ! empty($data['weight']) )

$product->set_weight(''); // weight (reseting)

else

$product->set_weight($data['weight']);

$product->validate_props(); // Check validation

## ---------------------- VARIATION ATTRIBUTES ---------------------- ##

$product_attributes = array();

foreach( $data['attributes'] as $key => $terms ){

$taxonomy = wc_attribute_taxonomy_name($key); // The taxonomy slug

$attr_label = ucfirst($key); // attribute label name

$attr_name = ( wc_sanitize_taxonomy_name($key)); // attribute slug

// NEW Attributes: Register and save them

if( ! taxonomy_exists( $taxonomy ) )

save_product_attribute_from_name( $attr_name, $attr_label );

$product_attributes[$taxonomy] = array (

'name' => $taxonomy,

'value' => '',

'position' => '',

'is_visible' => 0,

'is_variation' => 1,

'is_taxonomy' => 1

);

foreach( $terms as $value ){

$term_name = ucfirst($value);

$term_slug = sanitize_title($value);

// Check if the Term name exist and if not we create it.

if( ! term_exists( $value, $taxonomy ) )

wp_insert_term( $term_name, $taxonomy, array('slug' => $term_slug ) ); // Create the term

// Set attribute values

wp_set_post_terms( $product_id, $term_name, $taxonomy, true );

}

}

update_post_meta( $product_id, '_product_attributes', $product_attributes );

$product->save(); // Save the data

}

代码进入您的活动子主题(或活动主题)的function.php文件中。 经过测试和工作。


(带有2个新属性+值的示例):

create_product_variation( array(

'author' => '', // optional

'title' => 'Woo special one',

'content' => '<p>This is the product content <br>A very nice product, soft and clear…<p>',

'excerpt' => 'The product short description…',

'regular_price' => '16', // product regular price

'sale_price' => '', // product sale price (optional)

'stock' => '10', // Set a minimal stock quantity

'image_id' => '', // optional

'gallery_ids' => array(), // optional

'sku' => '', // optional

'tax_class' => '', // optional

'weight' => '', // optional

// For NEW attributes/values use NAMES (not slugs)

'attributes' => array(

'Attribute 1' => array( 'Value 1', 'Value 2' ),

'Attribute 2' => array( 'Value 1', 'Value 2', 'Value 3' ),

),

) );

经过测试和工作。


以上是 在WooCommerce中以编程方式创建可变产品和两个新属性 的全部内容, 来源链接: utcz.com/qa/424293.html

回到顶部