2014-09-03 4 views
8

Sto cercando di ottenere alcuni dati da un ordine in un modello di email woocommerce, ma get_post_meta restituisce semplicemente false. Questo codice funziona sulla pagina grazie. Ho passato troppo tempo su questo. Qualsiasi aiuto sarebbe apprezzato. Grazie!get_post_meta in woocommerce notifiche email

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; 

Ho allegato una foto della SQL così come una e-mail.

SQL: http://i.stack.imgur.com/zUFBa.png

Email: http://i.stack.imgur.com/Uqtih.png

Il modello di email intero:

<?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

cosa c'è nella riga 56 di 'customer-processing-order.php'? – Dez

+0

Probabilmente sarebbe meglio agganciare all'azione 'woocommerce_email_after_order_table' invece di modificare il modello. – doublesharp

+0

Si potrebbe provare a rimuovere 'global $ post' dal momento che si sta usando' $ order' ... – doublesharp

risposta

-1

Beh, 'attendee_data' è un oggetto serializzato in modo che il terzo argomento passato alla funzione get_post_meta deve essere impostato su false (o omesso).

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

Questo è sbagliato. Come accennato [nei documenti] (http: // codex .wordpress.org/Function_Reference/get_post_meta): 'Il terzo argomento, se impostato su true, restituirà un singolo risultato, come stringa. Se false o non impostate, la funzione restituisce un array di campi personalizzati. Questo potrebbe non essere intuitivo nel contesto degli array serializzati.Se si recupera un array serializzato con questo metodo, si desidera che $ single sia true per ottenere di nuovo un array non serializzato. Se si passa in false o lo si lascia fuori, si avrà un array di uno, e il valore di ind ex 0 sarà la stringa serializzata. – rnevius

+0

anzi, con questo metodo otterrà una matrice all'interno di un altro array con indice 0. Ma questo è un po 'strano perché addee_test sta funzionando ma non in attendee_data. – 3pepe3

+0

'attendee_test' non funziona. Le uniche cose mostrate nell'e-mail sono dal test "echo" !!!
";' e 'echo $ order-> id. '
'; '... a meno che mi manchi qualcosa. – rnevius

1

ho fatto alcuni test, sulla base di informazioni e cercato di riprodurre i vostri problemi.

Prima ho creato una funzione che inserisce il post meta (attendee_test e attendee_data) quando si effettua un ordine (utilizzando l'hook woocommerce_checkout_update_order_meta come si fa).

ho aggiunto questo nei miei temi functions.php (Si noti che i valori si basano sul vostro ingresso (immagine da db) e non sono dinamici, solo per i test):

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'); 

} 

poi ho aggiunto il seguente codice per il modello 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 />'; 

    } 

} ?> 

Come potete vedere ho modificato un po 'per renderlo più chiaro. Ho anche modificato il ciclo $ attendee_data perché ritengo che non fosse completamente corretto (era necessario un foreach extra). Naturalmente questo non è legato al vero problema.

Fare un testorder mostrerà i seguenti dati nella e-mail:

Data in order confirmation email

Questo risultato dimostrare che get_post_meta sta lavorando nel modello di posta elettronica in base al codice di cui sopra. (Ho usato Wordpress 4.0.1 e WooCommerce 2.2.10).

Se la prova di cui sopra sta lavorando bene anche nel tuo caso, allora penso che i valori vengono inseriti nel database dopo l'e-mail viene inviata (che vengono inseriti a destra, ma in ritardo).

Un'altra cosa che si potrebbe voler controllare è il reinvio dell'e-mail di conferma. Puoi farlo dall'amministratore di Wordpress. Quando modifichi un ordine hai un menu a discesa "Azioni" sul lato destro. Puoi selezionare "Ordine di elaborazione" in "Invia e-mail di invio". Quindi fai clic sull'icona di aggiornamento accanto al menu a discesa e riceverai di nuovo l'e-mail di conferma dell'ordine. Veda la figura sottostante:

Resend order confirmation email

Questa volta si sa per certo i valori sono già presenti nel database, prima si sta inviando l'email.

Spero che questa informazione ti aiuti a risolvere il problema.