我正在构建一个获取产品的脚本,我被困在以编程方式添加属性的部分。所以基本上我想检查一个属性是否存在,如果不存在就添加它。然后检查它的价值是否存在,如果不存在,他们就添加它的价值,并将所有内容附加到我的产品上。
以下是我得到的产品格式:
[attributes] => Array
(
[0] => stdClass Object
(
[id] => 332
[name] => Gender
[value] => Woman
)
[1] => stdClass Object
(
[id] => 333
[name] => Wheel Size
[value] => 28 Inch
)
[2] => stdClass Object
(
[id] => 334
[name] => Frame height
[value] => 56 cm
)
现在我已经尝试了2个版本,我会粘贴两个代码样本。
版本1:
foreach($product->attributes as $attribute) {
$slug = 'pa_' . strtolower($attribute->name);
$attribute_name = $attribute->name;
$attribute_value = $attribute->value;
$permalinks = get_option( 'woocommerce_permalinks' );
$taxonomy_data = array(
'hierarchical' => true,
'update_count_callback' => '_update_post_term_count',
'labels' => array(
'name' => $attribute_name
),
'show_ui' => false,
'query_var' => true,
'sort' => false,
'public' => true,
'show_in_nav_menus' => false,
'capabilities' => array(
'manage_terms' => 'manage_product_terms',
'edit_terms' => 'edit_product_terms',
'delete_terms' => 'delete_product_terms',
'assign_terms' => 'assign_product_terms',
)
);
register_taxonomy( $slug, array('product'), $taxonomy_data );
// @end_Debug
}
这个版本只添加了以某种方式附加到产品的属性,但它们在Wordpress管理员的属性选项卡下不可见。我以后会想要这些属性的过滤器,所以我需要与Woocommerce属性的连接。
版本2:
foreach($product->attributes as $attribute) {
$slug = 'pa_' . strtolower($attribute->name);
$attribute_name = $attribute->name;
$attribute_value = $attribute->value;
$table = $wpdb->prefix . 'woocommerce_attribute_taxonomies';
$attr = $wpdb->get_results( "SELECT * FROM {$table} WHERE attribute_name LIKE '%{$attribute_name}%'", OBJECT );
if(count($attr) > 0) {
//
}
else {
/** create taxonomy */
$data = array(
'attribute_label' => $attribute_name,
'attribute_name' => $slug,
'attribute_type' => 'select',
'attribute_orderby' => 'menu_order',
'attribute_public' => 0, // Enable archives ==> true (or 1)
);
$results = $wpdb->insert( "{$wpdb->prefix}woocommerce_attribute_taxonomies", $data );
if ( is_wp_error( $results ) ) {
return new WP_Error( 'cannot_create_attribute', $results->get_error_message(), array( 'status' => 400 ) );
}
$id = $wpdb->insert_id;
do_action('woocommerce_attribute_added', $id, $data);
wp_schedule_single_event( time(), 'woocommerce_flush_rewrite_rules' );
/* end_Create */
}
// Clean attribute name to get the taxonomy
$taxonomy = 'pa_' . wc_sanitize_taxonomy_name( $attribute_name );
$option_term_ids = array(); // Initializing
// Loop through defined attribute data options (terms values)
if( term_exists( $attribute_value, $taxonomy ) ){
// Save the possible option value for the attribute which will be used for variation later
wp_set_object_terms( $product_id, $attribute_value, $taxonomy, true );
// Get the term ID
$option_term_ids[] = get_term_by( 'name', $attribute_value, $taxonomy )->term_id;
}
// Loop through defined attribute data
$attributes[$taxonomy] = array(
'name' => $taxonomy,
'value' => $option_term_ids, // Need to be term IDs
'position' => '1',
'is_visible' => '1',
'is_variation' => '1',
'is_taxonomy' => '1'
);
// Save the meta entry for product attributes
update_post_meta( $product_id, '_product_attributes', $attributes );
}
这一个似乎只添加他们下的产品属性选项卡,也没有添加条款值。
2条答案
按热度按时间t30tvxxf1#
好吧,这是一个相当复杂的任务,但这是我通过查看其他人的源代码并根据需要进行修改而获得的代码。
首先,您需要这些helper函数。
1.要创建全局属性,您需要使用以下函数为每个属性(性别、车轮大小等)创建一个分类:
1.现在把这些应用到你的产品上,我假设你使用的是变量产品,每个产品都有变化?父变量产品需要将其
attribute
属性设置为一个特殊格式的属性数组。此函数创建该数组,如果没有找到每个属性,则为它们创建全局分类法。1.我们几乎已经准备好将属性应用于产品,但是主变量产品及其变体需要像任何Wordpress分类一样为其分配分类术语。因此,如果您有一个名为“Wheel Size”的分类,其中包含术语“28 Inch”和“30 Inch”,则父产品需要为其分配所有“28 Inch”和“30 Inch”术语,并且变体需要为其分配各自的术语,因此“28 Inch”表示一个,“30 Inch”表示另一个。为了帮助实现这一点,我们使用此函数来获取和/或创建这些术语(如果它们不存在):
好了,现在我们可以使用上面的方法将属性应用到我们的产品中。
对于主变量产品:
对于该产品的每个变体:
oyxsuwqo2#
如果有人正在寻找解决方案来创建属性,并且在产品上创建或更新相应的值,则这里是代码的修改版本。
提供Product_id和属性数组,以名称为键,选项值为值,与产品一起保存。如果属性存在或不存在,此函数将触发上述两个函数的第一次检查。如果不是,则将注册并创建一个,之后第二个函数将从属性数组中获取值,并与产品一起保存/附加
//设置产品属性名称和术语值
您可以在apifixer博客上阅读全文Read the Full Artcicle