• 解決済 gdgd@hirahira

    (@gdgdhirahira)


    ショートコードを使って、投稿の内容にJavascriptによる効果を付加するプラグインを作って使っていますが、現状では

    add_action('init',  'load_jqtools_ini');
    add_action('wp_head', 'start_jqtools');

    を使って常時ロードしている構成です。
    これをショートコードが存在したときにだけ、スクリプトの類をロードさせるようにするにはどのような仕掛けを施したらよいのでしょうか。
    単純に、ショートコードを処理するfunctionブロックに入れても駄目でしたので、何かしらの工夫が必要なんだと思ったところで躓いています。
    同様の動作を実現しているプラグインなどを眺めてみたのですが、今のレベルではいまいち理解できませんでした。
    このフォーラムおよび検索サイトでの検索も試みてみましたが、ピンとくるような記述を見つけることが出来ませんでした。

    アドバイスなり、ヒントなりをいただける方がいらっしゃいましたら、なにとぞよろしくお願いします。
    いっそのこと、ソースをまんま貼り付けてアドバイスいただいたほうが早いのかもしれませんが…さすがに恥ずかしいもので…。

    よろしくお願いします。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • add_filter でコンテンツ内容にフィルタかけて、正規表現などで[short]がマッチしたらロードさせる部分を書けば良いのでは?

    トピック投稿者 gdgd@hirahira

    (@gdgdhirahira)

    kvek さん ありがとうございます。

    add_filter でコンテンツ内容にフィルタかけて

    なるほど…。

    ありがとうございます。何となく、出来そうな気がしてきました。
    正規表現がちょっと苦手なので、そこで苦戦しそうですが…ちょっとがんばってみます。

    ひとまず、ありがとうございます。

    トピック投稿者 gdgd@hirahira

    (@gdgdhirahira)

    続けてコメントを入れてしまいます…。ごめんなさい。

    まず、add_filter('the_content','chk_sc_fnc');による、分岐には成功しました。
    正規表現による切り分けにも成功しているようなのですが、スクリプトのロードの部分だけ駄目なようです。もしかして
    wp_enqueue_script
    による、ロードでは駄目なのでしょうか?

    度々で申し訳ありませんが、なにとぞ、アドバイスのほど、よろしくお願いいたします。

    挙動がどうだったか確かではありませんが、本文部分でフィルタかけて処理するので、フッタで処理してやらないとダメだと思います。(wp_headの処理が終わってる)

    wp_enqueue_script

    の第5引数をtrueでフッタに読ませるとかはダメですかね?
    挙動的にダメかな・・・

    トピック投稿者 gdgd@hirahira

    (@gdgdhirahira)

    kvexさん、ありがとうございます。

    wp_enqueue_script

    の第5引数をtrueでフッタに読ませるとかはダメですかね?

    は、期待通りの結果にはなりませんでした。
    テンプレートの処理の順序で変わったりするのですかね?
    それはそれで、困ってしまいますけど…。

    別のアプローチ方法が必要なのかもしれません。
    とりあえずは、現状維持で使っていきたいと思います。
    また、何か思いつきましたら、アドバイスいただけると助かります。

    ありがとうございました。

    ショートコードが存在する場合だけ、css, js を読み込ませたいと言うことですが、僕の作ったプラグインでは実現させてます。
    http://wordpress.org/extend/plugins/syntax-highlighter/
    http://wordpress.org/extend/plugins/google-maps-anywhere/

    以下のような感じで、$wp_query->posts に目的のショートコードが含まれているか正規表現でチェックし、無ければ wp_enqueue_script() を呼び出さないようにしてます。
    詳しくは、上述のプラグインのソースを眺めて見てください。

    add_action('wp_print_scripts', array(&$this,'addScripts'));
    
    function addScripts() {
    	if (!hasShortCode('shortcode'))
    		return;
    	wp_enqueue_script('hogehoge', 'http://example.com/fugafuga.js');
    }
    
    function hasShortcode($shortcode) {
    	global $wp_query;
    
    	$posts   = $wp_query->posts;
    	$pattern = '/\[' . preg_quote($shortcode) . '[^\]]*\]/im';
    	$found   = false;
    	$hasTeaser = !( is_single() || is_page() );
    
    	foreach($posts as $post) {
    		if (isset($post->post_content)) {
    			$post_content = $post->post_content;
    			if ( $hasTeaser && preg_match('/<!--more(.*?)?-->/', $post_content, $matches) ) {
    				$content = explode($matches[0], $post_content, 2);
    				$post_content = $content[0];
    			}
    
    			if ( !empty($post_content) && preg_match($pattern, $post_content) ) {
    				$found = true;
    			}
    		}
    		if ( $found )
    			break;
    	}
    	unset($posts);
    	return $found;
    }
    トピック投稿者 gdgd@hirahira

    (@gdgdhirahira)

    wokamotoさん、ありがとうございます。

    ソースの例示までしていただいて、本当にありがとうございます。
    何となくですが、『こういう仕掛けで出来るんだ』という感じのものがわかりました。

    まだ、手元のソースに上手く落とし込めていないのですが、一つ一つ、調べて勉強して何とかクリアしたいと思います。

    本当にありがとうございました。

    トピック投稿者 gdgd@hirahira

    (@gdgdhirahira)

    wokamotoさん、ありがとうございます。

    無事、実装することが出来ました。
    本当にありがとうございました。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • トピック「ショートコードが存在したときにだけJavascriptをロードさせたい」には新たに返信することはできません。