将结帐后的结帐字段自定义到自定义下拉菜单中

时间:2017-02-18 09:27:00

标签: php wordpress woocommerce checkout custom-fields

我正在建立一个基于WooCommerce的商店。我有一个邮政编码的列表,每个都有通过运输区附加的不同运费(一些提供免费送货,一些提供统一费率)。

当客户进入结账页面时,他需要在输入字段中输入他的邮政编码。根据邮政编码,订单预览将显示不同的运费总额(免费或统一费率)。

以下是 class-wc-countries.php 中输入字段的外观:

public function get_default_address_fields() {
    $fields = array(
    'postcode' => array(
            'label'        => __( 'Postcode/ZIP', 'woocommerce' ),
            'required'     => true,
            'class'        => array( 'form-row-first', 'address-field' ),
            'clear'        => true,
            'validate'     => array( 'postcode' ),
            'autocomplete' => 'postal-code',
        ),
    );

但是,我想要做的是将此字段转换为下拉菜单,这样客户就可以选择他的邮政编码选项而不是输入它。

我设法让它下拉,但每当我选择任何选项时,它似乎都不会像输入字段那样改变运输总量。

这就是我的所作所为:

public function get_default_address_fields() {
    $fields = array(
        'postcode' => array(
            'label'        => __( 'Postcode/ZIP', 'woocommerce' ),
            'required'     => true,
            'class'        => array( 'form-row-first', 'address-field' ),
            'clear'        => true,
            'validate'     => array( 'postcode' ),
            'autocomplete' => 'postal-code',
            'type' => 'select',
            'options' => array(
                              'opt1' => "001122", "112200", "334400")
        ),
    );

但这不起作用。

我错过了什么吗?
如何使这些下拉选项更改运费总额?

由于

1 个答案:

答案 0 :(得分:0)

  

这将部分回答您的问题,并向您展示自定义结帐字段的方法。

覆盖核心文件并不是真的可以做的事情,因为每次Woocommerce要更新时都会松散,不推荐。

要以干净的方式覆盖结帐字段,首先需要使用挂在其中一个过滤器挂钩中的自定义函数:

  • woocommerce_default_address_fields (自定义结算和送货地址默认字段时)
  • woocommerce_checkout_fields (自定义结算或送货地址字段以及其他字段时)。

相关官方文档:Customizing checkout fields using actions and filters

所以在这里我选择了第一个钩子,并且我已经更正了你的邮政编码数组。你会得到的:

enter image description here

以下是经过验证的功能代码:

add_filter( 'woocommerce_default_address_fields' , 'custom_override_default_postcode_field' );
function custom_override_default_postcode_field( $address_fields ) {
    // Your postcodes array
    $postcode_array = array(
        'opt1' => "001122",
        'opt2' => "112200",
        'opt3' => "334400"
    );
    $address_fields['postcode']['type'] = 'select';
    $address_fields['postcode']['options'] = $postcode_array;

    return $address_fields;
}

代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。

  

由于选择后置代码是一个实时前端事件,您需要使用复杂的javascript / ajax脚本和一些远程php函数来实现您想要做的事情,并且这是一个真正的开发... 它还取决于您的设置并且处理起来很复杂,因为在该结帐页面中已经存在一些woocommerce ajax脚本。