You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WooCommerce下单前手机号格式转换(默认加巴基斯坦区号)技术求助

实现WooCommerce手机号自动格式化为巴基斯坦国家码格式(92xxxxxxxxx)

我帮你完善了这段用于WooCommerce结账流程的手机号格式化代码,确保能自动把用户提交的手机号转换成923131234567这种标准格式——如果用户没加国家码,默认补上巴基斯坦的92前缀。

完整代码(添加到主题functions.php或自定义代码插件)

// 自动格式化结账手机号为92开头的标准格式
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');
function my_custom_checkout_field_process() {
    // 获取用户提交的结账手机号
    $phone = isset($_POST['billing_phone']) ? sanitize_text_field($_POST['billing_phone']) : '';
    
    if (!empty($phone)) {
        // 清除所有非数字字符,只保留纯数字
        $clean_phone = preg_replace('/\D/', '', $phone);
        
        // 根据不同输入场景格式化号码
        if (strpos($clean_phone, '92') === 0) {
            // 已包含巴基斯坦国家码,直接使用
            $formatted_phone = $clean_phone;
        } elseif (strpos($clean_phone, '0') === 0 && strlen($clean_phone) === 11) {
            // 巴基斯坦本地手机号(03xx开头的11位),替换开头的0为92
            $formatted_phone = '92' . substr($clean_phone, 1);
        } else {
            // 其他情况,直接添加92前缀
            $formatted_phone = '92' . $clean_phone;
        }
        
        // 更新会话和POST数据,确保后续流程使用格式化后的号码
        WC()->session->set('billing_phone', $formatted_phone);
        $_POST['billing_phone'] = $formatted_phone;
    }
}

// 确保订单保存的是格式化后的手机号
add_filter('woocommerce_checkout_posted_data', 'my_custom_format_checkout_phone');
function my_custom_format_checkout_phone($posted_data) {
    if (isset($posted_data['billing_phone']) && !empty($posted_data['billing_phone'])) {
        $clean_phone = preg_replace('/\D/', '', $posted_data['billing_phone']);
        
        if (strpos($clean_phone, '92') !== 0) {
            if (strpos($clean_phone, '0') === 0 && strlen($clean_phone) === 11) {
                $posted_data['billing_phone'] = '92' . substr($clean_phone, 1);
            } else {
                $posted_data['billing_phone'] = '92' . $clean_phone;
            }
        }
    }
    return $posted_data;
}

代码说明

  • 清理输入:先把手机号里的空格、加号、括号等非数字字符全部去掉,避免格式干扰
  • 场景适配
    • 如果用户已经输入92开头的号码,直接保留
    • 针对巴基斯坦本地常见的03131234567这种11位号码,自动把开头的0替换成92
    • 其他无国家码的输入(比如3131234567),直接添加92前缀
  • 双重保障:既在结账处理流程中修改手机号,又通过过滤器确保最终保存到订单数据库里的是格式化后的号码

使用注意事项

  • 推荐用Code Snippets这类自定义代码插件添加代码,比直接改主题functions.php更安全,不会因为主题更新丢失代码
  • 测试各种输入情况:比如+9231312345670313-12345673131234567都应该被转换成923131234567

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

火山引擎 最新活动