当前位置: 首页 > 知识库问答 >
问题:

在WooCommerce中将产品类别转换为产品属性

顾梓
2023-03-14

在WooCommerce中,我试图使用以下代码将产品类别转换为产品属性:

$all_categories = wp_get_post_terms( get_the_ID(), 'product_cat' );;
$productid = get_the_ID();

foreach ($all_categories as $_term) {
    //$_term->name
    // $_term->parent
    $parent  = get_term_by( 'id', $_term->parent, 'product_cat');


    // echo $parent->name . ': ' . $_term->name . '<br />';

    $attribute_name =  $parent->name; //slug of the attribute(taxonomy) 
    $attribute_value = $_term->name; //slug of the attribute value (term)

    //Appending term to the object/product.
    $term_taxonomy_ids = wp_set_object_terms(get_the_ID(), $attribute_value, $attribute_name, true);
    $data = array(
        $attribute_name => array(
            'name' => wc_clean($attribute_name),
            'value' => $attribute_value,
            'is_visible' => '1',
            'is_variation' => '1',
            'is_taxonomy' => '0' // i tried with 1
        )
    );

    // getting the Post Meta
    $_product_attributes = get_post_meta($productid, '_product_attributes', TRUE);
    if ( is_array($_product_attributes) ){
    } else { 
        $_product_attributes = array();
    }

    //Updating the Post Meta
    update_post_meta($productid, '_product_attributes', array_merge($_product_attributes, $data)); 
}

Is的部分工作原理与我在后端产品中需要看到的一样

共有1个答案

滑令
2023-03-14

这是一个完整而正确的方法…部分基于这个答案

1) 使其工作所需的前两个实用程序功能:

/**
 * Utility function: 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_var("SELECT attribute_id
    FROM {$wpdb->prefix}woocommerce_attribute_taxonomies
    WHERE attribute_name LIKE '$name'");
    return $attribute_id;
}

/**
 * Utility function: 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 );

    if( $set ){
        $attributes = wc_get_attribute_taxonomies();
        $args['attribute_id'] = get_attribute_id_from_name( $name );
        $attributes[] = (object) $args;
        set_transient( 'wc_attribute_taxonomies', $attributes );
    } else {
        return;
    }
}

代码进入函数。活动子主题(或活动主题)的php文件。测试和工作。

2) 现在,您重新访问的代码插入到带有一个可选参数(产品ID)的函数中:

function create_attributtes_from_categories( $product_id = 0 ){
    $product_id = $product_id == 0 ? get_the_ID() : $product_id;
    $taxonomy = 'product_cat';
    $product_categories = wp_get_post_terms( $product_id, $taxonomy );
    $product_categories_data = $product_cats = $product_attributes = array();

    // 1. Get and process product categories from a product
    if( sizeof($product_categories) > 0 ){
        // 1st Loop get parent/child categories pairs
        foreach ( $product_categories as $product_category ) {
            $term_name   = $product_category->name; // Category name
            // keep product categories that have parent category
            if( $product_category->parent > 0 ){
                $parent_name = get_term_by( 'id', $product_category->parent, $taxonomy)->name; // Parent category name
                // Set them in the array
                $product_categories_data[$parent_name] = $term_name;
            }
        }
        // 2nd Loop: The get missing categories (the last child category or a unique category) and assign an temporary value to it
        foreach ( $product_categories as $product_category ) {
            if( ! in_array($product_category->name, array_keys($product_categories_data) ) ){
                // Assign an temporary value for the category name in the array of values
                $product_categories_data[$product_category->name] = 'Temp';
            }
        }
    }

    // 2. create and process product attributes and values from the product categories
    if( sizeof($product_categories_data) > 0 ){
        // Get product attributes post meta data
        $existing_data_attributes = (array) get_post_meta( $product_id, '_product_attributes', true );
        // Get the position
        if( sizeof($existing_data_attributes) > 0 )
            $position = sizeof($existing_data_attributes);

        // Loop through our categories array
        foreach ( $product_categories_data as $key_label => $value_name ) {
            $taxonomy = wc_attribute_taxonomy_name($key_label);
            $attr_name = wc_sanitize_taxonomy_name($key_label); // attribute slug name

            // NEW Attributes: Register and save them (if it doesn't exits)
            if( ! taxonomy_exists( $taxonomy ) )
                save_product_attribute_from_name( $attr_name, $key_label );

            // Check if the Term name exist and if not we create it.
            if( ! term_exists( $value_name, $taxonomy ) ){
                wp_insert_term( $value_name, $taxonomy, array('slug' => sanitize_title($value_name) ) );

                // Set attribute value for the product
                wp_set_post_terms( $product_id, $value_name, $taxonomy, true );
            }

            if( ! in_array( $taxonomy, array_keys($existing_data_attributes) ) ){
                $position++;
                // Setting formatted post meta data if it doesn't exist in the array
                $product_attributes[$taxonomy] = array (
                    'name'         => $taxonomy,
                    'value'        => '',
                    'position'     => $position,
                    'is_visible'   => 1,
                    'is_variation' => 1,
                    'is_taxonomy'  => 1
                );
            }
        }
        // Save merged data updating the product meta data
        update_post_meta( $product_id, '_product_attributes', array_merge( $existing_data_attributes, $product_attributes ) );
    }
}

代码进入函数。活动子主题(或活动主题)的php文件。测试和工作。

3) 用法:

我还有一个小错误需要解决…
该函数需要运行2次才能正确设置属性项值。

但它是有效的,我会尽快解决这个问题。

1) 对于当前产品(当前产品职务ID):

create_attributtes_from_categories();
create_attributtes_from_categories();

2) 对于定义的产品ID(此处为整数):

create_attributtes_from_categories(746);
create_attributtes_from_categories(746);

3) 对于动态产品ID,在具有定义的$product\u ID变量的函数内:

create_attributtes_from_categories( $product_id );
create_attributtes_from_categories( $product_id );
 类似资料:
  • 我有一个名为“产品类型”的WooCommerce产品类别,我试图列出该类别下的所有类别,但不是这些类别的子类别。例如,我有: 产品类型 碳化物米尔斯 钓鱼工具 儿童类别 我希望它列出“电石磨坊”和“打捞工具”,但不是“儿童类别”。 这是我的代码: 但它仍然返回“儿童类别”。我不知道为什么将深度限制为“1”并将“include_children”设置为“false”不能解决这个问题。

  • 我不明白!!!我已经设法将产品类别描述包含在各自的页面中。我有6个类别,其中四个我需要添加一个描述。从四个人中,有三个人发挥了应有的作用。然而,其中有一个不仅显示了它的描述,还显示了另一个类别的描述。 每个类别有两个用于多种语言目的。但是你可以看到我需要添加描述的四个类别。 1-上衣2-下装3-一体式4-运动装 前三个起到了应有的作用。即。底部分类页面。 但第四,运动服不仅不断地展示它的描述,而且

  • 在我的WooCommerce网上商店的单一产品显示所有类别,它属于使用以下代码: 现在,我只想显示顶级父类别,而不想显示产品所属的子类别。 我试了很多,但似乎什么都不管用。有人对此有解决方案吗?

  • 我试图使用WooCommerce的分层导航属性过滤侧边栏小部件过滤WooCommerce商店中的〜30,000种产品。这需要使用预定义的产品属性分类法,而不是在每个产品的基础上使用自定义属性。 商店里的每种产品都有一个导入的定制“品牌”属性。在导入产品之前,我在wp-admin中创建了一个名为()的属性分类法。然而,进口产品没有将其品牌属性(和术语名称)添加到品牌()分类中。取而代之的是,所有的产

  • 在产品页面中,每个产品都有一个图像,并且下面有两个子标题:标题和到产品类别的链接。我想用产品的简短描述替换这个产品类别字段。 我查看了Woocomece文件夹中的每个php文件,但找不到要编辑的行。 谢谢你的帮助。

  • 我从Web服务中提取了几个产品,并将其转换为ProductModel,然而,其中一些产品是“变体”。我需要手动将ProductModel转换为VariantProductModel,有什么OOTB方法可以实现这一点吗?