【WordPress】WP_Widgetでwp_footerに出力する方法【add_action】

動作をよく確認して、自己責任で・・。

widget_idなどの可変部分を含めたものをフッターに出力したい場合です。

<?php
class CustomWidget extends WP_Widget {
   function __construct() { 
      parent::__construct( 'my-widget-id','My Widget Name');
   }

   function widget( $args, $instance ) {
      echo "test";
    add_action( 'wp_footer', function() use ($args,$instance){
      echo '<h1>' . $args['widget_id'] . '</h1>';
      echo '<pre>'; print_r( $instance ); echo '</pre>';
      echo '<pre>'; print_r( $args); echo '</pre>';
      echo '<hr>';
    }); 
   }

   function update( $new_instance, $old_instance ) {}
   function form($instance) {}
}

//PHP 5.3 
add_action( 'widgets_init', function(){
     register_widget( 'CustomWidget' );
});

参考:
Insert to wp_footer if widget is found in the sidebar - WordPress Development Stack Exchange

上記サンプルを動かしてみれば、動作がわかりやすいと思う。コンストラクタ(__construct)の中で、add_action( 'wp_footer',をしてもうまく行かないケースなどの場合に使えると思う。

コンストラクタは1度しか呼ばれないけど、widget( $args, $instance )は貼り付けたwidgetの数だけ呼ばれるみたいなんですね。

PHP: 無名関数 - Manual

無名関数とuse文当たりの解説は上記が分かりよいと思う

追記:2016/10/29
widget( $args, $instance )の「echo "test";」を書き換えると確かに文字が変わるのですが、add_action( 'wp_footer', 部分だけが動作してないように見えるケースがありました。ウジェット自体を貼り付けなおすとうまくいったりします。

ウジェットのID番号みたいなものを取得したい

$widget_id = $args['widget_id'];
$idno= substr(strrchr($widget_id, "-"), 1);

PHP: strrchr - Manual

widget( $args, $instance ) 関数内なら上記のような感じで、無理やり取得できる。他のもっと良い方法があるのかもしれませんが・・。


参考

actions - passing variables inside a widget add_action - WordPress Development Stack Exchange

add_action( 'wp_enqueue_scripts', function() {
  if ( is_active_widget(false, false, $widgetid) ) {
      wp_enqueue_style('fpw_styles_css');
  }
}, 5); // used priority 5 to make possible dequeue using default 10 priority
widgets - How to use wp_dequeue_style() for style enqueued in WP_Widget class - WordPress Development Stack Exchange

theme development - How to enqueue script if widget is displayed on page? - WordPress Development Stack Exchange

スポンサーリンク

コメントを残す

メールアドレスは公開されません。
また、コメント欄には、必ず日本語を含めてください(スパム対策)。