cocoonフック調査~cocoon_exclude_script_movement_from_contentの使い方と活用例

タナビーの高梨です。
WordPressのテーマ「Cocoon」には、テーマ改変なしでデザインや動作を拡張できる豊富なアクション・フィルターフックが用意されています。
分かる範囲で内容を調査したのでブログにまとめていこうと思います。
今回は本文中のscript出力を操作をしているロジックで対象となるスクリプトを除外するかの判断を変更できるフィルターフック
👉cocoon_exclude_script_movement_from_content
です
フックの概要
フック名 | 発火タイミング |
---|---|
cocoon_exclude_script_movement_from_content | 本文データ展開時(’the_content’フィルター) |
発火条件
the_contentのフィルターフック発火時に発火すると見せかけて、下記の理由により絶対に発火しないと思われます。
発火しない理由
apply_filters()がコールされている箇所は下記のような内容になっています。
if (is_footer_javascript_enable() &&
apply_filters('get_the_content_all_scripts', true) &&
preg_match_all('{<script.*?>(.*?)</script>}is', $the_content, $m)) {
// 省略 //
$is_exclude = apply_filters('cocoon_exclude_script_movement_from_content', $is_exclude, $script);
}
このうち、is_footer_javascript_enable()は以下の通りに定義されています。
function is_footer_javascript_enable(){
return false;//get_theme_option(OP_FOOTER_JAVASCRIPT_ENABLE, 1);
}
is_footer_javascript_enable()が必ずfalseで返るため、apply_filters()がコールされるに至りません。
apply_filters呼び出し元のソースコード
lib/content.php
if (is_footer_javascript_enable() &&
apply_filters('get_the_content_all_scripts', true) &&
preg_match_all('{<script.*?>(.*?)</script>}is', $the_content, $m)) {
// 省略 //
$is_exclude = apply_filters('cocoon_exclude_script_movement_from_content', $is_exclude, $script);
}
引数
$is_exclude:(boolean)true:scriptを除外する、false:scriptを除外しない
$script:(string)対象となるスクリプト
カスタマイズコード例
強制的に$scriptが’scriptA’の場合に展開しない場合の例ですが、おそらく絶対に実行されません。
function customize_cocoon_exclude_script_movement_from_content ( $is_exclude, $script ) {
if ( includes_string($script, 'scriptA') ) {
$is_exclude = true;
}
return $is_exclude;
}
add_filter('cocoon_exclude_script_movement_from_content', 'customize_cocoon_exclude_script_movement_from_content', 10, 2 );
※includes_string()はcocoonのテーマで定義されている関数(utils..php)
注意点
・Cocoon標準のままでは 必ず実行されないフィルターフック です
・他テーマやCocoonの将来バージョンで is_footer_javascript_enable() の返り値が変われば利用できる可能性があります。
・現状では「存在するが死んでいるフック」と理解しておくのが無難です
まとめ
・cocoon_exclude_script_movement_from_contentは本文中のscript出力を操作をしているロジックで対象となるスクリプトを除外するかの判断を変更できるフィルター
・ただし Cocoon の現行コードでは条件分岐により 発火しない仕様
・実際のカスタマイズ用途はなく、将来的な変更に備えて存在している可能性が高い