如何在主题为function.php的函数中调用插件简码?

时间:2018-12-22 11:29:04

标签: php wordpress function shortcode notice

我在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');

我在做什么错了,如果这不是实现我想要的好方法,那又是什么呢?

1 个答案:

答案 0 :(得分:1)

这只是一个猜测

但是,我认为这是一个时机问题。您正在使用init操作来插入另一个插件的简码。插件可能尚未通过add_shortcode注册它的短代码,或者如果它已经注册,它可能没有“包含”为它定义回调的文件(无论出于何种原因)。

实际上似乎是因为:

  

do_shortcode_tag被错误地调用。尝试在没有有效回调的情况下解析简码

这表明短代码已被调用,并且没有回调。每个您的代码这都不是问题。但是它说插件尚未加载包含回调的文件。

您可以通过知道所有插件都已加载并初始化之后,通过执行在执行链中稍后发生的动作来进行测试。就像wp_head

也许您甚至可以通过更改挂接的优先级来摆脱困境:

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

通过这种方式,它是在init的结尾处触发的,但是即使那样也可能太早了。唯一真正知道的方法是查看插件的代码,并找出何时注册它的“东西”。一种简单的方法是将此代码添加到插件的shortcode回调中:

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

这将引发然后捕获异常,然后输出stacktrace。这可能会确切显示您在何处设置了简码。您必须(显然)触发回调才能起作用。您也可以使用print_r(debug_backtrace()),但要阅读IMO则困难得多。

PS 最近我一直在做很多WP工作,而我在动作时间上有一个问题……大声笑。这就是为什么我想到了这一点,我花了最后两天的时间来重构代码。就我而言,我要替换前端和后端的用户系统的添加/编辑/配置文件部分。这是一种子用户插件。如果您知道我的意思,就会有许多与此相关的竞争行为……