如何修复:根据短代码/动作钩子调用调整函数输出的逻辑错误
问题修复方案
原代码的核心问题是错误使用了did_action():did_action('hd_related_posts')仅会统计do_action('hd_related_posts')的执行次数,而短代码直接调用函数时并不会触发这个动作钩子,所以无论短代码怎么调用,这个判断都会返回false。
下面是两种可靠的修复方式:
方法一:给函数添加标识参数(推荐)
这是最直观且稳定的方案,通过给函数传递参数来明确调用来源:
- 修改原函数定义,增加一个默认值为
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(); } }
- 短代码回调中调用函数时传入
true:
function hd_related_posts_shortcode_callback() { return hd_related_posts(true); } add_shortcode('hd_related_posts', 'hd_related_posts_shortcode_callback');
- 动作钩子挂载时保持默认参数(即
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
相关产品推荐
相关产品推荐

