2014-09-03 7 views
8

मैं एक woocommerce ईमेल टेम्पलेट में किसी ऑर्डर से कुछ डेटा प्राप्त करने का प्रयास कर रहा हूं, लेकिन get_post_meta केवल झूठी रिटर्न देता है। यह कोड धन्यवाद पेज पर काम करता है। मैंने इस पर बहुत अधिक समय बिताया है। किसी भी सहायता की सराहना की जाएगी। धन्यवाद!woocommerce ईमेल अधिसूचनाओं में get_post_meta

global $post; 

echo "test!!!<br />"; 
$x = get_post_meta($order->id, 'attendee_data', true); 
$y = get_post_meta($order->id, 'attendee_test', true); 
echo $order->id . '<br />'; 
echo $x; 
echo $y; 

मैंने एसक्यूएल के साथ-साथ एक ईमेल की एक तस्वीर संलग्न की है।

एसक्यूएल: http://i.stack.imgur.com/zUFBa.png

ईमेल: http://i.stack.imgur.com/Uqtih.png

पूरे ईमेल टेम्पलेट:

<?php do_action('woocommerce_email_header', $email_heading); ?> 

<p><?php _e("Your order has been received and is now being processed. Your order details are shown below for your reference:", 'woocommerce'); ?></p> 

<?php do_action('woocommerce_email_before_order_table', $order, $sent_to_admin, $plain_text); ?> 

<h2><?php echo __('Order:', 'woocommerce') . ' ' . $order->get_order_number(); ?></h2> 

<table cellspacing="0" cellpadding="6" style="width: 100%; border: 1px solid #eee;" border="1" bordercolor="#eee"> 
    <thead> 
     <tr> 
      <th scope="col" style="text-align:left; border: 1px solid #eee;"><?php _e('Product', 'woocommerce'); ?></th> 
      <th scope="col" style="text-align:left; border: 1px solid #eee;"><?php _e('Quantity', 'woocommerce'); ?></th> 
      <th scope="col" style="text-align:left; border: 1px solid #eee;"><?php _e('Price', 'woocommerce'); ?></th> 
     </tr> 
    </thead> 
    <tbody> 
     <?php echo $order->email_order_items_table($order->is_download_permitted(), true, ($order->status=='processing') ? true : false); ?> 
    </tbody> 
    <tfoot> 
     <?php 
      if ($totals = $order->get_order_item_totals()) { 
       $i = 0; 
       foreach ($totals as $total) { 
        $i++; 
        ?><tr> 
         <th scope="row" colspan="2" style="text-align:left; border: 1px solid #eee; <?php if ($i == 1) echo 'border-top-width: 4px;'; ?>"><?php echo $total['label']; ?></th> 
         <td style="text-align:left; border: 1px solid #eee; <?php if ($i == 1) echo 'border-top-width: 4px;'; ?>"><?php echo $total['value']; ?></td> 
        </tr><?php 
       } 
      } 
     ?> 
    </tfoot> 
</table> 

<?php 
global $post; 

echo "test!!!<br />"; 
$x = get_post_meta($order->id, 'attendee_data', true); 
$y = get_post_meta($order->id, 'attendee_test', true); 
echo $order->id . '<br />'; 
echo $x; 
echo $y; 
foreach ($x as $k => $p) { 
    echo $k ." ... ". $p; 
} ?> 

<?php // attendee_order_details($order->get_order_number()) ?> 

<?php do_action('woocommerce_email_after_order_table', $order, $sent_to_admin, $plain_text); ?> 

<?php do_action('woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text); ?> 

<h2><?php _e('Customer details', 'woocommerce'); ?></h2> 

<?php if ($order->billing_email) : ?> 
    <p><strong><?php _e('Email:', 'woocommerce'); ?></strong> <?php echo $order->billing_email; ?></p> 
<?php endif; ?> 
<?php if ($order->billing_phone) : ?> 
    <p><strong><?php _e('Tel:', 'woocommerce'); ?></strong> <?php echo $order->billing_phone; ?></p> 
<?php endif; ?> 

<?php wc_get_template('emails/email-addresses.php', array('order' => $order)); ?> 

<?php do_action('woocommerce_email_footer'); ?> 
+0

'ग्राहक-प्रसंस्करण-order.php' की लाइन 56 में क्या है? – Dez

+0

टेम्पलेट को संशोधित करने के बजाय 'woocommerce_email_after_order_table' कार्रवाई को हुक करना बेहतर होगा। – doublesharp

+0

आप 'ग्लोबल $ पोस्ट' को हटाने का प्रयास कर सकते हैं क्योंकि आप' $ ऑर्डर' का उपयोग कर रहे हैं ... – doublesharp

उत्तर

-1

ठीक है, 'attendee_data' एक धारावाहिक वस्तु है तो तीसरा तर्क समारोह get_post_meta पर पारित गलत (या छोड़ा गया) पर सेट किया जाना चाहिए।

$x = get_post_meta($order->id, 'attendee_data', false); 
+0

यह गलत है। जैसा कि बताया गया है [दस्तावेज़ों में] (http: // codex .wordpress.org/Function_Reference/get_post_meta): 'तीसरा तर्क, यदि सत्य पर सेट किया गया है, तो एक स्ट्रिंग के रूप में एक परिणाम देगा। अगर गलत है, या सेट नहीं है, तो फ़ंक्शन कस्टम फ़ील्ड की सरणी देता है। यह धारावाहिक सरणी के संदर्भ में अंतर्ज्ञानी नहीं हो सकता है। यदि आप इस विधि के साथ एक धारावाहिक सरणी प्राप्त करते हैं तो आप वास्तव में एक सिंगरियललाइज्ड सरणी प्राप्त करने के लिए $ सिंगल सच होना चाहते हैं। अगर आप झूठ बोलते हैं, या इसे छोड़ देते हैं, तो आपके पास होगा एक की एक सरणी, और इंडेक्स पर मूल्य पूर्व 0 serialized स्ट्रिंग होगा। – rnevius

+0

वास्तव में, इस विधि के साथ वह इंडेक्स 0 के साथ अन्य सरणी के भीतर एक सरणी प्राप्त करेगा। लेकिन यह अजीब तरह है क्योंकि attendee_test काम कर रहा है लेकिन attendee_data नहीं है। – 3pepe3

+0

'attendee_test' या तो काम नहीं कर रहा है। ईमेल में दिखाए जाने वाली एकमात्र चीजें 'इको "परीक्षण से हैं !!!
"; "और' ऑर्डर $ ऑर्डर-> आईडी। '
'; '... जब तक कि मुझे कुछ याद नहीं आ रहा है। – rnevius

1

मैंने आपकी जानकारी के आधार पर कुछ परीक्षण किया और आपकी समस्याओं को पुन: उत्पन्न करने का प्रयास किया।

सबसे पहले मैंने एक ऐसा फ़ंक्शन बनाया जो ऑर्डर देने पर पोस्ट मेटा (attendee_test और attendee_data) डालता है (woocommerce_checkout_update_order_meta हुक जैसा आप करते हैं)।

मैं अपने विषयों में इस जोड़ा functions.php (नोट करें कि मान अपने इनपुट (db से छवि) पर आधारित है और गतिशील, बस के परीक्षण के लिए नहीं कर रहे हैं कर रहे हैं):

add_action('woocommerce_checkout_update_order_meta', 'add_meta_values', 2); 

function add_meta_values($order_id){ 

    // array with attendee data 
    $attendee_data = array(
     array(
      'edit' => 'false', 
      'company' => 'get', 
     ) 
    ); 

    add_post_meta($order_id, 'attendee_data', $attendee_data); 
    add_post_meta($order_id, 'attendee_test', 'test'); 

} 

तो मैं करने के लिए निम्न कोड जोड़ा टेम्पलेट customer-processing-order.php:

<?php 

$attendee_data = get_post_meta($order->id, 'attendee_data', true); 
$attendee_test = get_post_meta($order->id, 'attendee_test', true); 

echo 'Order ID: ' . $order->id . '<br />'; 
echo 'Attendee Test: ' . $attendee_test . '<br />'; 
echo 'Attendee Data:<br />'; 

foreach ($attendee_data as $k => $data) { 

    foreach ($data as $key => $value){ 

     echo $key . ' .. ' . $value . '<br />'; 

    } 

} ?> 

आप देख सकते हैं मैं इसे थोड़ा संशोधित इसे और अधिक स्पष्ट कर देना। $ Attendee_data पाश भी बदल दिया क्योंकि मुझे लगता है कि यह बिल्कुल सही नहीं था (एक अतिरिक्त foreach की आवश्यकता है)। बेशक यह वास्तविक समस्या से संबंधित नहीं है।

बनाना एक testorder ईमेल में निम्नलिखित डेटा दिखाई देगा:

Data in order confirmation email

यह परिणाम दर्शाते हैं कि get_post_meta ऊपर कोड के आधार पर ईमेल टेम्पलेट में काम कर रहा है। (मैंने वर्डप्रेस 4.0.1 और WooCommerce 2.2.10 का उपयोग किया)।

परीक्षण ऊपर अपने मामले में भी ठीक काम कर रहा है, तो मुझे लगता है कि मानों अपने डेटाबेस के बाद ईमेल भेज दिया जाता है (वे सही डाला जाता है, लेकिन देर से करने के लिए) में डाला जाता है।

एक और चीज जो आप जांचना चाहें पुष्टि पुष्टिकरण ईमेल भेज रही है। आप इसे WordPress व्यवस्थापक से कर सकते हैं। जब आप ऑर्डर संपादित करते हैं तो आपके पास दाईं ओर एक ड्रॉपडाउन 'क्रियाएं' होती हैं। आप 'ऑर्डर ईमेल भेजें' के तहत 'प्रसंस्करण आदेश' का चयन कर सकते हैं। फिर ड्रॉपडाउन के बगल में रीफ्रेश आइकन पर क्लिक करें और आपको ऑर्डर पुष्टिकरण ईमेल फिर से प्राप्त होगा। देखें नीचे स्क्रीनशॉट:

Resend order confirmation email

इस बार आप निश्चित रूप से पता मूल्यों इससे पहले कि आप ईमेल भेज रहे हैं डेटाबेस में पहले से ही कर रहे हैं।

आशा है कि यह जानकारी आपको समस्या का समाधान करने में मदद कर रही है।

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