WordPress/WooCommerce中PHP使用IF控制函数执行问题
原有代码的错误点
- 判断条件里的
delivery是字符串值,未加引号会被PHP识别为未定义常量,导致判断逻辑完全失效 - 将函数定义包裹在if条件块中,会导致非配送订单场景下函数不存在,插件调用该函数时直接触发PHP致命错误
- 第一行变量赋值末尾多写了一个分号,属于语法冗余
- 逻辑设计不合理:不需要满足条件才定义函数,只需在函数内部增加订单类型判断,非配送订单直接终止执行即可,既不会触发函数不存在的报错,也能实现自提订单不打印冗余地址的需求
修正后可直接使用的代码
// 获取订单配送类型 $swift_order_type = get_post_meta($order->get_id(), '_zh_shipping_type') ? get_post_meta($order->get_id(), '_zh_shipping_type')[0] : ''; function star_cloudprnt_print_address(&$printer, &$selectedPrinter, &$order, &$order_meta) { // 进入函数先判断订单类型,非配送订单直接退出,不执行后续地址打印逻辑 $current_order_type = get_post_meta($order->get_id(), '_zh_shipping_type') ? get_post_meta($order->get_id(), '_zh_shipping_type')[0] : ''; if ($current_order_type !== 'delivery') { return; } // 按存在性获取地址字段值,无值则返回空字符串 $gkv = function($key) use ($order_meta) { if(array_key_exists($key, $order_meta)) return $order_meta[$key][0]; return ''; }; $fname = $gkv('_shipping_first_name'); $lname = $gkv('_shipping_last_name'); $a1 = $gkv('_shipping_address_1'); $a2 = $gkv('_shipping_address_2'); $city = $gkv('_shipping_city'); $state = $gkv('_shipping_state'); $postcode = $gkv('_shipping_postcode'); $tel = $gkv('_billing_phone'); $printer->add_new_line(1); $printer->set_text_emphasized(); if ($a1 == '') { $printer->add_text_line("Billing Address:"); $printer->cancel_text_emphasized(); $fname = $gkv('_billing_first_name'); $lname = $gkv('_billing_last_name'); $a1 = $gkv('_billing_address_1'); $a2 = $gkv('_billing_address_2'); $city = $gkv('_billing_city'); $state = $gkv('_billing_state'); $postcode = $gkv('_billing_postcode'); } else { $printer->add_text_line("Delivery Address:"); $printer->cancel_text_emphasized(); } $printer->add_text_line($fname." ".$lname); $printer->add_text_line($a1); if ($a2 != '') $printer->add_text_line($a2); if ($city != '') $printer->add_text_line($city); if ($state != '') $printer->add_text_line($state); if ($postcode != '') $printer->add_text_line($postcode); $printer->add_text_line("Tel: ".$tel); }
代码说明:修正后的写法兼容所有WooCommerce小票打印插件的钩子调用逻辑,不会出现函数未定义的致命错误;仅当订单配送类型为
delivery时才会输出地址内容,自提订单会直接跳过所有地址打印逻辑,不会输出冗余信息。
内容的提问来源于stack exchange,提问作者swiftpayments
相关产品推荐
相关产品推荐

