Un utente ha chiesto informazioni su WooCommerce di Wordpress

Aggiungi campi personalizzati alle e-mail del nuovo ordine

Un utente ha chiesto 👇

Ciao,
Ho aggiunto 2 campi alla pagina di pagamento (messaggio della carta e migliore data di consegna). Funziona bene, ma i 2 campi non sono inclusi nell’e-mail Nuovo ordine al cliente.

Il mio codice finora è:

// ADD Custom Fields to Checkout Page
/**
 * Add the field to the checkout
 **/

add_action('woocommerce_after_order_notes', 'my_custom_checkout_field');

function my_custom_checkout_field( $checkout ) {
	
	
	// card message
	    $cardoptions = array('' => __('Select CardMessage', 'woocommerce' )); 

    echo '<div id="my_custom_checkout_field"><h3>'.__('Card message').'</h3>';

   woocommerce_form_field( 'card_message', array(
        'type'          => 'textarea',
        'class'         => array('my-field-class form-row-wide'),
        'id'            => 'card_message',
        'required'      => true,
        'label'         => __('Enter your message to appear on the card'),
        'placeholder'       => __(''),
        'options'     =>   $cardoptions
        ),$checkout->get_value( 'card_message' ));

    echo '</div>';

// select delivery date
    $mydateoptions = array('' => __('Select DeliveryDay', 'woocommerce' )); 

    echo '<div id="my_custom_checkout_field"><h3>'.__('Delivery date').'</h3>';

   woocommerce_form_field( 'order_delivery_date', array(
        'type'          => 'text',
        'class'         => array('my-field-class form-row-wide'),
        'id'            => 'datepicker',
        'required'      => true,
        'label'         => __('We deliver Mon to Sat. Any orders received on a Sunday will be delivered on the next working day'),
        'placeholder'       => __('Select Date'),
        'options'     =>   $mydateoptions
        ),$checkout->get_value( 'order_delivery_date' ));

    echo '</div>';
}

/**
 * Process the checkout
 **/
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');

function my_custom_checkout_field_process() {
    global $woocommerce;

    // Check if set, if its not set add an error.
    if (!$_POST['card_message'])
         wc_add_notice( '<strong>CardMessage</strong> ' . __( 'is a required field.', 'woocommerce' ), 'error' );
	if (!$_POST['order_delivery_date'])
         wc_add_notice( '<strong>DeliveryDay</strong> ' . __( 'is a required field.', 'woocommerce' ), 'error' );
}

/**
 * Update the order meta with field value
 **/
add_action('woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta');

function my_custom_checkout_field_update_order_meta( $order_id ) {
    if ($_POST['card_message']) update_post_meta( $order_id, 'CardMessage', esc_attr($_POST['card_message']));
	if ($_POST['order_delivery_date']) update_post_meta( $order_id, 'DeliveryDay', esc_attr($_POST['order_delivery_date']));
}

Cosa devo aggiungere in modo che i 2 nuovi campi siano inclusi nelle e-mail Nuovo ordine e Ordine non riuscito?
Grazie

Supporto per plugin

(@mikkamp)

Ingegnere della felicità di Automattic

2 anni, 12 mesi fa

Ciao,

Puoi utilizzare uno degli hook nei modelli di email. O “woocommerce_email_order_details” o “woocommerce_email_customer_details”.

Ti suggerirei di esaminare la directory / modello di posta elettronica e guardare i modelli utilizzati per le e-mail ordinate. Quindi puoi afferrarlo nel posto giusto.

La seguente guida spiega di più sulle strutture dei modelli: https://docs.woocommerce.com/document/template-structure/

Un’altra opzione è utilizzare il Checker Field Editor: https://woocommerce.com/products/woocommerce-checkout-field-editor/

Ciò ti consentirà di aggiungere campi che verranno visualizzati sia nei dettagli dell’ordine che nelle e-mail.

Lanciatore di thread

(@dllive)

2 anni, 12 mesi fa

Grazie.

Il cliente non vuole pagare per il plug-in Check Field Editor. 🙁

Non sei sicuro di come “agganciarti nel posto giusto”

Ho provato quanto segue che ho trovato in un post del forum, ma non funziona:

add_filter( 'woocommerce_email_order_meta_fields', 'custom_woocommerce_email_order_meta_fields', 10, 3 );

function custom_woocommerce_email_order_meta_fields( $fields, $sent_to_admin, $order ) {
    $fields['meta_key'] = array(
        'label' => __( 'Enter your message to appear on the card' ),
        'value' => get_post_meta( $order->id, 'card_message', true ),
    );
    return $fields;
}

Supporto per plugin

(@mikkamp)

Ingegnere della felicità di Automattic

2 anni, 12 mesi fa

Se guardi il modello di comando email puoi vedere che l’hook che utilizza si chiama “woocommerce_email_order_meta”

Guarda: https://github.com/woocommerce/woocommerce/blob/release/3.3/templates/emails/customer-completed-order.php#L43

Anche le variabili passate all’hook sono molto diverse. Quindi dovresti regolarli di conseguenza. Riceverai un esempio di un comando $ che puoi utilizzare per ottenere i tuoi campi personalizzati.

Lanciatore di thread

(@dllive)

2 anni, 12 mesi fa

Mi dispiace davvero tanto Michael, come puoi vedere, non sono lo sviluppatore più esperto. 🙂

Quindi ho cambiato il mio codice in:

add_filter( 'woocommerce_email_order_meta', 'custom_woocommerce_email_order_meta', 10, 3 );

function custom_woocommerce_email_order_meta( $fields, $sent_to_admin, $order ) {
    $fields['meta_key'] = array(
        'label' => __( 'Enter your message to appear on the card' ),
        'value' => get_post_meta( $order->id, 'card_message', true ),
    );
    return $fields;
}

Come invio la variabile card_message all’email?

Supporto per plugin

(@mikkamp)

Ingegnere della felicità di Automattic

2 anni, 12 mesi fa

Ci sono molti modi per farlo. Il mio suggerimento era di metterlo su un cerchio d’azione se l’altro codice non funzionava per te. Anche se dovresti cambiare completamente il codice nel modo in cui visualizza i dati personalizzati.
La documentazione seguente spiega ulteriormente come funzionano gli hook di azione e filtro:
https://docs.woocommerce.com/document/introduction-to-hooks-actions-and-filters/

Anche il codice sorgente che stavi utilizzando dovrebbe funzionare. Non esiste una ragione specifica per cui non funziona. Anche se consiglierei di ottenere i dati direttamente dall’oggetto $ command. Qualcosa di simile funziona perfettamente per me:

add_filter( 'woocommerce_email_order_meta_fields', 'custom_woocommerce_email_order_meta_fields', 10, 3 );
function custom_woocommerce_email_order_meta_fields( $fields, $sent_to_admin, $order ) {
    $fields['card_message'] = array(
        'label' => __( 'Enter your message to appear on the card' ),
        'value' => $order->get_meta( 'card_message', true ),
    );
    return $fields;
}

Questa risposta è stata modificata 2 anni, 12 mesi fa da. Questa risposta è stata modificata 2 anni, 12 mesi fa da. Lanciatore di thread

(@dllive)

2 anni, 12 mesi fa

Hmm, ho provato il tuo codice e ancora niente. Ho ragione a pensare che dovrebbe essere visualizzato anche nell’e-mail di errore? O funziona solo nelle e-mail di New Order?

Quale sarebbe il codice se usassi l’azione (probabilmente “woocommerce_email_order_meta_fields”?)

Mi dispiace. Grazie per la tua continua assistenza. : /

Supporto per plugin

(@dustinhartzler)

Ingegnere della felicità di Automattic

2 anni, 12 mesi fa

Dove metti questo codice sul tuo sito?

Lanciatore di thread

(@dllive)

2 anni, 12 mesi fa

Ciao Dustin. Sto aggiungendo un file functions.php al mio tema.

Tutto quello che devi fare è chiarire: devo mostrare i 2 nuovi campi nelle e-mail di Nuovo ordine e nelle e-mail di ordine non riuscito.

Supporto per plugin

(@dustinhartzler)

Ingegnere della felicità di Automattic

2 anni, 12 mesi fa

Questo livello di personalizzazione va un po ‘oltre il livello di supporto gratuito per i forum. Raccomando uno sviluppatore di fascia alta per far funzionare le cose correttamente.

Lanciatore di thread

(@dllive)

2 anni, 11 mesi fa

Ciao ragazzi, riaprite questo.

Ho * quasi * trovato che funzioni. Il mio codice nel mio functions.php:

add_filter( 'woocommerce_email_order_meta_fields', 'woocommerce_email_order_meta_fields_func', 10, 3 );
function woocommerce_email_order_meta_fields_func( $fields, $sent_to_admin, $order ) {

	$fields['card_message'] = array(
		'label' => __( 'Enter your message to appear on the card', 'woocommerce' ),
		'value' => wptexturize( get_post_meta( $order->id, 'card_message', true ) ),
	);
	
	$fields['delivery_instructions'] = array(
		'label' => __( 'Delivery date' ),
		'value' => get_post_meta( $order->id, 'order_delivery_date', true ),
	);

	//... more meta fields goes here

	return $fields;
}

add_action( 'woocommerce_email_after_order_table', 'woocommerce_email_after_order_table_func' );
function woocommerce_email_after_order_table_func( $order ) {
	?>

	<h3>Additional information</h3>
	<table>
		<tr>
			<td>Card message: </td>
			<td><?php echo wptexturize( get_post_meta( $order->id, 'card_message', true ) ); ?></td>
		</tr>
		<tr>
			<td>Order delivery date: </td>
			<td><?php echo wptexturize( get_post_meta( $order->id, 'order_delivery_date', true ) ); ?></td>
		</tr>
	</table>

	<?php
}

Questo mostra l’html nelle mie e-mail, MA non passa attraverso le 2 variabili.

Mi sento come se fossi quasi arrivato, voglio solo che queste 2 variabili vengano visualizzate nelle e-mail.

Grazie mille per il tuo aiuto 🙂

(@lorro)

2 anni, 11 mesi fa

Mi spiace, non posso dire perché non funziona ma può offrire ciò che ha funzionato per me:

1. aggiungi un campo al controllo – ok

2. Raccogli i metadati e aggiungili a una tabella postmeta – Non sto usando lo stesso hook, non posso dire se questo fa la differenza.

add_action( 'woocommerce_new_order', 'tp_new_order' );
function tp_new_order( $order_id ) {
  $tp_preferred_slot_nr = isset( $_POST['tp_preferred_slot_nr'] ) ? $_POST['tp_preferred_slot_nr'] : 0;
    add_post_meta( $order_id, 'tp_preferred_slot_nr', $tp_preferred_slot_nr, true ); 
}

3. Controllare la tabella postmeta in phpMyAdmin per assicurarsi che i valori vengano aggiunti alla tabella

4. Ottieni il valore dalla tabella postmeta – Sto anche usando get_post_meta () ma è all’interno del mio modello di email personalizzato ($ command viene automaticamente inoltrato al modello)
$preferred_slot_nr = get_post_meta( $order->get_id(), 'tp_preferred_slot_nr', true );

Lanciatore di thread

(@dllive)

2 anni, 11 mesi fa

AH! Grazie mille lorro – ora funziona !!! 🙂

Was this helpful?

0 / 0

Lascia un commento 0

Your email address will not be published. Required fields are marked *