我在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');
我在做什么错了,如果这不是实现我想要的好方法,那又是什么呢?
答案 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工作,而我在动作时间上有一个问题……大声笑。这就是为什么我想到了这一点,我花了最后两天的时间来重构代码。就我而言,我要替换前端和后端的用户系统的添加/编辑/配置文件部分。这是一种子用户插件。如果您知道我的意思,就会有许多与此相关的竞争行为……