現在デフォルトスキンとして「Momoon(アクア)」を適用中。

エスケープしたショートコードに見出しが含まれると目次に認識されてしまう | 不具合報告 | Cocoon フォーラム

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

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

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

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

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

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

フォーラムのTwitterアカウント(@CocoonForum)はこちら

スポンサーリンク
エスケープしたショートコードに見出しが...
 
Share:

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


草村
(@kusamura_mono)
Estimable Memberサイト
参加: 1年 前
投稿: 145
草村 - Twitter
2019年6月23日 18:19  

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

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

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

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

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

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

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


わいひら
(@yhira)
メンバーサイト Admin
参加: 2年 前
投稿: 7342
わいひら - Facebookわいひら - Twitter
2019年6月23日 21:50  

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

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


草村 件のいいね!
わいひら
(@yhira)
メンバーサイト Admin
参加: 2年 前
投稿: 7342
わいひら - Facebookわいひら - Twitter
2019年6月23日 21:52  

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


草村 件のいいね!
わいひら
(@yhira)
メンバーサイト Admin
参加: 2年 前
投稿: 7342
わいひら - Facebookわいひら - Twitter
2019年6月23日 21:54  

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

This post was modified 6か月 前 3 times by わいひら

草村 件のいいね!
草村
(@kusamura_mono)
Estimable Memberサイト
参加: 1年 前
投稿: 145
草村 - Twitter
2019年6月24日 00:50  

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

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

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

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

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

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

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

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


草村
(@kusamura_mono)
Estimable Memberサイト
参加: 1年 前
投稿: 145
草村 - Twitter
2019年6月24日 01:06  

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

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

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

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

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


ロコ
(@lococo)
Reputable Member
参加: 2年 前
投稿: 489
2019年6月24日 02:08  

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

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が実行されている場合と実行されていない場合に分けるなどする必要がありそうですね。


わいひら草村 件のいいね!
草村
(@kusamura_mono)
Estimable Memberサイト
参加: 1年 前
投稿: 145
草村 - Twitter
2019年6月24日 14:11  

ロコさん

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

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

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

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

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


わいひら
(@yhira)
メンバーサイト Admin
参加: 2年 前
投稿: 7342
わいひら - Facebookわいひら - Twitter
2019年6月24日 19:44  

僕が昨日原因を調べて、力尽きて眠ってしまったところまで分かったこと書くと、以下のようにすると修正できました(最新版に適用してあります)。
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)
メンバーサイト Admin
参加: 2年 前
投稿: 7342
わいひら - Facebookわいひら - Twitter
2019年6月24日 19:45  

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


わいひら
(@yhira)
メンバーサイト Admin
参加: 2年 前
投稿: 7342
わいひら - Facebookわいひら - Twitter
2019年6月24日 19:58  

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

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

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


わいひら
(@yhira)
メンバーサイト Admin
参加: 2年 前
投稿: 7342
わいひら - Facebookわいひら - Twitter
2019年6月24日 19:59  

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


わいひら
(@yhira)
メンバーサイト Admin
参加: 2年 前
投稿: 7342
わいひら - Facebookわいひら - Twitter
2019年6月24日 20:01  

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

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


ロコ
(@lococo)
Reputable Member
参加: 2年 前
投稿: 489
2019年6月25日 00:21  

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)
Estimable Memberサイト
参加: 1年 前
投稿: 145
草村 - Twitter
2019年6月25日 00:24  

わいひらさん

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

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

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

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

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


わいひら 件のいいね!
草村
(@kusamura_mono)
Estimable Memberサイト
参加: 1年 前
投稿: 145
草村 - Twitter
2019年6月25日 16:20  

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

そして、こちら

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

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

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

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

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

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

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


わいひら 件のいいね!
わいひら
(@yhira)
メンバーサイト Admin
参加: 2年 前
投稿: 7342
わいひら - Facebookわいひら - Twitter
2019年6月25日 22:13  

処理の面だけを考えるのであれば、目次生成をフロントの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/
------------------------------------------------

This post was modified 5か月 前 2 times by わいひら

草村 件のいいね!
草村
(@kusamura_mono)
Estimable Memberサイト
参加: 1年 前
投稿: 145
草村 - Twitter
2019年6月26日 18:42  

わいひらさん

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

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


わいひら 件のいいね!
わいひら
(@yhira)
メンバーサイト Admin
参加: 2年 前
投稿: 7342
わいひら - Facebookわいひら - Twitter
2019年6月26日 20:18  

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

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

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

This post was modified 5か月 前 2 times by わいひら

草村 件のいいね!
Share:
スポンサーリンク
わいひらをフォローする
おすすめサーバ

性能も兼ね備えながら安くブログ運営を開始したいのであればここ1択。

◎LiteSpeedを用いた高速サーバー(完全SSD)
◎http/2・QUIC(高速化プロトコル)に対応
◎東京・大阪でリージョン選択が可能
◎プランのアップ・ダウングレードが自由自在
◎同サービス内でドメイン管理が可能
◎転送量が多い
◎毎日無料バックアップ(14日分)
◎復元ポイントを指定して復旧可能(無料)
◎アダルト・出会い系サイト可
◎ドメインとサーバー代のチャージ払いが可能
○サーバ引っ越しオプションあり(有料)
サービス運営期間:1年4ヶ月

1年以上の契約をする場合は、クーポンコード入力でさらに20%割引(※2019/12/18 17:00まで)。

クーポンコード:Y2KIC92J9Y

クーポンの使用方法はこちら

安定感抜群のサーバーです。あまり急激なアクセス変動がないアフィリエイトサイトに向いています。

◎nginxを用いた高速サーバー(完全SSD)
◎老舗サーバーなので安定感抜群
◎ディスク容量が多い
◎転送量が多い
◎同サービス内でドメイン管理が可能
○http/2(高速化プロトコル)に対応
○毎日無料バックアップ(14日分)
△DBは7日分だけ無料復旧可能(ファイルは有料)
×プラン変更でCPUのスペックアップができない
×プラン変更しても即時反映されない
×アダルト・出会い系サイト不可
サービス運営期間:16年

プラン変更で負荷対策が行えるので、ブログ向きのレンタルサーバーです。

◎LiteSpeedを用いた高速サーバー(完全SSD)
◎http/2・QUIC(高速化プロトコル)に対応
◎プランのアップ・ダウングレードが自由自在
◎転送量が多い
◎毎日無料バックアップ(14日分)
◎復元ポイントを指定して復旧可能(無料)
◎アダルト・出会い系サイト可
○サーバ引っ越しオプションあり(有料)
○サーバー料金をチャージ払いが可能
サービス運営期間:3年

とにかく速い。サイトに表示スピードを求めるならココ。

◎nginxを用いた高速サーバー(完全SSD)
◎プランのアップ・ダウングレードが自由自在
◎ディスク容量が多い
◎転送量が多い
○http/2(高速化プロトコル)に対応
○毎日無料バックアップ(14日分)
○DB復旧は無料(ファイルは有料)
○サーバ引っ越しツールあり
○サーバー料金をチャージ払いが可能
△新しいサービスなので運営櫪がまだ短い
サービス運営期間:1年2ヶ月

格安な値段で始められる高機能サーバーです。
性能も備えつつ最安ならここ。
サイトを続けるうちにアクセスが増えれば、プランのアップグレートで対応可能です。

◎LiteSpeedを用いた高速サーバー(完全SSD)
◎激安プランが用意してある
◎値段あたりのスペックが高い(コスパ良し)
◎サーバ引っ越しオプションあり(無料)
◎アダルト・出会い系サイト可
○http/2(高速化プロトコル)に対応
△プランのアップは可能だがダウンは不可
△毎日自動バックアップ(1日分)
△前日のバックアップからのみ復元できる(無料)
サービス運営期間:3年

Cocoon
  
動作中

ログイン または 登録 してください

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