Como reordenar os campos de cobrança no modelo WooCommerce Checkout? [fechadas]

15

Estou criando um formulário de checkout no estilo madlib usando os campos de checkout do WooTheme, personalizando usando ações e filtros .

Os campos de cobrança no modelo de checkout form-billing.phpsão exibidos com esta chamada:

<?php foreach ($checkout->checkout_fields['billing'] as $key => $field) : ?>
<?php woocommerce_form_field( $key, $field, $checkout->get_value( $key ) ); ?>
<?php endforeach; ?>

Como pode alterar a ordem em que os campos são exibidos?

A ordem do campo atual (padrão) é:
nome
sobrenome
empresa (oculto para mim)
cidade
CEP do
país país e
-
mail
telefone

Ordem padrão:
captura de tela

Quero que os campos para estar em uma ordem mais natural para os americanos (onde moro), assim:
primeiro nome
sobrenome
empresa (escondido para mim)
vila / cidade
estado
CEP
país
e-mail
telefone

Como posso fazer isso da melhor maneira?

m-torin
fonte

Respostas:

28

O mesmo pode ser feito functions.phpno seu tema (filho):

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
fonte
Melhor resposta, pois usa as práticas recomendadas wp / wc com a filtragem dos dados antes que eles atinjam o modelo, para que nenhum arquivo de modelo precise ser substituído.
Larzan
não funcionou para mim
Yahya Hussein
Esse uso funciona, mas não funciona mais. Eu acho que é porque o JS do checkout altera dinamicamente o pedido.
codekipple
4
A maneira atual de fazer isso é atribuir uma prioridade: - $fields['billing']['billing_country']['priority'] = 10; $fields['billing']['billing_phone']['priority'] = 20; Veja aqui https://wordpress.org/support/topic/change-order-of-billing-fields-on-checkout-page/
codekipple
5

Obrigado a Dbranes pela resposta.

Substituir:

<?php foreach ($checkout->checkout_fields['billing'] as $key => $field) : ?>
<?php woocommerce_form_field( $key, $field, $checkout->get_value( $key ) ); ?>
<?php endforeach; ?>

Com:

<?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
fonte
2
esse código é de uma função interna de Woocommerce. usar o código da primeira resposta [um filtro] seria muito melhor.
precisa saber é o seguinte
Para mim, isso não funciona. A melhor maneira é usar a "prioridade" de cada campo, algo como isto: $ fields ['billing'] ['billing_country'] ['priority'] = 10; $ fields ['billing'] ['billing_phone'] ['priority'] = 20; Talvez seja por causa de novas versões do Woocommerce, mas eu não sei.
precisa saber é o seguinte
2

Você pode fazer uma cópia no seu tema e editar o modelo que renderiza o formulário de pagamento.

Adaptado da documentação do plugin :

Exemplo
Para substituir a notificação do pedido do administrador, copie: woocommerce/templates/checkout/form-checkout.php
para
yourtheme/woocommerce/checkout/form-checkout.php

[atualizar]

Neste arquivo, pouco antes de os campos serem impressos, há este gancho de acção: do_action('woocommerce_before_checkout_billing_form', $checkout);.

Portanto, é apenas uma questão de adicionar essa ação no tema functions.phpou em um plug-in personalizado e reordenar os campos, conforme o OP mostra em sua resposta. Não há necessidade de substituir o modelo ou sim, se forem necessárias personalizações adicionais.

brasofilo
fonte
O modelo que você mencionou apenas permite a movimentação <?php do_action('woocommerce_checkout_billing'); ?>por atacado.
M-torin
Eu deveria ter mencionado que não verifiquei os arquivos de plug-in reais. Resposta atualizada e expandida, graças à sua resposta.
Brasofilo