php नए विशेषता मूल्यों के साथ प्रोग्रामेटिक रूप से एक WooCommerce उत्पाद भिन्नता बनाएं




wordpress product (5)

सितंबर 2018 अपडेट करें: टैक्सोनोमी क्रिएशन को संभालना

एक परिभाषित चर उत्पाद आईडी से, आपको बोल्ड मिलेगा, एक कस्टम फ़ंक्शन जो एक उत्पाद भिन्नता जोड़ देगा (बना देगा)। चर माता-पिता उत्पाद को इसके लिए आवश्यक विशेषताओं को निर्धारित करना होगा।

आपको कुछ जानकारी प्रदान करनी होगी:

  • विशेषताओं / मूल्यों की सरणी
  • Sku, कीमतें और स्टॉक…।

यह डेटा एक स्वरूपित बहु आयामी सरणी में संग्रहीत किया जाना है (अंत में एक उदाहरण देखें)

यह फ़ंक्शन यह जाँच करेगा कि क्या विशेषताएँ मान (नाम) पहले से मौजूद हैं और यदि नहीं: - यह इसे उत्पाद विशेषता के लिए बनाता है - इसे मूल चर उत्पाद में सेट करें।

कस्टम फ़ंक्शन कोड:

/**
 * Create a product variation for a defined variable product ID.
 *
 * @since 3.0.0
 * @param int   $product_id | Post ID of the product parent variable product.
 * @param array $variation_data | The data to insert in the product.
 */

function create_product_variation( $product_id, $variation_data ){
    // Get the Variable product object (parent)
    $product = wc_get_product($product_id);

    $variation_post = array(
        'post_title'  => $product->get_title(),
        'post_name'   => 'product-'.$product_id.'-variation',
        'post_status' => 'publish',
        'post_parent' => $product_id,
        'post_type'   => 'product_variation',
        'guid'        => $product->get_permalink()
    );

    // Creating the product variation
    $variation_id = wp_insert_post( $variation_post );

    // Get an instance of the WC_Product_Variation object
    $variation = new WC_Product_Variation( $variation_id );

    // Iterating through the variations attributes
    foreach ($variation_data['attributes'] as $attribute => $term_name )
    {
        $taxonomy = 'pa_'.$attribute; // The attribute taxonomy

        // If taxonomy doesn't exists we create it (Thanks to Carl F. Corneil)
        if( ! taxonomy_exists( $taxonomy ) ){
            register_taxonomy(
                $taxonomy,
               'product_variation',
                array(
                    'hierarchical' => false,
                    'label' => ucfirst( $attribute ),
                    'query_var' => true,
                    'rewrite' => array( 'slug' => sanitize_title($attribute) ), // The base slug
                ),
            );
        }

        // Check if the Term name exist and if not we create it.
        if( ! term_exists( $term_name, $taxonomy ) )
            wp_insert_term( $term_name, $taxonomy ); // Create the term

        $term_slug = get_term_by('name', $term_name, $taxonomy )->slug; // Get the term slug

        // Get the post Terms names from the parent variable product.
        $post_term_names =  wp_get_post_terms( $product_id, $taxonomy, array('fields' => 'names') );

        // Check if the post term exist and if not we set it in the parent variable product.
        if( ! in_array( $term_name, $post_term_names ) )
            wp_set_post_terms( $product_id, $term_name, $taxonomy, true );

        // Set/save the attribute data in the product variation
        update_post_meta( $variation_id, 'attribute_'.$taxonomy, $term_slug );
    }

    ## Set/save all other data

    // SKU
    if( ! empty( $variation_data['sku'] ) )
        $variation->set_sku( $variation_data['sku'] );

    // Prices
    if( empty( $variation_data['sale_price'] ) ){
        $variation->set_price( $variation_data['regular_price'] );
    } else {
        $variation->set_price( $variation_data['sale_price'] );
        $variation->set_sale_price( $variation_data['sale_price'] );
    }
    $variation->set_regular_price( $variation_data['regular_price'] );

    // Stock
    if( ! empty($variation_data['stock_qty']) ){
        $variation->set_stock_quantity( $variation_data['stock_qty'] );
        $variation->set_manage_stock(true);
        $variation->set_stock_status('');
    } else {
        $variation->set_manage_stock(false);
    }

    $variation->set_weight(''); // weight (reseting)

    $variation->save(); // Save the data
}

कोड आपके सक्रिय चाइल्ड थीम (या थीम) या किसी भी प्लगइन फाइल में भी काम करता है।

उपयोग (उदाहरण 2 विशेषताओं के साथ):

$parent_id = 746; // Or get the variable product id dynamically

// The variation data
$variation_data =  array(
    'attributes' => array(
        'size'  => 'M',
        'color' => 'Green',
    ),
    'sku'           => '',
    'regular_price' => '22.00',
    'sale_price'    => '',
    'stock_qty'     => 10,
);

// The function to be run
create_product_variation( $parent_id, $variation_data );

परीक्षण किया और काम करता है।

भाग 2: प्रोग्राम को एक परिवर्तनीय उत्पाद और दो नए गुण Woocommerce में बनाएँ

यह आपको बैकएंड में मिलेगा:

और यह फ्रंट एंड में पूरी तरह से काम करेगा।

संबंधित: Woocommerce 3 में CRUD विधियों का उपयोग करके प्रोग्रामेटिक रूप से एक उत्पाद बनाएं

मैंने WooCommerce संस्करण 3+ में एक चर उत्पाद ("मूल" उत्पाद) बनाया है। एक वर्डप्रेस प्लगइन से, मैं नए विशेषताओं मूल्यों के साथ प्रोग्रामिक रूप से उत्पाद विविधताएं ("बच्चे" उत्पाद) बनाना चाहूंगा।

विविधता विशेषताएँ WooCommerce में पहले से ही सेट हैं।
इसलिए हर बार एक भिन्नता निर्मित होने के बाद, नई विशेषता के मानों को प्रोग्रामेटिक रूप से बनाया जाना चाहिए और मूल चर उत्पाद में सेट किया जाना चाहिए।

यह कैसे किया जा सकता है? क्या यह संभव है?

अपडेट: मैंने इस पर कोड की अधिक पंक्तियां लिखी थीं, जो मैंने चाहा, और इसे सुलझाने के लिए कई चीजों की कोशिश की, woocommerce ऑब्जेक्ट्स का उपयोग किया, और वर्डप्रेस डेटाबेस का उपयोग करके डेटाबेस में पद, टर्ममेटा, पोस्ट के साथ संबंध के बारे में लापता डेटा जोड़ा। ऑब्जेक्ट - लेकिन इसे बनाने के लिए कुछ भी पर्याप्त नहीं है। और मैं पिन-पॉइंट नहीं कर सकता था जहां मैं गलत हो गया था - यही कारण है कि मैं एक संकीर्ण समस्या नहीं दे सका - ऐसी चीजें जिनके लिए स्टैकओवरफ्लो अधिक है।


यदि उत्पाद की कर-व्यवस्था पहले से कहीं और पंजीकृत नहीं है, तो आप यहाँ एक समस्या में भाग सकते हैं। यदि आप यह सुनिश्चित करना चाहते हैं कि टैक्सोनॉमी मौजूद है, तो आप LoicTheAztec के जवाब में एक सशर्त जोड़ सकते हैं।

कुछ इस तरह।

$article_name = 'Test';

$post_id = wp_insert_post( array(
    'post_author' => 1,
    'post_title' => $article_name,
    'post_content' => 'Lorem ipsum',
    'post_status' => 'publish',
    'post_type' => "product",
) );
wp_set_object_terms( $post_id, 'variable', 'product_type' );

$attr_label = 'Test attribute';
$attr_slug = sanitize_title($attr_label);

$attributes_array[$attr_slug] = array(
    'name' => $attr_label,
    'value' => 'alternative 1 | alternative 2',
    'is_visible' => '1',
    'is_variation' => '1',
    'is_taxonomy' => '0' // for some reason, this is really important       
);
update_post_meta( $post_id, '_product_attributes', $attributes_array );

$parent_id = $post_id;
$variation = array(
    'post_title'   => $article_name . ' (variation)',
    'post_content' => '',
    'post_status'  => 'publish',
    'post_parent'  => $parent_id,
    'post_type'    => 'product_variation'
);

$variation_id = wp_insert_post( $variation );
update_post_meta( $variation_id, '_regular_price', 2 );
update_post_meta( $variation_id, '_price', 2 );
update_post_meta( $variation_id, '_stock_qty', 10 );
update_post_meta( $variation_id, 'attribute_' . $attr_slug, 'alternative 1' );
WC_Product_Variable::sync( $parent_id );

$variation_id = wp_insert_post( $variation );
update_post_meta( $variation_id, '_regular_price', 2 );
update_post_meta( $variation_id, '_price', 2 );
update_post_meta( $variation_id, '_stock_qty', 10 );
update_post_meta( $variation_id, 'attribute_' . $attr_slug, 'alternative 2' );
WC_Product_Variable::sync( $parent_id );

यह काम करता है, लेकिन थोड़ा सुधार (फ़ॉरेस सरणी में 2 कॉमा) की आवश्यकता है, मैंने अपनी आवश्यकताओं के लिए कुछ कोड संपादित किए।

(wp 4.9 पर काम करना। wc 3.5)

पहले उत्पादों के लिए पहले से निर्मित और संबद्ध विशेषता होना आवश्यक है, मेरा वर्गीकरण "पा_आर" अनुकूल नाम "आर" बैकएंड विशेषता सहयोगी img है

सुधार के साथ कार्य

function create_product_variation( $product_id, $variation_data ){
// Get the Variable product object (parent)
$product = wc_get_product($product_id);

$variation_post = array(
    'post_title'  => $product->get_title(),
    'post_name'   => 'product-'.$product_id.'-variation',
    'post_status' => 'publish',
    'post_parent' => $product_id,
    'post_type'   => 'product_variation',
    'guid'        => $product->get_permalink()
);

// Creating the product variation
$variation_id = wp_insert_post( $variation_post );

// Get an instance of the WC_Product_Variation object
$variation = new WC_Product_Variation( $variation_id );

// Iterating through the variations attributes
foreach ($variation_data['attributes'] as $attribute => $term_name )
{
    $taxonomy = 'pa_'.$attribute; // The attribute taxonomy

    // If taxonomy doesn't exists we create it (Thanks to Carl F. Corneil)
    if( ! taxonomy_exists( $taxonomy ) ){
        register_taxonomy(
            $taxonomy,
            'product_variation',
            array(
                'hierarchical' => false,
                'label' => ucfirst( $taxonomy ),
                'query_var' => true,
                'rewrite' => array( 'slug' => '$taxonomy') // The base slug
            )
        );
    }

    // Check if the Term name exist and if not we create it.
    if( ! term_exists( $term_name, $taxonomy ) )
        wp_insert_term( $term_name, $taxonomy ); // Create the term

    $term_slug = get_term_by('name', $term_name, $taxonomy )->slug; // Get the term slug

    // Get the post Terms names from the parent variable product.
    $post_term_names =  wp_get_post_terms( $product_id, $taxonomy, array('fields' => 'names') );

    // Check if the post term exist and if not we set it in the parent variable product.
    if( ! in_array( $term_name, $post_term_names ) )
        wp_set_post_terms( $product_id, $term_name, $taxonomy, true );

    // Set/save the attribute data in the product variation
    update_post_meta( $variation_id, 'attribute_'.$taxonomy, $term_slug );
}

## Set/save all other data

// SKU
if( ! empty( $variation_data['sku'] ) )
    $variation->set_sku( $variation_data['sku'] );

// Prices
if( empty( $variation_data['sale_price'] ) ){
    $variation->set_price( $variation_data['regular_price'] );
} else {
    $variation->set_price( $variation_data['sale_price'] );
    $variation->set_sale_price( $variation_data['sale_price'] );
}
$variation->set_regular_price( $variation_data['regular_price'] );

// Stock
if( ! empty($variation_data['stock_qty']) ){
    $variation->set_stock_quantity( $variation_data['stock_qty'] );
    $variation->set_manage_stock(true);
    $variation->set_stock_status('');
} else {
    $variation->set_manage_stock(false);
}

$variation->set_weight(''); // weight (reseting)

$variation->save(); // Save the data
}

मैंने उन डेटा के साथ एक सरणी बनाई है जिनकी मुझे विविधता में आवश्यकता है [id_post, विशेषता, sku, regular_price, स्टॉक]

$hijos = array(
[9623,'265/70 R16','NE-CT-CO-USA-016-005','0',53],
[9624,'235/65 R17','NE-AU-CO-EUR-017-050','189000',56]
);

और मेरे उत्पादों के सभी रूपों को गतिशील रूप से बनाने के लिए फोरच

foreach ($hijos as $vari) {
// The variation data
$variation_data =  array(
    'attributes' => array(
        'r'  => $vari[1],
    ),
    'sku'           => $vari[2],
    'regular_price' => str_replace('.', '', $vari[3]),
    'stock_qty'     => $vari[4]
);
// var_dump($variation_data);
create_product_variation( $vari[0], $variation_data );
}

यदि आप WooCommerce में परीक्षण के लिए उत्पादों को उत्पन्न करना चाहते हैं, तो आप WooCommerce द्वारा बनाए गए WooCommerce चिकना जनरेटर का उपयोग कर सकते हैं।

https://github.com/woocommerce/wc-smooth-generator

उदाहरण:

// Generate WC_Product object and save it to database
// 70% change generated product is simple
// 30% chance generated product is variable
$product = \WC\SmoothGenerator\Generator\Product::generate();

// Returns WC_Product object of Simple product and don't save it  to database
$product = \WC\SmoothGenerator\Generator\Product::generate_simple_product();

// Returns WC_Product object of Variable Product and saves it to database
$variable_product = \WC\SmoothGenerator\Generator\Product::generate_variable_product();

Src: https://github.com/woocommerce/wc-smooth-generator/blob/master/includes/Generator/Product.php

यदि आप उत्पादों को प्रोग्राम बनाना चाहते हैं, तो आप अपनी आवश्यकताओं के साथ उत्पाद वर्ग बना सकते हैं।


LoicTheAztec के उत्तर पर विस्तार करते हुए, आप जांच सकते हैं कि विशेषता संयोजन उसके कोड में निम्नलिखित संशोधन के साथ मौजूद है या नहीं।

function create_update_product_variation( $product_id, $variation_data ){

    if(isset($variation_data['variation_id'])) {

      $variation_id = $variation_data['variation_id'];

    } else {

      // if the variation doesn't exist then create it

      // Get the Variable product object (parent)
      $product = wc_get_product($product_id);

      $variation_post = array(
          'post_title'  => $product->get_title(),
          'post_name'   => 'product-'.$product_id.'-variation',
          'post_status' => 'publish',
          'post_parent' => $product_id,
          'post_type'   => 'product_variation',
          'guid'        => $product->get_permalink()
      );

      // Creating the product variation
      $variation_id = wp_insert_post( $variation_post );

    }

    // ...

}

उदाहरण उपयोग

// The variation data
$variation_data =  array(
    'attributes' => array(
        'size'  => 'M',
        'color' => 'Green',
    ),
    'sku'           => '',
    'regular_price' => '22.00',
    'sale_price'    => '1',
    'stock_qty'     => 1,
);

// check if variation exists
$meta_query = array();
foreach ($variation_data['attributes'] as $key => $value) {
  $meta_query[] = array(
    'key' => 'attribute_pa_' . $key,
    'value' => $value
  );
}

$variation_post = get_posts(array(
  'post_type' => 'product_variation',
  'numberposts' => 1,
  'post_parent'   => $parent_id,
  'meta_query' =>  $meta_query
));

if($variation_post) {
  $variation_data['variation_id'] = $variation_post[0]->ID;
}

create_update_product_variation( $product_id, $variation_data );




variations