Cum se reordonează câmpurile de facturare în șablonul WooCommerce Checkout?
Creez un formular de checkout în stil madlib folosind Personalizarea câmpurilor de checkout folosind acțiuni și filtre de la WooTheme.
Câmpurile de facturare din șablonul checkout form-billing.php
sunt afișate cu această comandă:
<?php foreach ($checkout->checkout_fields['billing'] as $key => $field) : ?>
<?php woocommerce_form_field( $key, $field, $checkout->get_value( $key ) ); ?>
<?php endforeach; ?>
Cum pot schimba ordinea în care apar câmpurile?
Ordinea actuală (implicită) a câmpurilor este:
prenume
nume
companie (ascuns pentru mine)
oraș
cod poștal
țară
județ
email
telefon
Ordinea implicită:
Vreau ca câmpurile să fie într-o ordine mai naturală pentru americani (unde locuiesc), așa că:
prenume
nume
companie (ascuns pentru mine)
oraș
județ
cod poștal
țară
email
telefon
Care este cea mai bună modalitate de a face acest lucru?
Același lucru poate fi realizat prin fișierul functions.php
din tema (child) ta:
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;
}

Cel mai bun răspuns, deoarece utilizează cea mai bună practică WordPress/WooCommerce prin filtrarea datelor înainte ca acestea să ajungă în șablon, astfel încât niciun fișier de șablon nu trebuie suprascris.

Această metodă funcționa înainte, dar acum nu mai funcționează. Cred că este din cauză că JavaScript-ul de checkout modifică dinamic comanda.

Modul actual de a face acest lucru este prin atribuirea unei priorități:-
$fields['billing']['billing_country']['priority'] = 10;
$fields['billing']['billing_phone']['priority'] = 20;
Vezi aici https://wordpress.org/support/topic/change-order-of-billing-fields-on-checkout-page/

Mulțumiri lui Dbranes pentru răspuns.
Înlocuiește:
<?php foreach ($checkout->checkout_fields['billing'] as $key => $field) : ?>
<?php woocommerce_form_field( $key, $field, $checkout->get_value( $key ) ); ?>
<?php endforeach; ?>
Cu:
<?php
// ordonează cheile pentru ordonarea personalizată sau elimină cele de care nu ai nevoie
$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; ?>

acest cod provine dintr-o funcție internă Woocommerce. utilizarea codului din primul răspuns [un filtru] ar fi mult mai bună.

Pentru mine nu funcționează. Cea mai bună metodă este să folosești "priority" pentru fiecare câmp, ceva de genul:
$fields['billing']['billing_country']['priority'] = 10; $fields['billing']['billing_phone']['priority'] = 20;
Poate se datorează noilor versiuni de Woocommerce, dar nu sunt sigur.

Puteți face o copie în tema dumneavoastră și editați șablonul care afișează formularul de finalizare a comenzii.
Adaptat din documentația plugin-ului:
Exemplu
Pentru a suprascrie notificarea de comandă din admin, copiați:woocommerce/templates/checkout/form-checkout.php
în
yourtheme/woocommerce/checkout/form-checkout.php
[actualizare]
În acest fișier, chiar înainte ca câmpurile să fie afișate, există acest cârlig de acțiune: do_action('woocommerce_before_checkout_billing_form', $checkout);
.
Deci, este suficient să adăugați această acțiune în fișierul functions.php
al temei sau într-un plugin personalizat și să reordonați câmpurile așa cum arată OP în răspunsul său. Nu este nevoie să suprascrieți șablonul, decât dacă sunt necesare alte personalizări suplimentare.

Șablonul menționat îți permite doar să muți <?php do_action('woocommerce_checkout_billing'); ?>
în întregime.
