如何在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
相关产品推荐
相关产品推荐

