添加到 WordPress 首页的短代码似乎会执行多次,这可能是预期的行为。例如,在首页添加一个名为
[myshortcode]
的短代码,并在functions.php中这样定义它:
function myshortcode()
{
ob_start();
// This is what really needs to be run only once
update_my_database();
return ob_get_clean();
}
add_shortcode('myshortcode','myshortcode');
WordPress 似乎多次执行此操作。这可以预防吗?或者是否有另一种方法可以在 WP 首页上执行一次且仅一次的函数而不使用短代码?
我尝试了多种检查,包括
in_the_loop()
和 is_singular()
但似乎都不起作用。还尝试在 remove_shortcode('myshortcode');
函数中添加 myshortcode
,认为这可能会阻止后续执行,但这也不起作用:尝试按 https://stackoverflow.com/a/3695685/8552218 添加静态变量,但没有没用。
这就是所有这些方法的样子,但这仍然不起作用。有什么想法吗?
function myshortcode()
{
ob_start();
if (!is_singular()) return ob_get_clean;
if (!in_the_loop()) return ob_get_clean;
if (!is_main_query()) return ob_get_clean;
static $runonce=false;
if (!$runonce)
{
$runonce=true;
return;
}
// This is what really needs to be run only once
update_my_database();
remove_shortcode('myshortcode');
return ob_get_clean();
}
add_shortcode('myshortcode','myshortcode');
function update_my_database()
{
error_log("Executing...",1,$myemail);
}
好吧,我也遇到了同样的问题。由于某种原因,“the_content”在页面加载之前被触发,我找不到这个钩子在哪里被触发以及由什么插件触发。我写了一个小钩子,只在第二次触发我的短代码。虽然这不是一个完美的解决方案,但在大多数情况下对我来说都有效。
将其放入您的functions.php文件中:
static $sc_already_run = [];
function sc_check_already_run($sc_unique_id){
global $sc_already_run;
if(empty($sc_already_run) || !in_array($sc_unique_id,$sc_already_run)){
//NOT ALREADY RUN, Return false to stop the function
$sc_already_run[] = $sc_unique_id;
return false;
} else {
//ALREADY RUN, Return true to fire the function
unset($sc_already_run[$sc_unique_id]);
return true;
}
}
在短代码的开头插入以下内容,添加唯一的引用,您的短代码的名称即可:
if(!sc_check_already_run("MYSHORTCODENAME")){
return false;
}
这只是设置了一个我们可以获取的全局静态变量,并且每次运行短代码时,我们都会检查它是否已经运行过。
您可以通过一些配置将其设置为仅在第一次运行。
希望这有帮助。