php Woocommerce: हटाए गए "woocommerce_add_order_item_meta" को बदलने के लिए कौन सा हुक



wordpress hook-woocommerce (8)

आपका विशिष्ट उपयोग मामला बहुत स्पष्ट नहीं है (आपने यह मेटा जानकारी जोड़ने की आवश्यकता कब या कहाँ से निर्दिष्ट नहीं की है), लेकिन आप चेकआउट के दौरान woocommerce_checkout_update_order_meta उपयोग कर सकते हैं।

चेकआउट फ़ील्ड को कस्टमाइज़ करने में अधिक पढ़ें।

https://src-bin.com

आइटम ऑर्डर करने के लिए कस्टम मेटा जोड़ने की आवश्यकता है। इसे googled और अधिकांश लेख "woocommerce_add_order_item_meta" हुक का उपयोग करने के लिए कहते हैं। इस हुक को नवीनतम संस्करण 2.3.7 में चित्रित किया गया है। किसी ने, कृपया मुझे बताएं कि इसके बजाय किस हुक का उपयोग करना है।

http://docs.woothemes.com/wc-apidocs/function-woocommerce_add_order_item_meta.html


Answer #1

ऐसा नहीं लगता है कि हुक भी हटा दिया गया है: PHP त्रुटि: "woocommerce_add_order_item_meta" हुक डेट डेटा संरचनाओं का उपयोग करता है और फ़ंक्शन 3.1.2 के बाद से पदावनत हो जाता है। Woocommerce_new_order_item से बदलें।

मैं इसे यहाँ भी नहीं देख सकता: https://docs.woocommerce.com/wc-apidocs/hook-docs.html


Answer #2

ऐसा लगता है कि हुक अब 3.0.4 संस्करण के रूप में भी चित्रित किया गया है। मुझे यह सूचना मिल रही है:

The The "woocommerce_add_order_item_meta" hook uses out of date data structures and function is deprecated since version 3.0.4. Replace with woocommerce_new_order_item.

मैंने एक्शन नाम 'woocommerce_add_order_item_meta' को एक आक्रामक प्लगइन में add_action स्टेटमेंट में 'woocommerce_new_order_item' के साथ बदल दिया है, और नोटिफिकेशन नोटिफिकेशन गायब हो जाता है, समस्या यह है कि कुछ पैरामीटर अब एक legacy_values सरणी के अंदर दिखाई देते हैं। मैं प्लगइन YITH WooCommerce Product Add Ons का उपयोग करता हूं, और उत्पाद मेटा डेटा जो एक ऑर्डर से जुड़ा होना चाहिए, प्लगइन द्वारा नहीं उठाया जाता है और इसलिए ऑर्डर के साथ संग्रहीत नहीं किया जाता है। इसलिए जब तक यह प्लगइन में तय नहीं हो जाता है तब तक आपको पदावनति अधिसूचना के साथ रहना होगा।


Answer #3

बस चीजों को स्पष्ट करने के लिए, इस फ़ंक्शन को हटा दिया गया था, लेकिन हुक अभी भी ठीक है


Answer #4

मुझे पता है कि इसका उत्तर दिया जा चुका है और पहले से ही स्वीकृत उत्तर है। मैं वास्तव में एक पदावनत संदेश प्राप्त किए बिना इसे संभालने का एक और तरीका देना चाहता था ( reference देखें);

add_action('woocommerce_new_order_item', 'saveMetaData', 10, 3); // or use just 2 instead of 3; if you don't need order id

/**
 * Add meta to order item
 *
 * @param int $itemId
 * @param WC_Order_Item_Product|WC_Order_Item_Shipping $item
 * @param int @orderId
*/
function saveMetaData($itemId, $item, $orderId)
{
    if (!isItemValid($item))
    {
        return;
    }

    wc_add_order_item_meta($itemId, 'my_custom_data', $item->legacy_values['my_custom_data']);
}

/**
 * @param WC_Order_Item_Product|WC_Order_Item_Shipping $item
 *
 * @return bool
*/
function isItemValid($item)
{
    return (
        $item instanceof WC_Order_Item_Product &&
        isset($item->legacy_values) &&
        isset($item->legacy_values['my_custom_data']) &&
        !empty($item->legacy_values['my_custom_data'])
    );
}

Answer #5

मैं Ilgıt Yıldırım के उत्तर को जोड़ना चाहता था: मेरे मामले में, मेरे कस्टम मूल्य आइटम-> legacy_values ​​के सरणी में मौजूद नहीं थे। इसे ठीक करने के लिए, मैंने woocommerce_new_order_item हुक को कॉल करने से पहले आइटम में कस्टम मान जोड़ने के लिए woocommerce_checkout_create_order_line_item हुक का उपयोग किया। यहाँ इसका एक उदाहरण दिया गया है:

add_action ('woocommerce_checkout_create_order_line_item', 'save_values_in_item', PHP_INT_MAX, 4);

फ़ंक्शन save_values_in_item ($ आइटम, $ cart_item_key, $ मान, $ आदेश) {

                $item->myCustomValues = $values;

}

// नए हुक को कॉल करें: add_action ('woocommerce_new_order_item', 'add_product_input_fields_to_order_item_meta_wc3', PHP_INT_MAX, 3);

function add_product_input_fields_to_order_item_meta_wc3 ($ item_id, $ आइटम, $ order_id) {

            if ( isset( $item->myCustomValues ) ) 
            {
                  //iterate through array and place desired values into the meta data using the wc_add_order_item_meta function
            }

}


Answer #6

यदि आप wc-deprecated-functions.php को देखेंगे तो देखेंगे

/**
 * @deprecated
 */
function woocommerce_add_order_item_meta( $item_id, $meta_key, $meta_value, $unique = false ) {
    return wc_add_order_item_meta( $item_id, $meta_key, $meta_value, $unique );
}

असल में, फ़ंक्शन का नाम बदलकर wc_add_order_item_meta() कर दिया गया है, इसलिए यदि आपको फ़ंक्शन की आवश्यकता है, तो उसका उपयोग करें। कार्रवाई हुक का नाम नहीं बदला गया और class-wc-checkout.php में बना हुआ है:

// Allow plugins to add order item meta
do_action( 'woocommerce_add_order_item_meta', $item_id, $values, $cart_item_key );

Answer #7

2017/2018 द राइट वे (नए CRUD बसने और गेटर्स विधियों का उपयोग करके)

संबंधित: Woocommerce 3.4 में woocommerce_add_order_item_meta हुक बदलें

चूंकि woocommerce 3 जिसने कई बदलावों में सुधार किया है, कार्रवाई हुक woocommerce_add_order_item_meta अभी भी पूरी तरह से woocommerce संस्करण 3.3+ में काम करता है।

यह हुक WC_Checkout वर्ग विधियों और संबंधित कार्यों द्वारा चेकआउट प्रक्रिया में सक्षम है और WC_Checkout वर्ग में नहीं है जहाँ कार्ट डेटा उपलब्ध नहीं है।

अब जैसा कि Woocommmerce 3 ने नए CRUD सेटर और गेटर्स तरीके पेश किए हैं , उपयोग किए जाने वाले समान प्रतिस्थापन हुक woocommerce_checkout_create_order_line_item है जिसमें कार्ट डेटा के समान उपयोगी तर्क हैं।

woocommerce_new_order_item वास्तव में सुविधाजनक नहीं है क्योंकि कार्ट डेटा पहुँच योग्य नहीं है।

आइए देखें कि कैसे woocommerce_checkout_create_order_line_item साथ काम करना है। इसके 4 उपलब्ध तर्क हैं:

  • $item WC_Order_Item_Product की एक नई श्रेणी है
  • $cart_item_key कार्ट आइटम अद्वितीय हैश कुंजी है
  • $values कार्ट आइटम है
  • $order WC_Order ऑब्जेक्ट का एक उदाहरण $order (यह कुछ विशिष्ट मामलों में एक बहुत ही उपयोगी अतिरिक्त तर्क है)

इस हुक में हम पुराने वर्किंग फंक्शन्स को wc_add_order_item_meta () को नए WC_Data update_meta_data() पद्धति से $item तर्क के साथ प्रतिस्थापित करेंगे।

उदाहरण:

## --- New way --- ##
add_action( 'woocommerce_checkout_create_order_line_item', 'custom_checkout_create_order_line_item', 20, 4 );
function custom_checkout_create_order_line_item( $item, $cart_item_key, $values, $order ) {
    // Get a product custom field value
    $custom_field_value = get_post_meta( $item->get_product_id(), '_meta_key', true );
    // Update order item meta
    if ( ! empty( $custom_field_value ) ){
        $item->update_meta_data( 'meta_key1', $custom_field_value );
    }
    // … … Or … …

    // Get cart item custom data and update order item meta
    if( isset( $values['custom_data'] ) ) {
        $item->update_meta_data( 'meta_key2', $values['custom_data'] );
    }
}

अंत में हम पुराने तरीके से woocommerce_add_order_item_meta हुक का उपयोग कर सकते हैं क्योंकि इसमें लगभग समान तर्क हैं:

## --- Old way --- ##
add_action( 'woocommerce_add_order_item_meta', 'custom_add_order_item_meta', 20, 3 );
function custom_add_order_item_meta( $item_id, $values, $cart_item_key ) {
    // Get a product custom field value
    $custom_field_value = get_post_meta( $values['data']->get_id(), '_meta_key', true );
    // Update order item meta
    if ( ! empty( $custom_field_value ) ){
        wc_add_order_item_meta( $item_id, 'meta_key1', $custom_field_value );
    }
    // … … Or … …

    // Get cart item custom data and update order item meta
    if( isset( $values['custom_data'] ) ) {
        wc_add_order_item_meta( $item_id, 'meta_key2', $values['custom_data'] );
    }
}

निष्कर्ष: woocommerce_checkout_create_order_line_item WooCommerce 3+ के साथ उपयोग किया जाने वाला सही प्रतिस्थापन हुक है और यह नया CRUD बसने और प्राप्त करने के तरीकों को बताता है।