我如何从主题 functions.php 文件的函数中调用插件简码?

How can i call a plugin shortcode from within a function with theme functions.php file?

我在我的 WordPress 网站上使用了一个插件 (Popup Builder)。每当我使用插件创建一个新的弹出窗口时,它都会为该弹出窗口创建一个短代码。我想从主题 functions.php 文件中调用该简码。但我似乎无法让它正常工作。

短代码仅在满足条件时运行。在此示例中,它是访问者首次访问该站点的时间。然后我检查某个 cookie,如果该 cookie 不存在,弹出窗口将启动并强制访问者从选项列表中选择一个选项,然后 cookie 将被设置为正确的值,一旦他们选择了。

但是我似乎根本找不到触发弹出窗口的解决方案。我还收到此通知:注意:do_shortcode_tag 被错误调用。尝试在没有有效回调的情况下解析简码:

function check_for_cookies() { 

    // Check if cookie is already set
    if(isset($_COOKIE['tln_valgt_fylke'])) {

        // Do this if cookie is set 
        $string .= 'Hi, and welcome back!' ; 

        return $string;

    } else { 

        // Do this if the cookie doesn't exist

            $shortcode = do_shortcode("[sg_popup id=163]");

            return $shortcode;
        }   

    } 
    add_action('init', 'check_for_cookies');

我哪里做错了,如果这不是实现我想要的目标的好方法,那什么才是?

这只是猜测

但是,我认为这是一个时间问题。您正在使用 init 操作挂接到另一个插件简码。插件可能还没有通过 add_shortcode 注册它的简码,或者如果它已经注册了它,它可能没有 "included" 定义回调的文件(无论出于何种原因)。

事实上这似乎是因为:

do_shortcode_tag was called incorrectly. Attempting to parse a shortcode without a valid callback

这表示已调用短代码,但不存在回调。这不是你的代码的问题。但是它说插件还没有加载包含回调的文件。

在您知道所有插件都已加载和初始化之后,您可以通过挂钩到执行链中稍后发生的操作来测试它。甚至喜欢 wp_head

也许您甚至可以通过更改挂钩的优先级来逃脱:

  add_action('init', 'check_for_cookies', 20); //default is 10

这样它会在 init 结束时触发,但即便如此也可能为时过早。唯一真正知道的方法是查看插件的代码并找出它何时注册 "stuff"。一种简单的方法是将此代码添加到插件简码回调中:

try{
   throw new \Exception();
}catch(\Exception $e){
   die("<pre>{$e->getTraceAsString()}</pre>");
}

这将抛出然后捕获异常,然后输出堆栈跟踪。这可能会准确地向您显示正在设置短代码的位置。您必须(显然)触发回调才能使其工作。您也可以使用 print_r(debug_backtrace()),但 IMO 更难阅读。

PS 我最近做了很多 WP 工作,我只是在操作时间上遇到了问题……大声笑。这就是我想到它的原因,我花了最后两天重构代码。在我的例子中,我在前端和后端都替换了用户系统的 add/edit/profile 部分。这是一种子用户插件。如果你明白我的意思的话,还有很多与之相关的竞争行为......