无法让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
相关产品推荐
相关产品推荐

