¿Cómo reordenar los campos de facturación en la plantilla de pago de WooCommerce?

5 ene 2013, 18:45:32
Vistas: 63.7K
Votos: 15

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:
Captura de pantalla mostrando el orden predeterminado de los campos de facturación en WooCommerce

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?

0
Todas las respuestas a la pregunta 3
4
31

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;

}
23 dic 2013 22:10:01
Comentarios

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.

Larzan Larzan
22 ago 2016 18:19:27

no funcionó para mí

Yahya Hussein Yahya Hussein
12 jul 2017 05:33:16

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

codekipple codekipple
28 jul 2017 18:43:48

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/

codekipple codekipple
28 jul 2017 18:47:01
2

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; ?>
6 ene 2013 15:38:57
Comentarios

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.

Adeerlike Adeerlike
5 nov 2015 18:59:23

Para mí no funciona. La mejor manera es usar la "prioridad" de cada campo, algo así:

$fields['billing']['billing_country']['priority'] = 10; $fields['billing']['billing_phone']['priority'] = 20;

Quizás sea por las nuevas versiones de Woocommerce, pero no lo sé.

ruhanbidart ruhanbidart
17 abr 2018 01:14:08
2

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.

5 ene 2013 23:54:22
Comentarios

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

MTT MTT
6 ene 2013 15:30:13

Debería haber mencionado que no revisé los archivos reales del plugin. Respuesta actualizada y ampliada gracias a tu respuesta.

brasofilo brasofilo
6 ene 2013 15:54:06