Cocoonフォーラム

サイト内検索
書き込みの前に以下の3点をご確認ください。
  1. 1つのトピックにつき1つの質問を書き込んでください
  2. 不具合・カスタマイズ対象ページのURLを提示高速化を無効にしてください
  3. 該当部分のキャプチャ・環境情報とともに書き込んでいただけると助かります

何を書き込んだら良いか分からない場合は、以下のテンプレートをコピペしてご利用ください。

不具合・カスタマイズ対象ページのURL:

相談内容:

不具合の発生手順:

解決のために試したこと:

※文字だけでは正しく伝わらない可能性があるため、スクショ画像の添付もお願いします。
※高速化設定をしている場合は無効にしてください。
環境情報:

※↑こちらに「Cocoon設定 → テーマ情報」にある「環境情報」を貼り付けてください。

環境情報の取得方法はこちら。
https://wp-cocoon.com/theme-report/
高速化設定を無効にするにはこちら。
https://wp-cocoon.com/theme-trouble/

フォーラム利用ガイドリンク

  1. フォーラムガイドライン
  2. よくある質問と答え(FAQ)
  3. サポート対象外のケース
  4. 原因不明の不具合用トラブルシューティング
  5. トピックにHTMLを貼り付ける方法(推奨ツール:notepad.pw
  6. 真っ白画面でのエラーメッセージの確認方法
  7. ブラウザ環境チェックツール
  8. Cocoonカスタマイズ依頼

フォーラム質問後、問題等が解決した場合は結果を書き込んでいただけると幸いです。同様の問題で調べている方には、結果が一番気になる部分となります。

エスケープしたショートコードに見出しが...
 
共有:
通知
すべてクリア

[解決済] エスケープしたショートコードに見出しが含まれると目次に認識されてしまう

19 投稿
3 ユーザー
10 Reactions
2,734 表示
草村
(@kusamura_mono)
Reputable Member Registered
結合: 6年前
投稿: 174
Topic starter  

いつもお世話になっております。

表題の件ですが、目次では二重括弧でエスケープしたショートコードも実行されてしまうようです。

そしてそのショートコードに見出しが含まれていると目次に認識されてしまいます。
この現象は自動挿入の目次のみで、目次ショートコードと目次ウィジェットでは発生しません。

サンプルページを用意しましたのでご確認ください。
https://web.monogusa-note.com/sample-page

サンプルページのコードはこちらです。
https://notepad.pw/share/mhnwiqec2

各テンプレートショートコードの中身はこちらです。
https://notepad.pw/share/t3fk3wjvz

お手数ですが、ご確認いただけると幸いです。


   
わいひら
(@yhira)
Illustrious Memberサイト Admin
結合: 7年前
投稿: 17220
 

詳しいご報告ありがとうございます!
エスケープ下ショートコードを除外するように変更してみました。
------------------------------------------------
https://github.com/yhira/cocoon
最新ファイルをダウンロードする場合は、上記ページのダウンロードボタンからzipファイルをダウンロードしてください。

FTPでのアップデート方法はこちら。
https://wp-cocoon.com/ftp-update/
------------------------------------------------


   
草村 reacted
わいひら
(@yhira)
Illustrious Memberサイト Admin
結合: 7年前
投稿: 17220
 

ちなみに、上記のバージョンで草村さんが以前書かれたヘッダーモバイルボタン機能のアイデアを利用させていただきました。
https://web.monogusa-note.com/cocoon-mobile-header-menu
Cocoon設定「モバイル」タブにて変更できます。


   
草村 reacted
わいひら
(@yhira)
Illustrious Memberサイト Admin
結合: 7年前
投稿: 17220
 

本来は、独自のメニューボタンと検索ボタンを追加するという全く違う実装を考えていました。
けれど、ユーザーさんが自身でボタンを変更できた方が明らかに楽しいので、参使わせてていただきました。
良い記事をありがとうございます!
せっかくのカスタマイズ記事のアイディアを使わせてもらって申し訳ないです^^;


   
草村 reacted
草村
(@kusamura_mono)
Reputable Member Registered
結合: 6年前
投稿: 174
Topic starter  

ご返信とご対応ありがとうございました!
アップデートして確認しましたが、結果は変わりませんでした…。

適切かどうかわからないのですが、その後少し調べようと試した事をご報告します。

functions.phpに以下のコードを追加して本文を出力してみたんですが自動挿入の目次に渡された本文はすでにショートコードが実行され本文が形成されたものでした。

エスケープしたショートコードは二重括弧が外れエスケープされていないショートコードになっています。
これをdo_shortcode()に通すのでショートコードが実行されてしまうようです。

function get_toc_tag($the_content){
$removed_content = get_shortcode_removed_content($the_content);
return htmlspecialchars($removed_content);
}

ただ、目次ショートコードの方はショートコードが実行される前の本文が渡されておりこちらはエスケープしたショートコードは問題なく削除されていました。

実行タイミング的な問題だと思ったのですが私にはそれ以上の事はわかりませんでした。

もしわかる事がありましたら、よろしくお願いいたします。


   
草村
(@kusamura_mono)
Reputable Member Registered
結合: 6年前
投稿: 174
Topic starter  

ヘッダーモバイルボタン機能について>

新機能でヘッダーモバイルボタンが実装されるんですね!

普段Cocoonのカスタマイズを通して色々な事を学ばせて貰っています。
Cocoonを利用させてもらっている事ももちろんですが、当ブログの記事を紹介してくださったりフォーラムでお世話になったり、わいひらさんにたくさんの事を支えてもらいブログを続けられています。

私のアイディアが少しでもCocoonの発展に貢献出来ていたならとても光栄に思いますので、
全然お気になさらず良さそうなものはどんどん取り入れていってください!

正式に実装されましたら当ブログでも利用させてもらいますね。
こちらこそありがとうございます!


   
ろこ
(@lococo)
Prominent Member Registered
結合: 7年前
投稿: 830
 

「エスケープしたショートコード見出し」が目次に含まれないようにすべき、ということでよろしいですよね?

https://github.com/yhira/cocoon/blob/master/lib/toc.php#L262

通常の目次生成がここで行われていますが、実行されるのが以下の点。

https://github.com/yhira/cocoon/blob/master/lib/toc.php#L223

つまり、目次生成は10000あたりで実行されているのに対し、do_shortcode(11)が先に実行されてしまいます。

$html = get_toc_tag(get_the_content(), $harray);

https://github.com/yhira/cocoon/blob/master/lib/toc.php#L262

とするのが手っ取り早そうですが、$contentのままでやるとなると、get_toc_tag関数内でdo_shortcodeが実行されている場合と実行されていない場合に分けるなどする必要がありそうですね。


   
わいひら and 草村 reacted
草村
(@kusamura_mono)
Reputable Member Registered
結合: 6年前
投稿: 174
Topic starter  

ロコさん

詳しく見てくださってありがとうございます!

「エスケープしたショートコード見出し」が目次に含まれないようにすべき、ということでよろしいですよね?

はい。その通りなんですが、もっと言うと「エスケープしたショートコードは実行しない」ようになればいいなと思っています。

例えば[[navi name=“XXX”]]と書いたものが実行されてしまうとXXXというメニューが存在しないのでPHPエラーが出るようです。
たとえエラーは出ずとも、もし必要ない処理なら極力減って欲しいのもあり、自動挿入の目次ではdo_shortcodeを実行しないのが私の想像している理想の動きなのかな?と思います。

ただ知識が浅く理解できていない部分も多いので見当違いな事を言っているかもしれないので…
どういった処理が最善かの判断はわいひらさんにお任せしたいと思います…!


   
わいひら
(@yhira)
Illustrious Memberサイト Admin
結合: 7年前
投稿: 17220
 

僕が昨日原因を調べて、力尽きて眠ってしまったところまで分かったこと書くと、以下のようにすると修正できました(最新版に適用してあります)。
https://github.com/yhira/cocoon/commit/a1b8979078a9d7c8ce344c2f3e9fc6b79a7cd89f

どうやら、以下の本文フィルターフックの引数から取得できる$the_content変数は、既にショートコードが展開されたものが取得されるようです。

add_filter('the_content', 'add_toc_before_1st_h2', get_toc_filter_priority());
if ( !function_exists( 'add_toc_before_1st_h2' ) ):
function add_toc_before_1st_h2($the_content){

なので引数の$the_content変数から本文を取得せずに、get_the_content()で取得すると、ショートコード展開前の文文が取得できるようです。

実際、tocショートコードでは、get_the_content()を利用して取得していました。
https://github.com/yhira/cocoon/blob/3b2225be6c9b9632b63e0470ea9114887eacfd7e/lib/shortcodes.php#L377


   
わいひら
(@yhira)
Illustrious Memberサイト Admin
結合: 7年前
投稿: 17220
 

というか、ロコさんが書かれていることとほとんど一緒だった…。


   
わいひら
(@yhira)
Illustrious Memberサイト Admin
結合: 7年前
投稿: 17220
 

たとえエラーは出ずとも、もし必要ない処理なら極力減って欲しいのもあり、自動挿入の目次ではdo_shortcodeを実行しないのが私の想像している理想の動きなのかな?と思います。

僕も出来ればdo_shortcodeは使いたくありません。
ただ、テンプレート(temp)ショートコードで見出しを含めてテンプレート化していた場合は、do_shortcodeしないと表示されているコンテンツ内容と、目次の内容が合わないということになってしまいます。

なので現在は、ブラックリスト形式で不要なショートコードを除外する形にしています。
naviも見出し生成と関係なさそうなので、除外しておこうと思います。
また、他に悪さするショートコードがあれば、ご連絡いただければブラックリストに追加いたします。


   
わいひら
(@yhira)
Illustrious Memberサイト Admin
結合: 7年前
投稿: 17220
 

現在、とりあえずdo_shortcodeしたときに、多少時間がかかりそうなショートコードは除外しておきました(※全部ではないです)。
https://github.com/yhira/cocoon/commit/330ce918f4275a376efe85e007b0d95438b8120e


   
わいひら
(@yhira)
Illustrious Memberサイト Admin
結合: 7年前
投稿: 17220
 

私のアイディアが少しでもCocoonの発展に貢献出来ていたならとても光栄に思いますので、
全然お気になさらず良さそうなものはどんどん取り入れていってください!

ありがとうございます!
本日公開の1.8.5で実装させていただきました。
あの記事がなかったら、全然別の実装になっていたと思います。


   
ろこ
(@lococo)
Prominent Member Registered
結合: 7年前
投稿: 830
 

the_contentフックはthe_content関数内に用意されているフックですが、get_the_content関数から受け取った値をフックに通すための関数で、WordPress本体でdo_shortcodeなどの処理をここで行っています。

do_shortcodeの優先度は11、目次の処理の優先度はこれより後になっているので、

本文フィルターフックの引数から取得できる$the_content変数は、既にショートコードが展開されたものが取得されるようです。

となってしまいます。

 

たとえエラーは出ずとも、もし必要ない処理なら極力減って欲しいのもあり、自動挿入の目次ではdo_shortcodeを実行しないのが私の想像している理想の動きなのかな?と思います。

処理の面だけを考えるのであれば、目次生成をフロントのJSで処理するのがよいのかもしれませんが、AMP等を考慮すると難しいところではあります。

get_toc_tag関数にdo_shortcode処理後の有無用に引数を追加すれば、the_contentフックで生成する場合のみget_toc_tag関数内のdo_shortcodeは避けられるかと思います。


   
草村
(@kusamura_mono)
Reputable Member Registered
結合: 6年前
投稿: 174
Topic starter  

わいひらさん

最新版を適用した所、エスケープしたショートコードが実行されなくなりました!
おかげでエラーも出なくなりました ?

てっきりロコさんの提示してくださった方法が見出しのみに関係する事でエスケープしたショートコードが実行されてしまう事は変わらないのかと勘違いしておりました。
詳しく説明していただいたおかげで理解できたように思います!

また、除外設定もご考慮いただき大変ありがたいです。
もしかするとサイトマップは目次を表示したい方もいるかも?と少し思いました。私はどっちでもいいですが。

この度はご対応本当にありがとうございました。
ずっと気になっていたのでスッキリしました!

★モバイルヘッダーボタン、早速使わせていただきます!


   
わいひら reacted
草村
(@kusamura_mono)
Reputable Member Registered
結合: 6年前
投稿: 174
Topic starter  

ロコさん詳しい説明ありがとうございます!

そして、こちら

もし必要ない処理なら極力減って欲しいのもあり、自動挿入の目次ではdo_shortcodeを実行しない

弁解させてもらいますと、”自動挿入の目次では”ショートコード展開済みの本文が取得されているようなので、”再び”do_shortcodeを通す必要がないと思ったので書きました ? 

ですので目次生成をJSに任せたいとか、ショートコードで出力された見出しを目次に含めなくていいと思ったわけではない事を、念の為お伝えさせていただきます。

多分ロコさんの仰るこちらの方法が想像していた処理なのだと思います!

get_toc_tag関数にdo_shortcode処理後の有無用に引数を追加すれば、the_contentフックで生成する場合のみget_toc_tag関数内のdo_shortcodeは避けられるかと思います。

ただエスケープしたショートコードが処理される不具合は改善しましたので、個人的にはこれにて解決とさせていただきます。

お二人ともありがとうございます!


   
わいひら reacted
わいひら
(@yhira)
Illustrious Memberサイト Admin
結合: 7年前
投稿: 17220
 

処理の面だけを考えるのであれば、目次生成をフロントのJSで処理するのがよいのかもしれませんが、AMP等を考慮すると難しいところではあります。

元々、参考にしたサンプルコードでは、JavaScript処理だったんですが、AMP化のためにPHP処理に変更させています。
※参考にした記事を探したけど見つからなかった…。

もしかするとサイトマップは目次を表示したい方もいるかも?

確かに、サイトマップは見出しを使用するため除外すべきではありませんね。
除外しないようにしとこうと思います。

弁解させてもらいますと、”自動挿入の目次では”ショートコード展開済みの本文が取得されているようなので、”再び”do_shortcodeを通す必要がないと思ったので書きました

これは確かに以下の文に、書かれていましたね。読み飛ばしていたようです。

functions.phpに以下のコードを追加して本文を出力してみたんですが自動挿入の目次に渡された本文はすでにショートコードが実行され本文が形成されたものでした。

ついつい、フォーラムの返信におわれている場合は読み飛ばしてしまうことが結構あるようです。申し訳ないです。

get_toc_tag関数にdo_shortcode処理後の有無用に引数を追加すれば、the_contentフックで生成する場合のみget_toc_tag関数内のdo_shortcodeは避けられるかと思います。

これは確かにそうなんですが、引数を増やして関数を複雑化させたくなかったので、ウィジェットやショートコードでは、事前に整形しdo_shortcode展開した引数を渡すようにしてみました。
https://github.com/yhira/cocoon/blob/16ea7ab9f5aa4c7540f9091b97c6dbc9727ed3be/lib/shortcodes.php#L377

これで、the_contentフック部分で、二重でdo_shortcodeすることはなくなったかと思います。

変更ファイルは、以下で適用しておきました。
------------------------------------------------
https://github.com/yhira/cocoon
最新ファイルをダウンロードする場合は、上記ページのダウンロードボタンからzipファイルをダウンロードしてください。

FTPでのアップデート方法はこちら。
https://wp-cocoon.com/ftp-update/
------------------------------------------------


   
草村 reacted
草村
(@kusamura_mono)
Reputable Member Registered
結合: 6年前
投稿: 174
Topic starter  

わいひらさん

今、テスト環境で試しましたがエスケープしたショートコード関係は特に問題なく目次がちゃんと表示されました。

この度は色々とありがとうございました ? 


   
わいひら reacted
わいひら
(@yhira)
Illustrious Memberサイト Admin
結合: 7年前
投稿: 17220
 

ご確認ありがとうございます。
僕の環境でも、「目次設定」から以下の優先度(get_toc_filter_priority()の部分)とかを変更しても問題ないようです。

add_filter('the_content', 'add_toc_before_1st_h2', get_toc_filter_priority());

なので、今後get_toc_tag関数には「展開後の本文を渡す方法」でやっていこうと思います。


   
草村 reacted
共有:

問題の解決に至った場合には、トピック冒頭の「解決済み」をクリックしていただけますと幸いです。

また、有用な回答があった場合は返信右下にある「いいね!」もご活用ください。回答者の励みになります。

「いいね!」機能はフォーラム登録者のみが利用できる機能です。

CC BY-ND 2.1)準じていれば(リンクを貼っていただければ)転載も自由です。カスタマイズ記事を書く際にコード等をコピペ利用していただいて構いません。

フォーラムの使い方がよくわからない場合は、テストトピックで自由にテストしていただいて構いません。

最近の書き込みはこちら。

詳細なカスタマイズ依頼をするならこちら。

タイトルとURLをコピーしました