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

如何修复:根据短代码/动作钩子调用调整函数输出的逻辑错误

问题修复方案

原代码的核心问题是错误使用了did_action():did_action('hd_related_posts')仅会统计do_action('hd_related_posts')的执行次数,而短代码直接调用函数时并不会触发这个动作钩子,所以无论短代码怎么调用,这个判断都会返回false。

下面是两种可靠的修复方式:

方法一:给函数添加标识参数(推荐)

这是最直观且稳定的方案,通过给函数传递参数来明确调用来源:

  1. 修改原函数定义,增加一个默认值为false的参数:
function hd_related_posts($is_shortcode = false) {
    // 这里是你的相关文章生成逻辑,先开启输出缓冲
    ob_start();
    
    // 示例:输出相关内容
    echo '<div class="related-posts">相关文章列表...</div>';
    
    // 根据调用来源处理输出
    if ($is_shortcode) {
        // 短代码调用时返回内容
        return ob_get_clean();
    } else {
        // 动作钩子调用时直接输出
        echo ob_get_clean();
    }
}
  1. 短代码回调中调用函数时传入true:
function hd_related_posts_shortcode_callback() {
    return hd_related_posts(true);
}
add_shortcode('hd_related_posts', 'hd_related_posts_shortcode_callback');
  1. 动作钩子挂载时保持默认参数(即false):
// 挂载到文章末尾,比如the_content动作
add_action('the_content', 'hd_related_posts');

方法二:通过调用栈判断(备选)

如果不想修改函数参数,可以通过debug_backtrace()检查调用链中是否存在短代码相关函数:

function hd_related_posts() {
    ob_start();
    
    // 示例:输出相关内容
    echo '<div class="related-posts">相关文章列表...</div>';
    
    // 检查调用栈是否包含短代码执行函数
    $is_shortcode = false;
    $trace = debug_backtrace();
    foreach ($trace as $call) {
        if (isset($call['function']) && $call['function'] === 'do_shortcode') {
            $is_shortcode = true;
            break;
        }
    }
    
    if ($is_shortcode) {
        return ob_get_clean();
    } else {
        echo ob_get_clean();
    }
}

这种方法依赖WordPress内部调用逻辑,不如参数方法可靠,但无需修改调用方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 00:42:33