我正在使用WordPress Plugin Boilerplate by DevinVinson.
一切正常,除了一件事:
我试图仅当页面中存在短代码时才将脚本和css排队。
在里面define_public_hooks
函数中,我向加载程序添加了一个调用,以注册脚本,而不是将其排队:
private function define_public_hooks() {
// ...
$this->loader->add_action( \'wp_register_script\', $plugin_public, \'register_styles\' );
$this->loader->add_action( \'wp_register_script\', $plugin_public, \'register_scripts\' );
// ...
}
然后在
class-my-plugin-public.php
文件I创建了两个公共函数
register_styles()
和
register_scripts()
. 在这些函数中,我只是注册脚本和样式,而不是将它们排队。这是一些基本的东西,比如:
public function register_scripts() {
wp_register_script( $this->plugin_name . \'_google_maps_api\', \'//maps.googleapis.com/maps/api/js?key=\'. $gmap_key .\'&v=3&libraries=places\', array( \'jquery\' ), \'3\', true );
}
然后我想将它们放入shortcode返回函数中,但它们根本没有注册。
我和wp_script_is( $this->plugin_name . \'_google_maps_api\', \'registered\' )
, 它回来了false
.
如果我做同样的东西enqueue
而不是register
一切正常。
知道为什么吗?
最合适的回答,由SO网友:Fayaz 整理而成
不起作用的原因:
您需要使用
wp_enqueue_scripts
行动挂钩。你用过
wp_register_script
但是,作为动作挂钩,没有名为
wp_register_script
在WordPress核心中。
如果这只是一个愚蠢的错误,那么你已经有了答案。如果您需要有关该主题的更多信息,请继续阅读:
将回调函数附加到wp_enqueue_scripts
action hook 并不意味着您的脚本和样式将被排队,它只是意味着您想在何时执行它callback function.
原始注册和排队由以下功能完成:wp_register_script()
, wp_register_style
, wp_enqueue_script()
, wp_enqueue_style()
等等,不是任何人hook.
请注意函数和挂钩的作用之间的区别:
Afunction 在调用时执行一些代码以完成预定义的任务。
示例:这些都是WordPress的核心功能:wp_register_script()
, wp_register_style
, wp_enqueue_script()
, wp_enqueue_style()
.
Ahook 仅附加callable 函数(稍后执行)在预定义的代码执行点执行。示例:这是WordPress核心(动作)挂钩:wp_enqueue_scripts
- 请注意s
(复数)结尾。
Double check: wp_enqueue_script()
是一个函数,并且wp_enqueue_scripts
是一个动作钩。
正确的代码:因此,正确的代码应该如下所示:
private function define_public_hooks() {
// ...
$this->loader->add_action( \'wp_enqueue_scripts\', $plugin_public, \'register_styles\' );
$this->loader->add_action( \'wp_enqueue_scripts\', $plugin_public, \'register_scripts\' );
// ...
}
然后,public function register_scripts() {
wp_register_script( $this->plugin_name . \'_google_maps_api\', \'//maps.googleapis.com/maps/api/js?key=\'. $gmap_key.\'&v=3&libraries=places\', array( \'jquery\' ), \'3\', true );
}
之后,您可以将脚本(样式)从快捷码处理程序函数中排队:public function your_shortcode_handler( $atts ) {
// shortcode related CODE
wp_enqueue_script( $this->plugin_name . \'_google_maps_api\' );
// more shortcode related CODE
}
使用此代码,您的脚本/样式从your_shortcode_handler
只有当特定URL中存在短代码时,才会将函数添加到您的站点。进一步阅读:
This answer 对排队脚本进行了有趣的讨论;仅当存在短代码时才显示样式。
SO网友:nibnut
所以问题是add_action
调用需要是一个WordPress操作名。。。因此,永远不会调用“wp\\u register\\u script”,而不是wp操作。
我建议您只需将注册调用添加到插件的enqueue\\u scripts函数中,无需对define\\u public\\u挂钩大惊小怪,也无需创建新的register\\u scripts函数。只需使用现有的enqueue\\u scripts功能,即可在此处添加注册:
public function enqueue_scripts() {
wp_enqueue_script( $this->plugin_name, plugin_dir_url( __FILE__ ) . \'js/plugin-name-public.js\', array( \'jquery\' ), $this->version, false );
// NOTICE this is a *registration* only:
wp_register_script( $this->plugin_name.\'_google_maps_api\', \'//maps.googleapis.com/maps/api/js?key=\'. $gmap_key.\'&v=3&libraries=places\', array( \'jquery\' ), \'3\', true );
}
然后,当您编写短代码时,应该注册脚本,准备进入队列。
希望这有帮助!