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

15

Estoy creando un formulario de pago estilo madlib usando los campos de pago del Customizing de WooTheme usando acciones y filtros .

Los campos de facturación en la plantilla de pago form-billing.phpse 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 puede cambiar el orden en que aparecen los campos?

El orden de campo actual (predeterminado) es:
nombre
apellido
compañía (oculto para mí)
pueblo / ciudad
código postal
país
estado
correo electrónico
teléfono

Orden predeterminado:
captura de pantalla

Quiero que los campos estén en un orden más natural para los estadounidenses (donde vivo), así que:
nombre,
apellido,
compañía (oculto para mí)
pueblo / ciudad,
estado,
código postal,
país,
correo electrónico,
teléfono

¿Cómo puedo hacer esto mejor?

m-torin
fuente

Respuestas:

28

Lo mismo puede hacerse a través functions.phpde su 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;

}
Roy Milder
fuente
La mejor respuesta, ya que utiliza las mejores prácticas de wp / wc para filtrar los datos antes de que lleguen a la plantilla, por lo que no se debe anular ningún archivo de plantilla.
Larzan
no funcionó para mí
Yahya Hussein
Esto solía funcionar pero ya no funciona. Creo que es porque el pago JS altera dinámicamente el orden.
codekipple
44
La forma actual de hacerlo es asignar una prioridad: - $fields['billing']['billing_country']['priority'] = 10; $fields['billing']['billing_phone']['priority'] = 20; Vea aquí https://wordpress.org/support/topic/change-order-of-billing-fields-on-checkout-page/
codekipple
5

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 
// order the keys for your custom ordering or delete the ones you don't need
$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; ?>
m-torin
fuente
2
Este código es de una función interna de Woocommerce. usar el código de la primera respuesta [un filtro] sería mucho mejor.
Adeerlike
Para mi no funciona. La mejor manera es usar la "prioridad" de cada campo, algo como esto: $ fields ['billing'] ['billing_country'] ['priority'] = 10; $ campos ['facturación'] ['billing_phone'] ['prioridad'] = 20; Quizás sea por las nuevas versiones de Woocommerce, pero no lo sé.
ruhanbidart
2

Puede hacer una copia en su tema y editar la plantilla que representa el formulario de pago.

Adaptado de la documentación del complemento :

Ejemplo
Para anular la notificación de orden de administrador, copie: woocommerce/templates/checkout/form-checkout.php
a
yourtheme/woocommerce/checkout/form-checkout.php

[actualizar]

En este archivo, justo antes de que los campos están imprimiendo, hay un 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 tema functions.phpo en un complemento personalizado y reordenar los campos como lo muestra el OP en su Respuesta. No es necesario anular la plantilla, o sí, si se necesitan más personalizaciones.

brasofilo
fuente
La plantilla que mencionó solo le permite moverse <?php do_action('woocommerce_checkout_billing'); ?>al por mayor.
m-torin
Debería haber mencionado que no revisé los archivos del complemento real. Respuesta actualizada y ampliada gracias a su respuesta.
brasofilo