Answers:
您应该可以将其wp_enqueue_script()
作为Widget输出的一部分进行调用。
快速入门,使用准系统Widgets API类示例:
<?php
class wpse48337_Widget extends WP_Widget {
public function __construct() {
// widget actual processes
}
public function form( $instance ) {
// outputs the options form on admin
}
public function update( $new_instance, $old_instance ) {
// processes widget options to be saved
}
public function widget( $args, $instance ) {
// outputs the content of the widget
}
}
register_widget( 'wpse48337_Widget' );
?>
在Widget的输出中(即在内)添加内联wp_enqueue_script()
调用:public function widget()
<?php
public function widget( $args, $instance ) {
// outputs the content of the widget
// Enqueue a script needed for
// the Widget's output
wp_enqueue_script( 'jquery-pluginname', $path, $deps );
// Rest of widget output goes here...
}
?>
is_active_widget()
与wp_enqueue_script()
从Widget 输出中调用不同。查看最新答案。
如果脚本需要进入以下<head>
部分:
class Your_Widget extends WP_Widget{
protected static $did_script = false;
function __construct(){
// parent::__construct() ...
add_action('wp_enqueue_scripts', array($this, 'scripts'));
}
function scripts(){
if(!self::$did_script && is_active_widget(false, false, $this->id_base, true)){
wp_enqueue_script('your-script');
self::$did_script = true;
}
}
}
否则,Chip Bennett的解决方案将在页脚中对其进行排队。
该$did_script
静态变量不是必需的,我用它,只是为了避免更多不必要的调用wp_enqueue_script
,如果有页面上的多个控件实例...
is-active_widget()
只是让您知道某个小部件是否已激活(即:拖动到Appearance> Widgets中的侧边栏区域之一),而不是实际出现在任何给定页面上。
is_active_widget
将返回sidebar_id,即使该侧栏未显示在当前页面上也是如此。这将在每个页面上添加脚本。(2) wp_enqueue_script
只会添加一次脚本,即使您多次调用它也是如此。不需要self::$did_script
(3),因为__construct
即使没有显示小部件,每个页面请求都将调用它
皮埃尔
我的处理方式是使用wp_enqueue_script
和wp_dequeue_script
,并$is_active
在Your_Widget类中使用实例变量
因此wp_enqueue_script
,is_active_widget
只要页脚参数设置为true ,基于的脚本就会在所有页面上使脚本入队。请注意,出队优先运行,以确保其在脚本输出之前运行。
function enqueue_scripts() {
if ( is_active_widget( false, $this->id, $this->id_base, true ) ) {
wp_enqueue_script( 'your-script-handle', 'your-script-url', array(), '1.0', true );
add_action( 'wp_footer', array($this,'dequeue_redundant_scripts'), 1 );
}
}
然后在小部件功能中指示该小部件是否在该页面上处于活动状态
function widget( $args, $instance ) {
// outputs the content of the widget
$this->is_active = true;
}
然后,如果该窗口小部件在该页面上未处于活动状态,则在页脚中使脚本出队
function dequeue_redundant_scripts() {
if (! $this->is_active) {
wp_dequeue_script('your-script-handle');
}
}
如果未使用的话,这种先入队然后出队的方法也适用于定义需要脚本的短代码的插件
我考虑使用“ wp_footer”钩子,因为此钩子在页脚处执行,并且可能是仅在使用小部件的地方添加脚本的最佳方法。
class Your_Widget extends WP_Widget{
function widget( $args, $instance ) {
add_action('wp_footer',array($this,'front_end_scripts'));
}
function front_end_scripts(){
?><script type="text/javascript">
console.log('this works!');
/*
Or if you need external scripts then you may use
$.getScript([your-script-url] );
*/
</script> <?php
}
}
wp_enqueue_script()
请。没有直接打印JS。
dynamic_sidebar
动作,检测小部件的实际显示时间,或者更简单地,按照@ChipBennet的建议,将您的enqueue_script()
权限放到widget()
方法中。