如何防止短代码被多次执行

问题描述 投票:0回答:1

添加到 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);
} 
wordpress wordpress-shortcode
1个回答
0
投票

好吧,我也遇到了同样的问题。由于某种原因,“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;
}

这只是设置了一个我们可以获取的全局静态变量,并且每次运行短代码时,我们都会检查它是否已经运行过。

您可以通过一些配置将其设置为仅在第一次运行。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.