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

无法让in_array函数生效:WooCommerce自定义订单邮件开发问题

解决WooCommerce订单完成邮件中检测「Bezorgen」配送方式的问题

嘿,我看到你在定制WooCommerce订单完成邮件时,遇到了无法检测到「Bezorgen」配送方式的问题。核心原因很简单:你用$wpdb->get_results()拿到的是对象数组,而in_array()是用来检测字符串数组的,自然匹配不到目标值。下面给你两种解决方案,推荐用第二种更规范的方法:

方法一:修正现有数据库查询代码

先把数据库返回的对象数组转换成包含配送方式名称的字符串数组,再进行检测,同时记得修复SQL注入风险:

function llv_delivery_notes(){
    $order_id = get_the_id();
    global $wpdb;
    // 用prepare防止SQL注入,这很重要!
    $result = $wpdb->get_results( 
        $wpdb->prepare("SELECT * FROM llv_woocommerce_order_items WHERE order_id = %d;", $order_id)
    );

    // 把对象数组提取成配送名称的字符串数组
    $delivery_options = [];
    foreach($result as $item){
        // 这里假设配送方式名称存在item_name字段,根据你的数据库结构调整字段名
        if(isset($item->item_name)){
            $delivery_options[] = $item->item_name;
        }
    }

    // 现在就能正常检测了
    if(in_array("Bezorgen", $delivery_options)){
        // 在这里编写你的定制化邮件逻辑
        // 比如:echo "您的订单将通过Bezorgen配送";
    }
}

提示:一定要确认你的llv_woocommerce_order_items表中,配送方式的名称存在哪个字段(比如item_name或者method_title),根据实际情况修改代码里的字段名。

方法二:使用WooCommerce官方API(强烈推荐)

直接操作数据库不是WooCommerce开发的最佳实践,官方提供了现成的API来获取订单配送信息,更稳定也更安全:

function llv_delivery_notes(){
    $order_id = get_the_id();
    // 获取WooCommerce订单对象
    $order = wc_get_order($order_id);
    if(!$order) return; // 订单不存在则直接返回

    // 获取订单的所有配送方式
    $shipping_methods = $order->get_shipping_methods();
    
    foreach($shipping_methods as $method){
        // 拿到配送方式的名称
        $method_name = $method->get_name();
        if($method_name === "Bezorgen"){
            // 执行你的定制化邮件逻辑
            // 比如:添加专属配送提示内容
            break; // 找到目标配送方式后跳出循环,提升效率
        }
    }
}

这种方法的好处:

  • 不用关心数据库表结构,WooCommerce版本更新也不会影响代码运行
  • 自带安全校验,完全避免SQL注入风险
  • 符合WooCommerce官方开发规范,后续维护更省心

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:06:16