如何从带有theme functions.php文件的函数中调用插件短代码?

如何从带有theme functions.php文件的函数中调用插件短代码?,php,wordpress,function,shortcode,notice,Php,Wordpress,Function,Shortcode,Notice,我在我的WordPress网站上使用了一个插件(弹出窗口生成器)。每当我用插件创建一个新的弹出窗口时,它都会为该弹出窗口创建一个短代码。我想在theme functions.php文件中调用该短代码。但我似乎无法让它正常工作 只有满足条件时,才会运行短代码。在这个例子中,当访问者第一次访问该站点时。然后我检查某个cookie,如果该cookie不存在,弹出窗口将启动,并强制访问者从选项列表中选择一个选项,然后cookie将被设置为正确的值,一旦他们这样做 然而,我似乎找不到一个解决方案,激发弹出

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

只有满足条件时,才会运行短代码。在这个例子中,当访问者第一次访问该站点时。然后我检查某个cookie,如果该cookie不存在,弹出窗口将启动,并强制访问者从选项列表中选择一个选项,然后cookie将被设置为正确的值,一旦他们这样做

然而,我似乎找不到一个解决方案,激发弹出在所有。我还收到这样的通知:注意:do_shortcode_标记的调用不正确。试图在没有有效回调的情况下分析短代码:

try{
   throw new \Exception();
}catch(\Exception $e){
   die("<pre>{$e->getTraceAsString()}</pre>");
}
我做错了什么,如果这不是实现我想要的东西的好方法,那又是什么呢?

这只是一个猜测

但是,我认为这是一个时间问题。您正在使用
init
操作钩住另一个插件短代码。插件可能还没有通过
add\u shortcode
注册它的短代码,或者如果它已经注册了短代码,它可能没有“包含”定义回调的文件(无论出于什么原因)

事实上,这似乎是因为:

do_shortcode_标记调用不正确。试图在没有有效回调的情况下分析短代码

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

在您知道所有插件都已加载并初始化之后,您可以通过挂接执行链中稍后发生的操作来测试这一点。甚至像
wp\u头

也许你甚至可以改变钩子的优先级:

  add_action('init', 'check_for_cookies', 20); //default is 10
这样,它会在
init
的末尾触发,但即使这样,也可能太早了。唯一真正知道的方法是查看插件的代码,并找出它何时注册它的“东西”。一种简单的方法是将此代码添加到插件短代码回调:

try{
   throw new \Exception();
}catch(\Exception $e){
   die("<pre>{$e->getTraceAsString()}</pre>");
}
试试看{
抛出新的\异常();
}捕获(\异常$e){
骰子(“{$e->getraceAssString()}”);
}
这将抛出然后捕获异常,然后输出stacktrace。这可能会准确地显示设置短代码的位置。您必须触发回调(显然)才能使其工作。您也可以使用
print\r(debug\u backtrace())
,但它更难阅读


PS我最近做了很多WP工作,只是在行动时间上有点问题。。。哈哈,这就是我想到它的原因,我花了2天时间重构代码。在我的例子中,我需要更换前端和后端用户系统的添加/编辑/配置文件部分。它是一种子用户插件。如果你知道我的意思的话,有很多与之相关的竞争行为…

首先,发布的代码在某个地方缺少一个结尾
}
。此外,不建议在if语句中创建函数。如果If语句运行多次并多次在
else
-块中结束,则函数将已经定义,您将得到一个错误。另外,我看不到你在任何地方调用
cookie\u greeting()
?你真的不应该对问题进行大量修改,因为这可能会在查看其他海报评论和/或不再相关的答案时造成混乱。发布问题时,请确保从一开始就发布实际代码。否则,在您更新代码后,人们将浪费时间编写可能不相关的答案。我想你应该感谢@ArtisticPhoenix他详尽的回答(在你的更新之后,这个答案变得无关紧要,但在之前就出现了)@MagnusEriksson另一个函数本不应该存在,代码中也不存在,我想我只是在复制粘贴到这里时搞砸了。现在就更新代码。一切都很好,但更新后的代码不会跳出任何内容(只要是错误的)。您仍然存在
=
读取访问(未定义变量)问题,但这只是一个通知或警告。我能想到的唯一一件事可能是
init
,那就是提前挂接插件(可能还没有那么远),但这只是一个猜测,我必须查一下。谢谢!这确实是一个时间问题。现在它工作得很好。我还纠正了变量问题,所以现在一切正常,没有任何通知。当然,很高兴我能提供帮助。之所以出现
=
通知,是因为与increment一样,PHP在添加到原始值之前必须先读取原始值。当变量未定义时,它无法执行该操作。@重新启动-在那里我添加了一些“提示”