サポート » 使い方全般 » 現在のページに特定のウィジェットが表示されているか判定

  • 解決済 redcocker

    (@redcocker)


    こんにちは

    プラグイン内で、現在のページに特定のウィジェットが表示されているか判定する方法を探しています。

    ウィジェットは、登録するエリアによって表示されるページが変わって来ますので、現在のページで特定の特定のウィジェットが表示されているか判断したいと考えています。

    出来ましたら、WordPress2.8から通用する方法が好ましいです。

    今のところウィジェットがサイドバーエリアに登録されているか否かを判定する方法までは分かっていますので、加えて、サイドバーエリアの表示対象(投稿、固定ページ、アーカイブetc.)を判別する方法があれば、

    global $wp_registered_sidebars;
    $sidebars_widgets = wp_get_sidebars_widgets();
    foreach ($wp_registered_sidebars as $name => $value) {
    	foreach ($sidebars_widgets[$name] as $id => $widget ) {
    		if (preg_match('/widgetname/i', $widget)) {
    			$show_widget = 1;
    		}
    	}
    }

    を改造することも可能かと思います。

    宜しくお願いいたします。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • こんにちは、
    使っていないので、どうなのか心配ですが、
    Since: 2.2.0
    http://codex.wordpress.org/Function_Reference/is_active_widget#Examples

    <?php
    if ( is_active_widget(false, false, $this->id_base, true) ) {
    	wp_enqueue_script('jquery');
    }
    ?>

    とか、どうでしょうか?

    トピック投稿者 redcocker

    (@redcocker)

    nobitaさん、有難うございます。

    if (is_active_widget(false, false, 'ID_BASE')) {
    	$show_widget = 1;
    }

    を試してみましたが、ウィジェットが有効なサイドバーエリアに登録されてさえいれば、現在のページに表示されていなくともtrueを返すようです。

    特定のウィジェットがサイドバーエリアに登録されているか否かを判定だけなら、ループしなくともis_active_widget()で簡単に判別出来る事が分かった点は収穫でした。

    トピック投稿者 redcocker

    (@redcocker)

    内容がWordPressからかけ離れていましますが、例えば、ウィジェットを登録する際の処理でトリガーとなる変数を仕込むことは出来ないでしょうか?

    私の理解では、こういった変数は、クラス外から参照出来るようにする手段はない思っているのですが、念のため。

    ウィジェットを登録する際の処理で、widget()メソッドに何か変数を仕込むようなイメージです。

    class MyWidget extends WP_Widget {
    
    	function MyWidget() {
    		//処理
    	}
    
    	function widget($args, $instance) {
    		//処理
    		$show_widget = 1;
    	}
    
    	function update($new_instance, $old_instance) {
    		//処理
    	}
    
    	function form($instance) {
    		//処理
    	}
    }
    
    add_action('widgets_init', create_function('', 'return register_widget("MyWidget");'));
    モデレーター jim912

    (@jim912)

    redcockerさん、こんにちは。

    条件分岐タグを利用するのがよいのではと思いますが、いかがでしょう?ただし、ほとんどの条件分岐タグが利用できるのは、parse_query以降になります。

    また、クラス外から参照するなら、クラスのプロパティとして参照するか、global宣言をして変数をグローバル変数として利用するかですが、上記のコードのようにwidgetメソッドで設定するとなると、ウィジェットの表示が行われた後でのみ利用可能となるため、使いづらいことになるかもしれません。

    こんにちは

    プラグイン内で、現在のページに特定のウィジェットが表示されているか判定する方法を探しています。

    ウィジェットは、「指定位置に何らかの情報を表示するための機能」といったくらいにしか考えたことがないので、質問の真意をはずしているのかもしれませんが、

    ウィジェットが表示されるされないという事柄は、大体以下の二つの場合かなと思っています。

    1、提供すべき情報がない場合

    2、表示コントロールを行っている場合など、何らかの拡張機能を使っている場合

    http://yuina.lovesickly.com/wordpress-tips/plugins-wordpress/plugin-widgets/3528

    1 の場合なら、データの保存場所を調べて、存在しない場合は、代替情報を提供するような関数などを書けばいいと思います。または、表示されるデータのない場合の出力htmlを正規表現でフィルタするというのもあると思います。

    2 独自のコンディションで表示非表示をコントロールしているのであれば、それらとコラボする関数を書くということになと考えます。したがって表示をコントロールする仕組みによって、ケースバイケースになると思います。

    トピック投稿者 redcocker

    (@redcocker)

    jim912さん

    有難うございます。

    コードのようにwidgetメソッドで設定するとなると、ウィジェットの表示が行われた後でのみ利用可能となるため、使いづらいことになるかもしれません。

    ウィジェットが表示されていれば、wp_footerフックを使ってJavaスクリプトを書き出すといったものなので、タイミング的には行けそうな気がします。これは試してみます。

    nobitaさん

    有難うございます。

    2、表示コントロールを行っている場合など、何らかの拡張機能を使っている場合

    ウィジェットの表示を特に制御しているわけではありませんが、逆に制御するのも1つの方法ですね。

    トピック投稿者 redcocker

    (@redcocker)

    widgetメソッドに変数を仕込む方法を試しましたが上手く行きませんでした。

    プラグイン側でウィジェットの表示されるページの制御を行うのではなく、ユーザーが登録したサイドバーエリアによって表示されるページが決まると言った仕様です。

    できれば、条件分岐タグなどを使ったプラグイン側での表示の制御は、行いたくはありません。これが手っ取り早いですが・・・。

    ザクッと書けば、下記のような構造で、

    // ウィジェットの読み込み
    include_once('my_widget.php');
    
    add_action('wp_footer', 'my_function');
    
    function my_function(){
    //条件分岐
    	//条件により、Javaスクリプトの書き出し
    }

    my_function内で、現在のページにウィジェットが表示されているか判定したいと考えておりますが、段々と出来ない気がして来ました。

    jim912さん

    クラスをきちんと理解していないので、間違っているかもしれませんが、やはりメソッド内の変数の参照は不可能ではないでしょうか?

    プロパティは、簡単に参照できましたが・・・。

    モデレーター jim912

    (@jim912)

    redcockerさん

    質問の内容が具体性に欠け、なおかつ小出しなので、回答も遠回りになりがちです。

    widgetメソッド内でadd_actionして、クラス内のメソッドを呼ぶようにしておくのが、必要な場合のみ実行されるので、一番すっきりすると思いますがいかがでしょう。

    トピック投稿者 redcocker

    (@redcocker)

    jim912さん

    有難うございます。

    最初、シンプルにウィジェットの表示の有無を判断する方法があると考えており、後に方向転換の必要が出たため情報が整理されず、小出しになってしまいました。

    失礼しました。

    ウィジェット表示の有無の判定することが難しそうですので、仰るようにwidgetメソッド内でadd_actionするのがシンプルかと思います。

    ただ、my_function()部分は、ウィジェットが表示されるタイミングだけで実行されれば良いと言うものではなく、この点は、何か工夫を考えてみます。

    トピック投稿者 redcocker

    (@redcocker)

    nobitaさん、jim912さん、有難う御座いました。

    厳密には、特定のウィジェットが表示されているか判定出来たわけではありませんが、なんとか同等の内容の処理が実現できました。

    jim912さんのご提案のように、widget()メソッド内でadd_actionする手法をとっています。

    ただし、スクリプトの書き出し条件が、「特定のウィジェットが表示されている場合」以外に「本文の特定のタグが含まれる場合」という条件も含まれるため、若干、工夫しました。

    参考に概要をまとめておきます。

    以下、メインのPHPファイルの大まかな構成。

    // ウィジェットの読み込み
    include_once('my_widget.php');
    
    // プラグインが読み込まれたタイミングでload_scripts_for_content()を実行
    add_action('plugins_loaded', 'load_scripts_for_content');
    
    // 本流。フッターにJavaスクリプトを書きだすための処理。
    function load_scripts_for_content(){
    	add_action('wp_footer', 'check_valid_tag');
    }
    
    // my_widget.phpから呼ばれる。フッターにJavaスクリプトを書きだすための処理。
    function load_scripts_for_widget(){
    	add_action('wp_footer', 'scripts_on_footer');
    }
    
    // 本文に特定のタグが含まれる場合は、scripts_on_footer()でJavaスクリプトをecho。
    function check_valid_tag(){
    	global $post, $wp_query;
    
    	foreach((array)$wp_query->posts as $key => $post) {
    		if (preg_match("/特定のタグ/i", $post->post_content)) {
    			scripts_on_footer();
    			break;
    		}
    	}
    
    	echo '';
    }
    
    // Javaスクリプトの書き出し
    function scripts_on_footer(){
    	static $count = 0;
    	$count++;
    
    	if ($count == 1) {
    		echo 'Javaスクリプト';
    	} else {
    		echo '';
    	}
    }

    以下、my_widget.php。

    class MyWidget extends WP_Widget {
    
    	function MyWidget() {
    		//処理
    	}
    
    	function widget($args, $instance) {
    		//処理
    		load_scripts_for_widget();
    	}
    
    	function update($new_instance, $old_instance) {
    		//処理
    	}
    
    	function form($instance) {
    		//処理
    	}
    }
    
    add_action('widgets_init', create_function('', 'return register_widget("MyWidget");'));

    add_action('plugins_loaded', 'load_scripts_for_content');起点とする流れが本流で、本流では、特定のタグが含まれるかの処理が入っています。

    widget()メソッド内でのload_scripts_for_widget()を起点とする処理では、widget()メソッドの実行がそのものがウィジェットが表示されたことを示しているため、判定処理していません。

    「特定のウィジェットが表示されている場合」かつ、「本文の特定のタグが含まれる場合」に二重に同じスクリプトが書き出されることを防止するために、scripts_on_footer()内でstatic $count = 0を定義し、条件分岐しています。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • トピック「現在のページに特定のウィジェットが表示されているか判定」には新たに返信することはできません。