Как изменить порядок вывода полей в оформлении заказа в WooCommerce?
WooCommerce является популярным и бесплатным e-commerce решением для CMS WordPress. Я сам лично очень часто работаю с этим дополнением и решаю различные нестандартные задачи, одна из которых – это переопределение порядка вывода полей в оформлении заказа.
Не знаю, как там обстоят дела с плагинами, которые позволяют решать подобные задачи, но благодаря небольшой функции можно легко изменить порядок полей на нужный вам.
Изменение порядка вывода полей в оформлении заказа в WooCommerce версии ниже 3.0.4
Поскольку за длительный период существования дополнения оно несколько раз меняло свою спецификацию, есть два варианта того, как можно изменить порядок полей в оформлении заказа.
И первый – это вариант для более ранних версий.
Для того чтобы поменять порядок полей относящихся к оплате, в файл functions.php вашей темы (в самый низ) вставьте:
function sort_fields_billing($fields) {
$order_fields = array(
"billing_first_name",
"billing_city",
"billing_address_1",
"billing_postcode",
"billing_address_2",
"billing_company",
"billing_email",
"billing_last_name",
"billing_phone",
"billing_state",
"billing_country",
);
foreach($order_fields as $field) {
$ordered_fields[$field] = $fields["billing"][$field];
}
$fields["billing"] = $ordered_fields;
return $fields;
}
add_filter("woocommerce_checkout_fields", "sort_fields_billing");
Для смены порядка полей доставки воспользуемся аналогичной функцией:
function sort_fields_shipping($fields) {
$order_fields = array(
"shipping_city",
"shipping_postcode",
"shipping_country",
"shipping_last_name",
"shipping_first_name",
"shipping_address_1",
"shipping_state",
"shipping_company",
"shipping_address_2",
);
foreach($order_fields as $field) {
$ordered_fields[$field] = $fields["shipping"][$field];
}
$fields["shipping"] = $ordered_fields;
return $fields;
}
add_filter("woocommerce_checkout_fields", "sort_fields_shipping");
Ее вы так же вставляете в низ файла functions.php, который находится в папке вашей темы.
На что тут стоит обратить внимание? В обоих случаях переменная $order_fields содержит в себе набор полей, относящихся к одному из областей оформления заказа. То, в какой последовательности эти поля будут выведены на сайте, напрямую зависит от порядка их перечисления в указанной переменной.
Но не забывайте, что этот вариант работает лишь в старых версиях WooCommerce.
Изменение порядка вывода полей в оформлении заказа в WooCommerce версии выше 3.0.4
Итак, второй вариант, который стабильно работает в последних (на момент написания статьи) версиях WooCommerce.
Здесь мы будем также использовать две функции для двух областей оформления заказа.
Первая (для блока оплаты) – это:
function sort_fields_billing($fields) {
$fields["billing"]["billing_first_name"]["priority"] = 1;
$fields["billing"]["billing_last_name"]["priority"] = 5;
$fields["billing"]["billing_company"]["priority"] = 6;
$fields["billing"]["billing_address_1"]["priority"] = 2;
$fields["billing"]["billing_address_2"]["priority"] = 8;
$fields["billing"]["billing_city"]["priority"] = 7;
$fields["billing"]["billing_postcode"]["priority"] = 9;
$fields["billing"]["billing_country"]["priority"] = 3;
$fields["billing"]["billing_state"]["priority"] = 11;
$fields["billing"]["billing_email"]["priority"] = 4;
$fields["billing"]["billing_phone"]["priority"] = 10;
return $fields;
}
add_filter("woocommerce_checkout_fields", "sort_fields_billing");
и вторая (для блока доставки):
function sort_fields_shipping($fields) {
$fields["shipping"]["shipping_first_name"]["priority"] = 9;
$fields["shipping"]["shipping_last_name"]["priority"] = 4;
$fields["shipping"]["shipping_company"]["priority"] = 8;
$fields["shipping"]["shipping_address_1"]["priority"] = 7;
$fields["shipping"]["shipping_address_2"]["priority"] = 6;
$fields["shipping"]["shipping_city"]["priority"] = 2;
$fields["shipping"]["shipping_postcode"]["priority"] = 3;
$fields["shipping"]["shipping_country"]["priority"] = 5;
$fields["shipping"]["shipping_state"]["priority"] = 1;
return $fields;
}
add_filter("woocommerce_checkout_fields", "sort_fields_shipping");
Как вы могли заметить из примера, здесь последовательность перечисления полей не играет никакой роли, и важное здесь – это числовое значение «priority».
Поля в каждой приведенной функции будут выводиться последовательно согласно проставленным приоритетам от меньшего числа к большему.
Но стоит отметить, что порядок приоритетов вы задаете сами, и он не обязательно должен начинаться с единицы с шагом 1, а может быть, например, 10, 20, 30, или 2, 20, 200 и так далее.