从插件创建自定义WooCommerce属性分类

时间:2016-10-28 作者:Dmitriy Gamolin

我已经制作了一个插件,可以通过Woocommerce将产品导入Wordpress。除了产品属性外,它工作正常-我找不到正确导入它们的方法。

问题是,对于产品,我添加了仪表板中未定义的自定义分类法。令人惊讶的是,我找不到这样的方法。我试过了wp_insert_term() 具有register_taxonomy(), 但这些并没有给wp_woocommerce_attribute_taxonomies 我在产品属性中找不到它们,也没有在仪表板的产品属性页面上找到它们。我只在wp_terms 根据我所了解的情况,Woocommerce中不属于产品属性。

update_post_meta() 也似乎不起作用(它可以添加meta属性,但我需要它们作为Woocommerce的产品属性)。

在导入产品之前,如果属性不存在,我需要创建属性。是否有一个我忽略了的功能来实现这一点?

不确定我是否应该发布到目前为止的内容,但以下是与此问题相关的代码:

// This is an example of what I get from my AJAX input
$product_attributes = array(
    "attr_id_01" => array(
        "name" => "Material",
        "value" => "Metal",
        "is_visible" => 1,
        "is_taxonomy" => 1
    ),
    "attr_id_02" => array(
        "name" => "Type",
        "value" => "Has a handle",
        "is_visible" => 1,
        "is_taxonomy" => 1
    )
);
foreach ($product_attributes_copy as $key => $value) {
    // sanitize_title filter is provided by CyrToLat plugin,
    // it basically makes the string url-friendly, 
    // it\'s used because names and values could contain Cyrillic, uppercase and spaces
    $filtered_name = apply_filters(\'sanitize_title\', $value[\'name\']);
    $filtered_value = apply_filters(\'sanitize_title\', $value[\'value\']);

    $taxonomy = \'pa_\' . $filtered_name;
    $parent_term = term_exists( $filtered_value, $taxonomy );
    $parent_term_id = $parent_term[\'term_id\'];

    if ( ! taxonomy_exists($taxonomy) ) {
        register_taxonomy($taxonomy, \'product\', array(\'label\' => $value[\'name\']) );
    }

    // No errors from the following
    $insert_result = wp_insert_term(
        $filtered_value,
        $taxonomy,
        array(
            \'description\'=> \'\',
            \'slug\' => $filtered_value,
            \'parent\'=> $parent_term_id
        )
    );
}

1 个回复
最合适的回答,由SO网友:Ardidaj 整理而成

出于某种原因,Woocommerce似乎不希望你这么做。不知道为什么,因为在许多情况下,要求手动执行是一个可伸缩性问题(更不用说,如果您的属性有很多可能的值,那么它们提供的接口加载速度非常慢)。在挖掘了一些之后,下面是管理页面使用的私有函数,为系统调用进行了修改。

function process_add_attribute($attribute)
{
    global $wpdb;
//      check_admin_referer( \'woocommerce-add-new_attribute\' );

    if (empty($attribute[\'attribute_type\'])) { $attribute[\'attribute_type\'] = \'text\';}
    if (empty($attribute[\'attribute_orderby\'])) { $attribute[\'attribute_orderby\'] = \'menu_order\';}
    if (empty($attribute[\'attribute_public\'])) { $attribute[\'attribute_public\'] = 0;}

    if ( empty( $attribute[\'attribute_name\'] ) || empty( $attribute[\'attribute_label\'] ) ) {
            return new WP_Error( \'error\', __( \'Please, provide an attribute name and slug.\', \'woocommerce\' ) );
    } elseif ( ( $valid_attribute_name = valid_attribute_name( $attribute[\'attribute_name\'] ) ) && is_wp_error( $valid_attribute_name ) ) {
            return $valid_attribute_name;
    } elseif ( taxonomy_exists( wc_attribute_taxonomy_name( $attribute[\'attribute_name\'] ) ) ) {
            return new WP_Error( \'error\', sprintf( __( \'Slug "%s" is already in use. Change it, please.\', \'woocommerce\' ), sanitize_title( $attribute[\'attribute_name\'] ) ) );
    }

    $wpdb->insert( $wpdb->prefix . \'woocommerce_attribute_taxonomies\', $attribute );

    do_action( \'woocommerce_attribute_added\', $wpdb->insert_id, $attribute );

    flush_rewrite_rules();
    delete_transient( \'wc_attribute_taxonomies\' );

    return true;
}

function valid_attribute_name( $attribute_name ) {
    if ( strlen( $attribute_name ) >= 28 ) {
            return new WP_Error( \'error\', sprintf( __( \'Slug "%s" is too long (28 characters max). Shorten it, please.\', \'woocommerce\' ), sanitize_title( $attribute_name ) ) );
    } elseif ( wc_check_if_attribute_name_is_reserved( $attribute_name ) ) {
            return new WP_Error( \'error\', sprintf( __( \'Slug "%s" is not allowed because it is a reserved term. Change it, please.\', \'woocommerce\' ), sanitize_title( $attribute_name ) ) );
    }

    return true;
}
要求如下:

$insert = proccess_add_attribute(array(\'attribute_name\' => \'my-new-slug\', \'attribute_label\' => \'my-new-attribute\', \'attribute_type\' => \'text\', \'attribute_orderby\' => \'menu_order\', \'attribute_public\' => false));
if (is_wp_error($insert)) { do_something_for_error($insert); }
与属性相关的字段包括名称(标准wp slug)、标签(属性名称的人类可读版本)、类型(您可以在“选择”和“文本”之间进行选择,但如果您是系统创建的,您可能希望文本我将函数改为默认)、公共(在接口中标记为“启用存档”,我将函数默认为接口默认值),和orderby(选项包括“menu\\u order”(在界面中称为“Custom ordering”)、“name”(自解释)、“name\\u num”(数字名称)和“id”(术语id))