如何在WooCommerce Checkout模板中对计费字段重新排序?[关闭]


15

我正在使用WooTheme的Customize checkout字段(使用action和filter)创建madlib样式的checkout表单。

结帐模板form-billing.php中的帐单字段与此呼叫一起显示:

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

如何更改字段显示的顺序?

当前(默认)字段的顺序是:
名字
姓氏
公司(隐藏对我来说)
镇/城市
邮政编码
国家
状态
电子邮件
电话

默认订单:
屏幕截图

我希望这些字段对美国人(我居住的地方)而言更加自然,因此:
名字
姓氏
公司(为我隐藏)
城镇/城市

邮政编码
国家/ 地区
电子邮件
电话

我怎样才能最好地做到这一点?

Answers:


28

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最佳做法对到达模板的数据进行过滤,因此不必覆盖任何模板文件。
拉赞,2016年

对我不起作用
Yahya Hussein

这可以正常工作,但不再起作用。我认为这是因为结帐JS动态更改了顺序。
codekipple

4
当前的操作方式是分配优先级:- $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/
codekipple

5

感谢Dbranes的回答。

更换:

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

拥有:

<?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; ?>

2
该代码来自内部的Woocommerce函数。使用第一个答案的代码[过滤器]会更好。
Adeerlike 2015年

对我来说,这是行不通的。最好的方法是使用每个字段的“优先级”,如下所示:$ fields ['billing'] ['billing_country'] ['priority'] = 10; $ fields ['billing'] ['billing_phone'] ['priority'] = 20; 也许是由于Woocommerce的新版本,但我不知道。
ruhanbidart '18

2

您可以将副本复制到主题中,然后编辑呈现结帐表单的模板。

改编自插件文档

示例
要覆盖管理订单通知,请复制:woocommerce/templates/checkout/form-checkout.php

yourtheme/woocommerce/checkout/form-checkout.php

[更新]

在此文件中,就在打印字段之前,有一个动作钩子:do_action('woocommerce_before_checkout_billing_form', $checkout);

因此,只需在主题functions.php或自定义插件中添加此操作,然后按照OP在他的Answer中显示的顺序对字段进行重新排序即可。不需要覆盖模板,如果需要进一步的自定义,则是。


您提到的模板仅允许您四处<?php do_action('woocommerce_checkout_billing'); ?>走动。
m-torin 2013年

我应该提到我没有检查实际的插件文件。由于您的回答,答案得到了更新和扩展。
brasofilo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.