Как изменить порядок полей оплаты в шаблоне оформления заказа WooCommerce?
Я создаю форму оформления заказа в стиле madlib, используя руководство WooThemes по настройке полей оформления заказа с помощью действий и фильтров.
Поля оплаты в шаблоне оформления заказа form-billing.php
отображаются с помощью следующего кода:
<?php foreach ($checkout->checkout_fields['billing'] as $key => $field) : ?>
<?php woocommerce_form_field( $key, $field, $checkout->get_value( $key ) ); ?>
<?php endforeach; ?>
Как можно изменить порядок отображения полей?
Текущий (стандартный) порядок полей:
имя
фамилия
компания (скрыто для меня)
город
почтовый индекс
страна
штат
email
телефон
Стандартный порядок:
Я хочу расположить поля в более привычном для американцев (где я живу) порядке:
имя
фамилия
компания (скрыто для меня)
город
штат
почтовый индекс
страна
email
телефон
Как лучше всего это сделать?
То же самое можно сделать через файл functions.php
в вашей (дочерней) теме:
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;
}

Лучший ответ, так как использует лучшие практики WP/WC с фильтрацией данных до их попадания в шаблон, поэтому не требуется переопределять файлы шаблонов.

Раньше это работало, но теперь нет. Думаю, это потому что JS оформления заказа динамически изменяет порядок.

Текущий способ сделать это — назначить приоритет:-
$fields['billing']['billing_country']['priority'] = 10;
$fields['billing']['billing_phone']['priority'] = 20;
Смотрите здесь https://wordpress.org/support/topic/change-order-of-billing-fields-on-checkout-page/

Спасибо Dbranes за ответ.
Замените:
<?php foreach ($checkout->checkout_fields['billing'] as $key => $field) : ?>
<?php woocommerce_form_field( $key, $field, $checkout->get_value( $key ) ); ?>
<?php endforeach; ?>
На:
<?php
// упорядочите ключи для вашего собственного порядка или удалите ненужные
$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; ?>

этот код взят из внутренней функции WooCommerce. использование кода из первого ответа [фильтр] было бы гораздо лучше.

У меня это не работает. Лучший способ - использовать "приоритет" каждого поля, примерно так:
$fields['billing']['billing_country']['priority'] = 10; $fields['billing']['billing_phone']['priority'] = 20;
Возможно, это связано с новыми версиями WooCommerce, но я не уверен.

Вы можете сделать копию в свою тему и отредактировать шаблон, который отображает форму оформления заказа.
Адаптировано из документации плагина:
Пример
Чтобы переопределить уведомление о заказе в админке, скопируйте:woocommerce/templates/checkout/form-checkout.php
в
yourtheme/woocommerce/checkout/form-checkout.php
[обновление]
В этом файле, непосредственно перед выводом полей, есть хук действия: do_action('woocommerce_before_checkout_billing_form', $checkout);
.
Таким образом, достаточно добавить это действие в functions.php
темы или в пользовательский плагин и изменить порядок полей, как показано в ответе автора. Нет необходимости переопределять шаблон, если только не требуются дополнительные настройки.
