2014-08-29 9 views
9

मैं WooCommerce के लिए [उत्पाद एड-ऑन] [1] एक्सटेंशन का उपयोग कर रहा हूं, जो उत्पादों के लिए कस्टम फ़ील्ड की अनुमति देता है। यह स्वचालित रूप से एकल उत्पाद टेम्पलेट पर प्रदर्शित होता है।WooCommerce: "उत्पाद ऐड-ऑन" एक्सटेंशन से फ़ील्ड कैसे प्रदर्शित करें?

कुछ उत्पाद टेम्पलेट के साथ कुछ परीक्षण और त्रुटि से, यह woocommerce_single_product_summary (single_meta?) में कहीं भी हुक प्रतीत होता है।

मुझे archive-product टेम्पलेट (उत्पादों की सूची) पर प्रदर्शित करने के लिए फॉर्म फ़ील्ड का एक ही सेट प्राप्त करने की आवश्यकता है। मेरे मामले में, यह कार्ड अनुरोध के लिए एक क्षेत्र है और एक डिलीवरी तिथि के लिए है। उत्पाद संग्रह से कार्ट में उत्पाद को जोड़ा जा सकता है इससे पहले दोनों की आवश्यकता होती है। मुझे यकीन नहीं है कि कोई फ़ंक्शन है जिसके लिए मैं कॉल कर सकता हूं, अगर इसमें कुछ और उन्नत कोडिंग शामिल है।


प्रति Pelmered का जवाब, मैं functions.php को यह जोड़ने के साथ दिखाने के लिए ऐड-ऑन क्षेत्रों प्राप्त करने में सक्षम था:

फिर

add_action('woocommerce_after_shop_loop_item_title', array($GLOBALS['Product_Addon_Display'], 'display'), 10);

1 ली प्रयास करते हैं, समस्या यह थी कि उत्पाद संग्रह एक फॉर्म तत्व नहीं बना रहा था, केवल कार्ट बटन में जोड़ने के लिए एक एंकर लिंक था। इसलिए मैंने मैन्युअल रूप से एक फॉर्म डालने का प्रयास किया है। content-product.php से कोड:

<?php do_action('woocommerce_before_shop_loop_item'); ?> 
<h2><?php the_title(); ?></h2> 

<?php // MANUALLY PUT IN FORM, BECAUSE HOOKS ONLY PUT IN A BUTTON AND NO FORM. NEEDED FOR ADD-ON FIELDS ?> 
<form class="cart" method="post" enctype='multipart/form-data'> 
    <?php 
     /** 
     * woocommerce_after_shop_loop_item_title hook 
     * 
     * @hooked woocommerce_template_loop_rating - 5 
     * @hooked woocommerce_template_loop_price - 10 
     */ 
     do_action('woocommerce_after_shop_loop_item_title'); 
    ?>   
    <div itemprop="description"> 
     <?php the_content(); ?> 
    </div> 
    <input type="hidden" name="add-to-cart" value="<?php echo esc_attr($product->id); ?>" /> 
    <button type="submit" class="single_add_to_cart_button button alt"><?php echo $product->single_add_to_cart_text(); ?></button> 
</form> 

<?php //do_action('woocommerce_after_shop_loop_item'); ?> 

यह काम किया, लेकिन एक तरह से AJAX के प्रस्तुत करने और फ्लैश संदेशों को खराब करता। कार्ट बटन में जोड़ने पर क्लिक करने के बाद, पृष्ठ रीफ्रेश करने लगता है, और फिर ऐसा लगता है कि कुछ भी नहीं हुआ। लेकिन जब आप किसी अन्य पृष्ठ पर जाते हैं, तो यह संदेश प्रदर्शित करता है (और एकाधिक स्टैक कर सकते हैं)।

2ND प्रयास

तो मैंने देखा कि मूल AJAX गाड़ी बटन (एक फार्म के भीतर नहीं) एक क्वेरी स्ट्रिंग उपयोग कर रहा था उत्पाद ID भेजने के लिए। तो अब मैं कार्ट जेएस में जोड़ने को संशोधित करके अतिरिक्त पैरामीटर पर काम करने का प्रयास कर रहा हूं। यह काम किया। मैंने स्वीकृत उत्तर के रूप में क्या जोड़ा।

+1

WooCommerce समर्थन से प्रतिक्रिया थी "इस अनुकूलन हमारे समर्थन पॉलिसी के तहत कवर नहीं है"। वास्तव में इसके लिए एक समाधान की जरूरत है। – jwinn

उत्तर

4

मुझे एक समाधान मिला है जो jQuery क्षेत्र का उपयोग AJAX अनुरोध में फॉर्म फ़ील्ड मान जोड़ने के लिए करता है। इसके लिए अपने स्वयं के संस्करण के साथ ऐड-टू-कार्ट.जेएस ओवरराइडिंग की आवश्यकता है, इसलिए उस फ़ाइल के भविष्य के अपडेट को विलय करने की आवश्यकता हो सकती है।

कार्यों में।php

// display add-on fields in woocommerce_after_shop_loop_item_title 
add_action('woocommerce_after_shop_loop_item_title', array($GLOBALS['Product_Addon_Display'], 'display'), 10); 

// Our custom cart JS to allow for product add-on fields on product archive 
add_action('wp_enqueue_scripts', 'load_woo_scripts', 9); 
function load_woo_scripts() { 
    wp_enqueue_script('wc-add-to-cart', get_template_directory_uri() . '/js/add-to-cart.js', array('jquery'), WC_VERSION, true); 
} 

डुप्लिकेट /assets/add-to-cart.js woocommerce प्लगइन फ़ोल्डर से, और फ़ोल्डर load_woo_scripts में संदर्भित करने के लिए जोड़ें। फिर var date = { कथन (लाइन 21) के बाद निम्नलिखित जोड़ें।

// ========================================================================= 
// ADD PRODUCT ADD-ON FIELDS TO SUBMISSION (to allow from product archive) 
// Store name and value of fields in object. 
var addonfields = {}; 
$(this).parent().find(".after-shop-loop-item-title :input").each(function() { 
    addonfields[this.name] = $(this).val(); 
}); 

// Merge new fields and existing data 
data = $.extend(data, addonfields); 

// Testing: final value of data 
console.log(data); 
// ========================================================================= 

यह नाम और .after-shop-loop-item-title div के भीतर सभी इनपुट फ़ील्ड मान कहते हैं। मैं अपने विषय के woocommerce/content-product.php टेम्पलेट को यह div/वर्ग जोड़ दिया है:

<?php do_action('woocommerce_before_shop_loop_item'); ?> 
<h2><?php the_title(); ?></h2> 
<div itemprop="description"> 
    <?php the_content(); ?> 
</div> 

<div class="after-shop-loop-item-title"> 
    <?php 
     /** 
     * woocommerce_after_shop_loop_item_title hook 
     * 
     * @hooked woocommerce_template_loop_rating - 5 
     * @hooked woocommerce_template_loop_price - 10 
     */ 
     do_action('woocommerce_after_shop_loop_item_title'); 
    ?> 
</div> 

<?php do_action('woocommerce_after_shop_loop_item'); ?> 

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

मैं सच में आशा है कि WooCommerce यह भविष्य में आसान बना देता है ...

3

कोड के उपयोग के बिना आपको एक सटीक प्रति-पेस्ट समाधान देना असंभव है, लेकिन यह उसी कार्य को संलग्न करना संभव होना चाहिए जो झुका हुआ हो।

हुक है कि एकल उत्पाद पृष्ठ को यह कहते हैं शायद इस तरह दिखता है:

add_action('woocommerce_single_product_summary', array($this, 'woocommerce_product_add_ons_something')); 

हासिल टेम्पलेट के लिए इस कार्रवाई संलग्न करने के साथ ही आप शायद इस तरह कुछ करने के लिए सक्षम होना चाहिए:

add_action('woocommerce_after_shop_loop_item_title', array('WC_Product_Add_On', 'woocommerce_product_add_ons_something')); 

WC_Product_Add_On प्लगिन का वर्ग नाम है और उस वर्ग से मेल खाने के लिए बदला जाना चाहिए जिसमें कार्रवाई में कार्य/विधि है। इस कोड को अपनी थीम में functions.php फ़ाइल में रखें।

देखें कि यह काम करता है या नहीं। यदि नहीं, तो मुझे और जानकारी दें और मैं अपना जवाब विस्तारित कर सकता हूं।

+0

सही दिशा में जानकारी के लिए धन्यवाद। मैंने अपना प्रश्न कोड के साथ अपडेट किया है और जहां मैं हूं। – jwinn

संबंधित मुद्दे