我如何从主题 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 部分。这是一种子用户插件。如果你明白我的意思的话,还有很多与之相关的竞争行为......
我在我的 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 部分。这是一种子用户插件。如果你明白我的意思的话,还有很多与之相关的竞争行为......