Salva il valore del campo personalizzato di checkout e visualizzalo negli ordini dell'amministratore di WooCommerce

Jan 07 2021

Ho alcuni campi aggiuntivi nel mio checkout per porre domande al cliente su determinate cose riguardanti il ​​suo ordine. La maggior parte di questi sono campi di immissione di testo, ma c'è un menu Seleziona che chiede loro come hanno sentito parlare del sito dei miei clienti. Non sono riuscito a capire come visualizzare il valore nella meta area dell'ordine per l'opzione selezionata. Ecco come sto generando quel menu a discesa di selezione nel mio file functions.php dal mio tema.

woocommerce_form_field( 'aba_hear', array(
    'type'     => 'select',
    'required' => 'true',
    'class'    => array('hear-class form-row-wide'),
    'label'    => __('How did You Hear About Us?'),
    'options'  => array( // options for <select> or <input type="radio" />
        ''          => 'Please select', // empty values means that field is not selected
        'Instagram' => 'Instagram',
        'Facebook'  => 'Facebook',
        'Yelp'  => 'Yelp',
        'Other' => 'Other',
    )

), $checkout->get_value( 'aba_hear' ) );

Ora aggiungo una funzione per aggiornare i meta valori dell'ordine:

add_action( 'woocommerce_checkout_update_order_meta', 'aba_checkout_field_update_order_meta' );

function aba_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['aba_hear'] ) ) { update_post_meta( $order_id, 'How did You Hear About Us&#63;', sanitize_text_field( $_POST['aba_hear'] ) );
    }
}

E infine visualizza il valore nella pagina dell'ordine:

add_action( 'woocommerce_admin_order_data_after_billing_address', 'aba_checkout_field_display_admin_order_meta', 10, 1 );
function aba_checkout_field_display_admin_order_meta($order){
    echo '<p><strong>'.__('How did You Hear About Us&#63;').':</strong> ' . get_post_meta( $order->id, 'Is this a Gift&#63;', true ) . '</p>';
}

Infine ecco come appare il codice del menu di selezione al momento del pagamento:

<p class="form-row hear-class form-row-wide validate-required" id="aba_hear_field" data-priority="">
    <label for="aba_hear" class="">How did You Hear About Us&#063;&nbsp;<abbr class="required" title="required">*</abbr></label>
    <span class="woocommerce-input-wrapper">
        <select name="aba_hear" id="aba_hear" class="select " data-allow_clear="true" data-placeholder="Please select">
            <option value=""  selected='selected'>Please select</option>
            <option value="Instagram" >Instagram</option>
            <option value="Facebook" >Facebook</option>
            <option value="Yelp" >Yelp</option>
            <option value="Other" >Other</option>
        </select>
    </span>
</p>

Ora, questo funziona bene per i campi di input di testo ma non per i menu selezionati. Come posso cambiarlo per farlo funzionare in modo da poter visualizzare i dati risultanti?

Risposte

1 LoicTheAztec Jan 07 2021 at 15:07

Ci sono alcuni errori in alcune delle tue funzioni ... Devi usare lo stesso tasto del campo di checkout del metatasto nelle seguenti funzioni:

Nella seconda funzione, usi un altro hook e salvi anche il campo personalizzato come metadati dell'utente:

add_action( 'woocommerce_checkout_create_order', 'aba_checkout_field_update_order_meta' );

function aba_checkout_field_update_order_meta( $order ) { if ( isset($_POST['aba_hear']) && ! empty($_POST['aba_hear']) ) { $order->update_meta_data( '_aba_hear', sanitize_text_field( $_POST['aba_hear'] ) ); // Update user data if( $order->get_user_id() > 0 ) {
            update_user_meta( $order->get_user_id(), 'aba_hear', true );
        }
    }
}

Nella 3a funzione usa questo:

add_action( 'woocommerce_admin_order_data_after_billing_address', 'aba_checkout_field_display_admin_order_meta', 10, 1 );
function aba_checkout_field_display_admin_order_meta( $order ){
    $value = $order->get_meta( '_aba_hear' );

    if ( ! empty($value) ) { echo '<p><strong>'.__('How did You Hear About Us&#63;').':</strong> ' . $value . '</p>';
    }
}

Dovrebbe funzionare meglio ora.


Appunti:

Perché salvare questo campo di checkout anche come metadati utente personalizzati?

Perché nella tua prima funzione hai $checkout->get_value( 'aba_hear' )che visualizzerà il valore selezionato dall'ultimo ordine del cliente in questo campo di checkout personalizzato. Il valore viene letto dal meta utente "aba_hear".