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

WooCommerce订单完成短信发送异常:访客买家无法接收短信

问题排查与解决方案

嘿,这问题很好搞定!咱们先拆解一下为什么访客收不到短信:

核心原因

  • 访客没有关联的WordPress用户账号:当访客下单时,$order->get_customer_id()会返回0或者false,你的代码里的if($user_id)条件直接跳过了后续获取手机号的逻辑。
  • 手机号存储位置不同:会员的手机号存在用户元数据表中,但访客的手机号是直接存在订单关联的元数据里的,所以用get_user_meta根本拿不到访客的手机号。

修复方案

方案1:统一获取手机号(推荐)

WooCommerce的订单对象自带了get_billing_phone()方法,不管是会员还是访客,只要下单时填写了手机号,这个方法都能正确获取到。直接替换原来的逻辑即可:

add_action('woocommerce_order_status_completed', 'my_order_status_completed_sms', 10, 1); 
function my_order_status_completed_sms($order_id){ 
    $order = wc_get_order($order_id); 
    // 直接从订单获取账单手机号,兼容所有订单类型
    $phone_number = $order->get_billing_phone(); 
    
    if(!empty($phone_number)){ 
        cosmosfarm_members_sms_send($phone_number, '#'.$order_id.' is complete. thank you!'); 
    } 
}

方案2:兼容原有逻辑(保留会员用户元数据优先)

如果担心会员用户的手机号在用户中心有更新,而订单里的手机号是旧的,可以保留先从用户元数据获取的逻辑,再 fallback 到订单手机号:

add_action('woocommerce_order_status_completed', 'my_order_status_completed_sms', 10, 1); 
function my_order_status_completed_sms($order_id){ 
    $order = wc_get_order($order_id); 
    $user_id = $order->get_customer_id(); 
    $phone_number = '';
    
    // 先尝试从会员用户的元数据获取手机号
    if($user_id){ 
        $phone_number = get_user_meta($user_id, 'billing_phone', true); 
    } 
    
    // 如果会员手机号为空,或者是访客,直接从订单获取
    if(empty($phone_number)){
        $phone_number = $order->get_billing_phone();
    }
    
    if(!empty($phone_number)){ 
        cosmosfarm_members_sms_send($phone_number, '#'.$order_id.' is complete. thank you!'); 
    } 
}

验证建议

测试的时候可以分别用会员账号下单和访客身份下单,确认两种情况都能收到短信。另外要确保访客下单时确实填写了手机号字段,毕竟如果没填的话,不管哪种逻辑都拿不到手机号~

内容的提问来源于stack exchange,提问作者Stanley J. Otis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:37:44