You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WooCommerce配送区域表单中添加自定义字段?

在WooCommerce配送区域添加自定义选择字段的完整方案

我看你已经找对了核心方向,用woocommerce_get_settings_shipping过滤器来添加字段是正确的思路,不过还需要补充字段值的保存逻辑,下面是完整的实现代码和细节说明:

完整代码实现

class WC_Custom_Shipping_Zone_Field {
    public function __construct() {
        // 等WooCommerce完全加载后再绑定钩子
        add_action( 'plugins_loaded', array( $this, 'plugins_loaded_action' ) );
        // 绑定配送区域设置保存的动作,用来存储自定义字段值
        add_action( 'woocommerce_shipping_zone_options_save', array( $this, 'save_shipping_zone_custom_field' ), 10, 2 );
    }

    public function plugins_loaded_action() {
        // 注册过滤器,给配送区域设置页面添加自定义字段
        add_filter( 'woocommerce_get_settings_shipping', array( $this, 'shipping_zone_settings_add_city_field' ), 10, 2 );
    }

    public function shipping_zone_settings_add_city_field( $settings, $current_section ) {
        // 只在配送区域的设置页面显示这个字段,避免干扰其他配送设置项
        if ( 'shipping_zones' !== $current_section ) {
            return $settings;
        }

        // 定义自定义选择字段的参数
        $custom_city_field = array(
            'title'       => __( '目标城市', 'your-text-domain' ),
            'id'          => 'wc_shipping_zone_target_city',
            'type'        => 'select',
            'options'     => array(
                ''          => __( '请选择城市', 'your-text-domain' ),
                'beijing'   => __( '北京', 'your-text-domain' ),
                'shanghai'  => __( '上海', 'your-text-domain' ),
                'guangzhou' => __( '广州', 'your-text-domain' ),
            ),
            'desc_tip'    => true,
            'description' => __( '为当前配送区域指定对应的目标城市', 'your-text-domain' ),
        );

        // 把字段插入到设置列表的合适位置(这里插在默认的"区域名称"字段之后)
        array_splice( $settings, 2, 0, array( $custom_city_field ) );

        return $settings;
    }

    public function save_shipping_zone_custom_field( $zone_id, $zone ) {
        // 检查用户权限,确保只有管理员能修改
        if ( ! current_user_can( 'manage_woocommerce' ) ) {
            return;
        }

        // 获取提交的字段值并安全存储
        if ( isset( $_POST['wc_shipping_zone_target_city'] ) ) {
            $sanitized_value = sanitize_text_field( $_POST['wc_shipping_zone_target_city'] );
            update_post_meta( $zone_id, 'wc_shipping_zone_target_city', $sanitized_value );
        }
    }
}

// 初始化这个自定义字段类
new WC_Custom_Shipping_Zone_Field();

关键细节说明

  • 字段显示控制:通过判断$current_section是否为shipping_zones,确保自定义字段只出现在配送区域的编辑/新建页面,不会乱跑到其他配送设置项里。
  • 字段位置调整:用array_splice把字段插入到设置数组的第3位(索引2),刚好在默认的“区域名称”字段之后,布局更符合日常使用习惯。
  • 安全保存逻辑:专门添加了woocommerce_shipping_zone_options_save动作来处理字段值的保存,同时做了权限检查和数据清理(sanitize_text_field),避免出现安全漏洞。
  • 可扩展性:你可以根据需求修改options里的城市选项,或者把字段类型换成text、checkbox等,只需要调整type参数即可。

获取已保存的字段值

如果需要在其他业务场景中调用这个配送区域的自定义字段值,可以用以下代码:

// 替换为你要获取的配送区域ID
$target_zone_id = 3;
$selected_city = get_post_meta( $target_zone_id, 'wc_shipping_zone_target_city', true );

// 示例:输出选中的城市名称
if ( $selected_city ) {
    echo __( '该区域目标城市:', 'your-text-domain' ) . ucfirst( $selected_city );
}

使用方法

把上述代码添加到你的主题functions.php文件中,或者创建一个自定义插件来存放这段代码。记得把代码中的your-text-domain替换成你的主题或插件的文本域,方便后续做多语言翻译。

内容的提问来源于stack exchange,提问作者rmbits

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:35:13