¿Cómo reordenar los campos de facturación en la plantilla de pago de WooCommerce?
Estoy creando un formulario de pago estilo madlib usando Personalización de campos de pago usando acciones y filtros de WooTheme.
Los campos de facturación en la plantilla de pago form-billing.php
se muestran con esta llamada:
<?php foreach ($checkout->checkout_fields['billing'] as $key => $field) : ?>
<?php woocommerce_form_field( $key, $field, $checkout->get_value( $key ) ); ?>
<?php endforeach; ?>
¿Cómo puedo cambiar el orden en que aparecen los campos?
El orden actual (predeterminado) de los campos es:
nombre
apellido
empresa (oculto para mí)
ciudad
código postal
país
estado
email
teléfono
Orden predeterminado:
Quiero que los campos estén en un orden más natural para los estadounidenses (donde vivo), así:
nombre
apellido
empresa (oculto para mí)
ciudad
estado
código postal
país
email
teléfono
¿Cuál es la mejor manera de hacer esto?
Lo mismo se puede hacer a través del functions.php
en tu tema (hijo):
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;
}

Mejor respuesta ya que utiliza las mejores prácticas de wp/wc filtrando los datos antes de que lleguen a la plantilla, por lo que no es necesario sobrescribir ningún archivo de plantilla.

Esto solía funcionar pero ya no. Creo que es porque el JS de checkout modifica dinámicamente el pedido.

La forma actual de hacerlo es asignando una prioridad:-
$fields['billing']['billing_country']['priority'] = 10;
$fields['billing']['billing_phone']['priority'] = 20;
Consulta aquí https://wordpress.org/support/topic/change-order-of-billing-fields-on-checkout-page/

Gracias a Dbranes por la respuesta.
Reemplazar:
<?php foreach ($checkout->checkout_fields['billing'] as $key => $field) : ?>
<?php woocommerce_form_field( $key, $field, $checkout->get_value( $key ) ); ?>
<?php endforeach; ?>
Con:
<?php
// ordena las claves para tu orden personalizado o elimina las que no necesites
$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; ?>

este código proviene de una función interna de Woocommerce. usar el código de la primera respuesta [un filtro] sería mucho mejor.

Puedes hacer una copia en tu tema y editar la plantilla que renderiza el formulario de pago.
Adaptado de la documentación del plugin:
Ejemplo
Para sobrescribir la notificación de pedido del administrador, copia:woocommerce/templates/checkout/form-checkout.php
a
yourtheme/woocommerce/checkout/form-checkout.php
[actualización]
En este archivo, justo antes de que se impriman los campos, está este gancho de acción: do_action('woocommerce_before_checkout_billing_form', $checkout);
.
Por lo tanto, solo se trata de agregar esta acción en el functions.php
del tema o en un plugin personalizado y reordenar los campos como muestra el OP en su respuesta. No es necesario sobrescribir la plantilla, a menos que se necesiten más personalizaciones.

La plantilla que mencionaste solo te permite mover <?php do_action('woocommerce_checkout_billing'); ?>
de manera global.
