回答:
wp_enqueue_script()
ウィジェット出力の一部として呼び出すことができるはずです。
必要最低限の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' );
?>
ウィジェットの出力内に、つまり次の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()
からの呼び出しとは異なります。更新された回答を参照してください。
スクリプトが<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()
実際には特定のページに表示されるのではなく、ウィジェットがアクティブ化されている(つまり、[外観]> [ウィジェット]のサイドバー領域の1つにドラッグされている)かどうかを通知するだけなので、これは実際にはOPの質問に対処しません。。
is_active_widget
サイドバーが現在のページに表示されていなくても、sidebar_idを返します。これにより、すべてのページにスクリプトが追加されます。(2) wp_enqueue_script
は、スクリプトを複数回呼び出しても、スクリプトを1回だけ追加します。ウィジェットが表示されていない場合でも、すべてのページ要求で呼び出されるため、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
するように、アクションにフックして、ウィジェットが実際に表示されるタイミングを検出するか、もっと簡単に言えば、メソッドにenqueue_script()
権利をwidget()
与えることができます。