调用bool类型的get_method_id()方法报错,求WooCommerce代码排查方案
解决WooCommerce中
Call to a member function get_method_id() on bool错误 错误原因
错误根源在以下代码段:
$shipping_items = $order->get_items( 'shipping' ); $shipping_item = reset( $shipping_items ); $shipping_method_id = $shipping_item->get_method_id() . ':';
当订单没有配送项(比如虚拟商品订单、免配送订单)时,$shipping_items是空数组,reset()会返回false,此时调用get_method_id()就会触发"在bool值上调用成员方法"的错误。
修复步骤
先校验配送项是否有效,再执行后续逻辑:
修改代码,在获取shipping_method_id前添加多层校验,避免空值或非对象调用:$shipping_items = $order->get_items( 'shipping' ); $shipping_method_id = ''; // 检查是否有配送项,且配送项是有效对象 if ( ! empty( $shipping_items ) && is_object( $shipping_item = reset( $shipping_items ) ) ) { $shipping_method_id = $shipping_item->get_method_id() . ':'; $shipping_method_id .= $shipping_item->get_instance_id(); }处理无配送项的场景
可以根据需求添加无配送项时的提示,比如:} else { echo '<p>Jūsų užsakymas neturi pristatymo metodo.</p>'; }
关于是否需要添加其他配送方式的else分支
如果你的店铺存在local_pickup:27之外的其他配送方式(比如DPD、标准快递等),且需要为这些方式展示专属提示,就必须添加else分支。示例如下:
if ( $shipping_method_id == 'local_pickup:27' ) { echo '<p>Sveiki, Jūsų užsakymas nr. ' . $order_id . ' yra suruoštas. Kviečiame atsiimti adresu: Rudens g. 29, Neveronys. www.sodoroze.lt</p>'; } elseif ( $shipping_method_id == 'dpd:12' ) { // 替换为实际配送方式ID echo '<p>Jūsų užsakymas perduotas DPD kurjeriui, laukite pristatymo pranešimo.</p>'; } elseif ( ! empty( $order_notes ) ) { foreach ( $order_notes as $order_note ) { if ( strpos( $order_note->content, 'DPD siuntos numeris' ) !== false ) { echo '<p>Jūsų užsakymas nr. ' . $order_id . ' perduotas kurjeriui. ' . $order_note->content . '</p>'; } } } else { // 默认提示,覆盖所有未匹配的场景 echo '<p>Jūsų užsakymas yra apdorotas, laukite pristatymo informacijos.</p>'; }
即便没有特殊配送方式需要处理,也建议保留一个else分支,避免用户在既不是自提、又没有DPD单号备注的情况下看不到任何相关提示。
内容的提问来源于stack exchange,提问作者lituoklis13
相关产品推荐
相关产品推荐

