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

WordPress:解决get_post调用同ID页面引发的无限循环问题

解决WordPress短代码加载内容的无限循环问题

你的短代码出现无限循环的核心原因是:调用apply_filters('the_content')时,WordPress会重新解析内容中的短代码,当被加载的页面(如ID=123)本身包含[load_content id="123"]时,会触发递归调用,直至执行超时。

解决方案:跟踪已加载的文章ID

我们可以在函数内部使用静态变量记录已经加载过的文章ID,每次调用时先检查当前要加载的ID是否已存在,避免重复加载触发循环,同时补充异常处理让函数更健壮:

add_shortcode( 'load_content', 'fc_load_content' );
function fc_load_content($params) {
    // 静态变量:跨函数调用保留已加载的文章ID列表
    static $loaded_posts = array();
    
    $atts = shortcode_atts(array('id' => -1), $params);
    $post_id = intval($atts['id']);
    
    // 处理无效ID
    if ($post_id <= 0) {
        return '';
    }
    
    // 检测是否已加载过该ID,防止无限递归
    if (in_array($post_id, $loaded_posts)) {
        // 可返回空或自定义提示,比如:'<p>无法加载自身内容,避免循环</p>'
        return '';
    }
    
    // 将当前ID加入已加载列表
    $loaded_posts[] = $post_id;
    
    $post = get_post($post_id);
    // 处理文章不存在的情况
    if (!$post) {
        return '';
    }
    
    $content = apply_filters('the_content', $post->post_content);
    
    // 移除当前ID(可选:如果需要在其他上下文重复加载同一ID,取消注释下面的代码)
    // $key = array_search($post_id, $loaded_posts);
    // if ($key !== false) {
    //     unset($loaded_posts[$key]);
    // }
    
    return $content;
}

关键逻辑说明

  1. 静态变量$loaded_posts:在函数的多次调用(包括递归调用)之间会保留值,用来记录已经处理过的文章ID。
  2. 循环检测:每次调用时先检查目标ID是否在已加载列表中,若是则直接返回,终止递归。
  3. 异常处理:补充了无效ID、文章不存在的判断,避免因非法参数导致的报错。
  4. 可选的ID移除:如果需要在页面的不同位置重复加载同一篇文章,可以取消注释移除ID的代码,让同一ID可以被多次加载(但仍会避免同一递归链中的循环)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 23:47:35