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

基于城市运费提取城市列表及结账城市字段下拉化技术问询

解决方案:获取运费规则城市列表并改造结账城市下拉框

嘿,我懂你现在的需求——既要从运费规则里提取城市列表,又要把结账页面的城市字段改成动态下拉框(不用再硬编码城市)。下面是具体的实现步骤和优化后的代码:

1. 动态获取运费规则中的城市列表

我们可以借助WooCommerce内置的类来自动抓取所有配送区域里设置的城市,不用手动整理。写个工具函数来完成这件事:

function get_shipping_zone_cities() {
    $cities = array();
    // 获取系统中所有的配送区域
    $shipping_zones = WC_Shipping_Zones::get_zones();
    
    foreach ( $shipping_zones as $zone ) {
        // 遍历每个区域的位置规则
        foreach ( $zone['zone_locations'] as $location ) {
            // 只筛选出城市类型的规则
            if ( $location->type === 'city' ) {
                // 生成合规的键名,同时保留城市原名作为显示值
                $city_slug = sanitize_title( $location->code );
                $cities[ $city_slug ] = $location->code;
            }
        }
    }
    
    // 去重并按字母排序,让下拉选项更规整
    $cities = array_unique( $cities );
    asort( $cities );
    
    return $cities;
}

这个函数会自动同步运费规则里的城市,后续你新增或删除配送城市,下拉选项会跟着更新。

2. 完善结账城市下拉框的代码

把上面的函数整合到你现有的代码里,替换掉原来硬编码的城市列表:

/**
 * Change the checkout city field to a dropdown field.
 */
function city_to_dropdown( $fields ) {
    // 获取从运费规则里拉取的城市列表
    $shipping_cities = get_shipping_zone_cities();
    
    // 只有拿到城市数据时才修改字段
    if ( ! empty( $shipping_cities ) ) {
        $city_args = wp_parse_args( array(
            'type'     => 'select',
            'options'  => $shipping_cities,
            'required' => true, // 确保城市字段是必填项
        ), $fields['shipping']['city'] );
        
        // 替换配送地址的城市字段为下拉框
        $fields['shipping']['city'] = $city_args;
        
        // 如果需要同时修改账单地址的城市字段,取消下面的注释即可
        // $fields['billing']['city'] = $city_args;
    }
    
    return $fields;
}
add_filter( 'woocommerce_checkout_fields', 'city_to_dropdown' );

小提示:

  • 代码默认只修改配送地址的城市字段,如果要把账单地址的城市也改成下拉框,取消注释最后一行的代码就行。
  • sanitize_title()用来处理城市名称的特殊字符,避免下拉框出现异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:23:56