以编程方式创建 wooCommerce 产品属性并向其添加术语,但术语未显示在产品>属性中



我通过以下代码以编程方式创建了woo-commerce产品属性:

$data = array(
'name'   => 'My attribute',
'slug'    => wc_sanitize_taxonomy_name(wp_unslash('My attribute')),
'type'    => 'select',
'order_by' => 'menu_order',
'has_archives'  => 1
);        
wc_create_attribute( $data );

并且此代码成功添加了属性,并且对产品中的 woo-Commerce 列表可见>属性,但在那之后,我尝试使用以下代码向它们添加一些不影响属性列表的terms

wp_insert_term( 'term_1' ,'pa_'.$data['slug']);

另外,我确认当我转储var_dump(get_term_by('name','term_1','pa_'.$data['slug']))的结果时,我得到的结果带有术语ID,名称,slug等term_taxonomy_id但是这些术语在woocommerce产品属性上不可见的问题,在产品编辑页面上也是如此。

因为在寻求适用于Woocommerce 3.8+的工作解决方案之前,我已经搜索了很多自己,所以我给出这个答案是为了让其他人在一个非常令人困惑的话题上获得帮助,例如 WooCommerce 属性。

我创建了两个方法/函数:createAttributecreateTerm基于Woocomerce作为示例提供的示例代码: 查看代码

function createAttribute(string $attributeName, string $attributeSlug): ?stdClass {
delete_transient('wc_attribute_taxonomies');
WC_Cache_Helper::incr_cache_prefix('woocommerce-attributes');
$attributeLabels = wp_list_pluck(wc_get_attribute_taxonomies(), 'attribute_label', 'attribute_name');
$attributeWCName = array_search($attributeSlug, $attributeLabels, TRUE);
if (! $attributeWCName) {
$attributeWCName = wc_sanitize_taxonomy_name($attributeSlug);
}
$attributeId = wc_attribute_taxonomy_id_by_name($attributeWCName);
if (! $attributeId) {
$taxonomyName = wc_attribute_taxonomy_name($attributeWCName);
unregister_taxonomy($taxonomyName);
$attributeId = wc_create_attribute(array(
'name' => $attributeName,
'slug' => $attributeSlug,
'type' => 'select',
'order_by' => 'menu_order',
'has_archives' => 0,
));
register_taxonomy($taxonomyName, apply_filters('woocommerce_taxonomy_objects_' . $taxonomyName, array(
'product'
)), apply_filters('woocommerce_taxonomy_args_' . $taxonomyName, array(
'labels' => array(
'name' => $attributeSlug,
),
'hierarchical' => FALSE,
'show_ui' => FALSE,
'query_var' => TRUE,
'rewrite' => FALSE,
)));
}
return wc_get_attribute($attributeId);
}
function createTerm(string $termName, string $termSlug, string $taxonomy, int $order = 0): ?WP_Term {
$taxonomy = wc_attribute_taxonomy_name($taxonomy);
if (! $term = get_term_by('slug', $termSlug, $taxonomy)) {
$term = wp_insert_term($termName, $taxonomy, array(
'slug' => $termSlug,
));
$term = get_term_by('id', $term['term_id'], $taxonomy);
if ($term) {
update_term_meta($term->term_id, 'order', $order);
}
}
return $term;
}

因此,它们可以像以下方式使用:

createAttribute('Colors', 'my-colors');
createTerm('Red', 'my-red', 'my-colors', 10);
createTerm('Green', 'my-green', 'my-colors', 20);
createTerm('Blue', 'my-blue', 'my-colors', 30);

最新更新