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

Mah*_*tel 5 wordpress 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 );
Run Code Online (Sandbox Code Playgroud)

此代码成功添加属性,并且对“产品”->“属性”中的 woo-commerce 列表可见,但之后,我尝试terms使用以下代码向其中添加一些不影响属性列表的属性:

wp_insert_term( 'term_1' ,'pa_'.$data['slug']);
Run Code Online (Sandbox Code Playgroud)

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

Kri*_*dis 7

因为在找到适用于 的工作解决方案之前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);
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)

所以它们可以像这样使用:

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);
Run Code Online (Sandbox Code Playgroud)

  • 特别是在“register_taxonomy”方面做得很好 (2认同)