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

短代码调用get_the_ID()引发古腾堡JSON与PHP报错问题

问题根因

两个报错的核心诱因是短代码执行上下文不匹配,和你前台测试ID正确的结论并不冲突:

  • 前台正常访问订单页面时,短代码运行在WooCommerce订单主循环环境下,get_the_ID()确实能返回正确的订单ID,因此功能运行正常。
  • 在古腾堡编辑器内保存/预览内容模板时,WordPress会通过REST API处理内容、执行短代码做渲染校验,这个请求的主循环上下文是你正在编辑的「Toolslet内容模板」本身对应的自定义文章,此时get_the_ID()拿到的是内容模板的文章ID,并非shop_order类型的订单ID。
  • 将非订单类型的文章ID传入wc_get_order()时,函数会返回布尔值false,代码未做有效性判断就直接调用get_data()方法,会直接抛出PHP致命错误;错误输出会打断REST接口的正常JSON返回结构,最终触发古腾堡的「更新失败,响应不是有效JSON响应」提示。
  • 你之前测试ID输出正确,仅覆盖了前台正常访问的场景,没有覆盖后台REST接口保存/渲染模板的场景,才会误以为ID在所有场景下都能正确获取。
修复方案

给短代码补充两层防护逻辑:

  1. 增加返回值有效性判断,拿到非订单对象时直接返回空值,避免调用方法触发致命错误
  2. 区分执行上下文,在后台编辑器/REST请求场景下返回占位内容,不要尝试拉取真实订单数据,仅在前台正常渲染页面时执行订单数据读取逻辑

修正后的可直接使用的代码如下:

/*** Shortcode to return any aspect of a Woocommerce order ***/
/* Accepts parameters 'id' and 'token':
/* 'id' = If ID is blank current loop item ID is used otherwise it needs to be a class ID
/* 'attribute' = The Woocommerce order array item wanted.  Defaults to order ID */
function get_order_info($atts) {
    // 后台编辑/REST请求上下文直接返回占位符,避免打断编辑器保存流程
    if (is_admin() || (defined('REST_REQUEST') && REST_REQUEST)) {
        return '{订单动态字段}';
    }

    // 设置默认属性值
    $defaults = array(
        'id'        => get_the_ID(),
        'attribute' => 'id'
    );

    // 合并传入属性和默认值
    $atts = shortcode_atts($defaults, $atts);

    // 获取当前循环对应的订单对象,强制转整数避免非法参数
    $order = wc_get_order(intval($atts['id']));

    // 校验订单对象有效性,无效时直接返回空
    if (!$order instanceof WC_Order) {
        return '';
    }

    // 读取订单数据
    $order_data = $order->get_data();

    // 兼容请求字段不存在的场景,避免数组键值报错
    return isset($order_data[$atts['attribute']]) ? $order_data[$atts['attribute']] : '';
}
add_shortcode("order_info", "get_order_info");
额外优化建议
  • 如果使用的Toolslet模板套件提供了专属的当前循环数据获取接口,优先使用插件提供的方法获取当前订单ID,不要直接调用全局的get_the_ID(),可以进一步规避不同上下文下ID取值错误的问题。
  • 所有输出前台动态数据的短代码,都必须增加后台上下文拦截判断。古腾堡保存内容的过程中会自动执行短代码逻辑,一旦短代码在该场景下抛出错误,就会直接导致内容保存失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:09:18