调用do_action无输出?WordPress插件开发调试求助
首先,问题核心是do_action本身只是触发钩子,没有函数绑定到钩子上的话,调用了也不会有任何反应,结合你的情况,给你几个排查和解决的方向:
1. 先确认钩子上有没有绑定函数
不管是wp_ajax_lorem_ipsum还是其他钩子,必须先通过add_action把函数挂上去,do_action才会执行对应的逻辑。比如你可以先写个测试绑定:
// 先给钩子绑定一个测试函数 add_action('wp_ajax_lorem_ipsum', function() { echo '这是wp_ajax_lorem_ipsum钩子的输出'; // 注意wp_ajax钩子需要die()结束请求,否则会返回默认的0 die(); }); // 然后再调用do_action $actions_to_do = ['wp_ajax_lorem_ipsum']; foreach ($actions_to_do as $action) { ob_start(); do_action($action); $output = ob_get_clean(); // 用ob_get_clean更简洁,替代get_contents+end_clean的组合 echo $output; }
2. 注意wp_ajax_*钩子的特殊限制
这类钩子是WordPress专门给AJAX请求设计的,默认只有在访问wp-admin/admin-ajax.php这个路径时,WordPress才会自动触发相关的AJAX钩子逻辑(比如插件或主题里注册的AJAX处理函数)。如果你的脚本是直接在普通页面、自定义PHP文件里运行,没有走AJAX流程,那很多插件的wp_ajax_*钩子根本没被挂载,调用自然没反应。
如果要在非AJAX场景测试,要么自己手动绑定函数到钩子,要么确保脚本运行在WordPress完整环境中(比如放在主题的functions.php里,或者插件文件中)。
3. 检查脚本是否在WordPress环境内运行
如果你的PHP脚本是单独运行的(没有通过WordPress加载),那WordPress的钩子系统、核心函数都没初始化,add_action和do_action根本无法正常工作。这种情况必须先加载WordPress的核心文件,在脚本开头加上:
// 路径根据你的WordPress安装位置调整,比如根目录的wp-load.php require_once('/path/to/your/wordpress/wp-load.php');
4. 用has_action排查钩子状态
不确定钩子有没有被绑定?可以先打印has_action($action)的结果确认:
$action = 'wp_ajax_lorem_ipsum'; echo has_action($action); // 返回绑定的函数数量,0就是没有任何函数挂在这个钩子上
如果返回0,说明这个钩子上没有任何逻辑,调用do_action肯定不会有输出。
总结来说,你现在的问题大概率是钩子上没绑定函数,或者脚本不在WordPress完整环境中运行,先从这两点入手排查。
内容的提问来源于stack exchange,提问作者JoMar

