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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:54:26