首页 文章

在Woocommerce中以编程方式创建变量产品和两个新属性

提问于
浏览
7

我想以编程方式创建一个带有两个新variante属性的变量产品(“父”产品) - 所有这些都来自Wordpress插件(因此没有HTTP请求到API) .

还应该动态创建这两个variante属性 .

如何才能做到这一点 ?

(使用Woocommerce第3版)


更新:我已经写了更多的代码,我希望,并尝试了很多东西来解决它,使用woocommerce对象,并使用wordpress数据库在数据库中添加关于术语,termmeta,术语与post的关系的缺失数据对象 - 但没有什么能够让它发挥作用 . 而且我无法确定我出错的地方 - 这就是为什么我无法提供更窄的问题 - 堆栈溢出更多的东西 .

2 回答

  • 1

    之后:以编程方式创建具有新属性值的WooCommerce产品变体

    在这里,您可以创建具有新产品属性值的新变量产品:

    /**
     * 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;
            //print_r($attributes);
            set_transient( 'wc_attribute_taxonomies', $attributes );
        } else {
            return;
        }
    }
    
    /**
     * 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_col("SELECT attribute_id
        FROM {$wpdb->prefix}woocommerce_attribute_taxonomies
        WHERE attribute_name LIKE '$name'");
        return reset($attribute_id);
    }
    
    /**
     * Create a new variable product (with new attributes if they are).
     * (Needed functions:
     *
     * @since 3.0.0
     * @param array $data | The data to insert in the product.
     */
    
    function create_product_variation( $data ){
        if( ! function_exists ('save_product_attribute_from_name') ) return;
    
        $postname = sanitize_title( $data['title'] );
        $author = empty( $data['author'] ) ? '1' : $data['author'];
    
        $post_data = array(
            'post_author'   => $author,
            'post_name'     => $postname,
            'post_title'    => $data['title'],
            'post_content'  => $data['content'],
            'post_excerpt'  => $data['excerpt'],
            'post_status'   => 'publish',
            'ping_status'   => 'closed',
            'post_type'     => 'product',
            'guid'          => home_url( '/product/'.$postname.'/' ),
        );
    
        // Creating the product (post data)
        $product_id = wp_insert_post( $post_data );
    
        // Get an instance of the WC_Product_Variable object and save it
        $product = new WC_Product_Variable( $product_id );
        $product->save();
    
        ## ---------------------- Other optional data  ---------------------- ##
        ##     (see WC_Product and WC_Product_Variable setters methods)
    
        // THE PRICES (No prices yet as we need to create product variations)
    
        // IMAGES GALLERY
        if( ! empty( $data['gallery_ids'] ) && count( $data['gallery_ids'] ) > 0 )
            $product->set_gallery_image_ids( $data['gallery_ids'] );
    
        // SKU
        if( ! empty( $data['sku'] ) )
            $product->set_sku( $data['sku'] );
    
        // STOCK (stock will be managed in variations)
        $product->set_stock_quantity( $data['stock'] ); // Set a minimal stock quantity
        $product->set_manage_stock(true);
        $product->set_stock_status('');
    
        // Tax class
        if( empty( $data['tax_class'] ) )
            $product->set_tax_class( $data['tax_class'] );
    
        // WEIGHT
        if( ! empty($data['weight']) )
            $product->set_weight(''); // weight (reseting)
        else
            $product->set_weight($data['weight']);
    
        $product->validate_props(); // Check validation
    
        ## ---------------------- VARIATION ATTRIBUTES ---------------------- ##
    
        $product_attributes = array();
    
        foreach( $data['attributes'] as $key => $terms ){
            $taxonomy = wc_attribute_taxonomy_name($key); // The taxonomy slug
            $attr_label = ucfirst($key); // attribute label name
            $attr_name = ( wc_sanitize_taxonomy_name($key)); // attribute slug
    
            // NEW Attributes: Register and save them
            if( ! taxonomy_exists( $taxonomy ) )
                save_product_attribute_from_name( $attr_name, $attr_label );
    
            $product_attributes[$taxonomy] = array (
                'name'         => $taxonomy,
                'value'        => '',
                'position'     => '',
                'is_visible'   => 0,
                'is_variation' => 1,
                'is_taxonomy'  => 1
            );
    
            foreach( $terms as $value ){
                $term_name = ucfirst($value);
                $term_slug = sanitize_title($value);
    
                // Check if the Term name exist and if not we create it.
                if( ! term_exists( $value, $taxonomy ) )
                    wp_insert_term( $term_name, $taxonomy, array('slug' => $term_slug ) ); // Create the term
    
                // Set attribute values
                wp_set_post_terms( $product_id, $term_name, $taxonomy, true );
            }
        }
        update_post_meta( $product_id, '_product_attributes', $product_attributes );
        $product->save(); // Save the data
    }
    

    代码位于活动子主题(或活动主题)的function.php文件中 . 经过测试和工作 .


    USAGE (具有2个新属性值的示例):

    create_product_variation( array(
        'author'        => '', // optional
        'title'         => 'Woo special one',
        'content'       => '<p>This is the product content <br>A very nice product, soft and clear…<p>',
        'excerpt'       => 'The product short description…',
        'regular_price' => '16', // product regular price
        'sale_price'    => '', // product sale price (optional)
        'stock'         => '10', // Set a minimal stock quantity
        'image_id'      => '', // optional
        'gallery_ids'   => array(), // optional
        'sku'           => '', // optional
        'tax_class'     => '', // optional
        'weight'        => '', // optional
        // For NEW attributes/values use NAMES (not slugs)
        'attributes'    => array(
            'Attribute 1'   =>  array( 'Value 1', 'Value 2' ),
            'Attribute 2'   =>  array( 'Value 1', 'Value 2', 'Value 3' ),
        ),
    ) );
    

    经过测试和工作 .


    有关:

  • 8

    您还可以使用新的本机函数来设置/获取postmeta中的数据 .

    这是一个有效的例子(基于Woocommerce 3的默认虚拟产品)

    //Create main product
    $product = new WC_Product_Variable();
    
    //Create the attribute object
    $attribute = new WC_Product_Attribute();
    //pa_size tax id
    $attribute->set_id( 1 );
    //pa_size slug
    $attribute->set_name( 'pa_size' );
    
    //Set terms slugs
    $attribute->set_options( array(
            'blue',
            'grey'
    ) );
    $attribute->set_position( 0 );
    
    //If enabled
    $attribute->set_visible( 1 );
    
    //If we are going to use attribute in order to generate variations
    $attribute->set_variation( 1 );
    
    $product->set_attributes(array($attribute));
    
    //Save main product to get its id
    $id = $product->save();
    
    
    $variation = new WC_Product_Variation();
    $variation->set_regular_price(5);
    $variation->set_parent_id($id);
    
    //Set attributes requires a key/value containing
    // tax and term slug
    $variation->set_attributes(array(
            'pa_size' => 'blue'
    ));
    
    //Save variation, returns variation id
    $variation->save();
    

    您可以使用Woocommerce 3中提供的本机功能以及类似set_price,set_sku等添加重量,税,sku等内容 .

    把它包裹在一个功能中,你很高兴 .

相关问题