Come riordinare i campi di fatturazione nel template del checkout WooCommerce?
Sto creando un modulo di checkout in stile madlib utilizzando la guida di WooTheme Personalizzazione dei campi del checkout usando actions e filters.
I campi di fatturazione nel template checkout form-billing.php
vengono visualizzati con questa chiamata:
<?php foreach ($checkout->checkout_fields['billing'] as $key => $field) : ?>
<?php woocommerce_form_field( $key, $field, $checkout->get_value( $key ) ); ?>
<?php endforeach; ?>
Come posso modificare l'ordine di apparizione dei campi?
L'ordine attuale (predefinito) dei campi è:
nome
cognome
azienda (nascosto per me)
città
CAP
paese
stato/provincia
email
telefono
Ordine predefinito:
Voglio che i campi siano in un ordine più naturale per gli americani (dove vivo), quindi:
nome
cognome
azienda (nascosto per me)
città
stato/provincia
CAP
paese
email
telefono
Qual è il modo migliore per farlo?
Lo stesso può essere fatto tramite il file functions.php
del tuo tema (child):
add_filter("woocommerce_checkout_fields", "order_fields");
function order_fields($fields) {
$order = array(
"billing_first_name",
"billing_last_name",
"billing_company",
"billing_address_1",
"billing_address_2",
"billing_postcode",
"billing_country",
"billing_email",
"billing_phone"
);
foreach($order as $field)
{
$ordered_fields[$field] = $fields["billing"][$field];
}
$fields["billing"] = $ordered_fields;
return $fields;
}

Miglior risposta in quanto utilizza la miglior pratica di wp/wc filtrando i dati prima che raggiungano il template, quindi non è necessario sovrascrivere alcun file di template.

Funzionava in passato ma ora non più. Penso sia perché il JS del checkout modifica dinamicamente l'ordine.

Il modo attuale per farlo è assegnare una priorità:-
$fields['billing']['billing_country']['priority'] = 10;
$fields['billing']['billing_phone']['priority'] = 20;
Vedi qui https://wordpress.org/support/topic/change-order-of-billing-fields-on-checkout-page/

Grazie a Dbranes per la risposta.
Sostituisci:
<?php foreach ($checkout->checkout_fields['billing'] as $key => $field) : ?>
<?php woocommerce_form_field( $key, $field, $checkout->get_value( $key ) ); ?>
<?php endforeach; ?>
Con:
<?php
// ordina le chiavi per il tuo ordinamento personalizzato o elimina quelle che non ti servono
$mybillingfields=array(
"billing_first_name",
"billing_last_name",
"billing_company",
"billing_address_1",
"billing_address_2",
"billing_city",
"billing_state",
"billing_postcode",
"billing_country",
"billing_email",
"billing_phone",
);
foreach ($mybillingfields as $key) : ?>
<?php woocommerce_form_field( $key, $checkout->checkout_fields['billing'][$key], $checkout->get_value( $key ) ); ?>
<?php endforeach; ?>

questo codice proviene da una funzione interna di WooCommerce. utilizzare il codice della prima risposta [un filtro] sarebbe molto meglio.

Puoi fare una copia nel tuo tema e modificare il template che genera il modulo di checkout.
Adattato dalla documentazione del plugin:
Esempio
Per sovrascrivere la notifica d'ordine nell'admin, copia:woocommerce/templates/checkout/form-checkout.php
in
yourtheme/woocommerce/checkout/form-checkout.php
[aggiornamento]
In questo file, appena prima che i campi vengano stampati, c'è questo action hook: do_action('woocommerce_before_checkout_billing_form', $checkout);
.
Quindi, basta aggiungere questa azione nel functions.php
del tema o in un plugin personalizzato e riordinare i campi come mostrato nella risposta dell'OP. Non è necessario sovrascrivere il template, a meno che non siano necessarie ulteriori personalizzazioni.

Il modello che hai menzionato ti consente solo di spostare <?php do_action('woocommerce_checkout_billing'); ?>
in blocco.
