この問題は、WordPressバージョン6.2.2で解決しており、テンプレート上でも問題なくショートコードが機能するようになりました。
しかしながら、あくまでも私の記憶ですが、6.2.0の段階まではショートコードで出力するコンテンツへのpタグ補完はなかったと認識しており、それまでは問題なく表示されていたものが、6.2.2ではショートコードで出力するコンテンツに空白行がある場合pタグが補完されるようになって、表示がおかしくなったりする場合があるようです(実際に自身で作成した一部のショートコードで現象を確認しました)。
もしもショートコードで出力するコンテンツの中に、改行でpタグが補完されると不味いものがあったり、styleタグを使って直接HTMLへスタイルコードを出力する場合でコード中の空白行でpタグが補完されたりすると、表示が崩れることがあるので一度チェックしたほうがよさそうです。
スタイルであれば別のスタイルシートへコードを書き、それを読み込むようにするのが妥当なところですが、直接出力するケースでは、設定画面等でスタイルに何かの変数を使って設定値を与えていることが多く、別のCSSファイルで扱うことが難しいので、改行などを見直してきちんと適用されるように修正するか、「もう外部CSSを読み込ませる必要なし?wp_add_inline_styleが超便利!」を参考に、インラインで出力する方法を使うと不具合を解消できると思います。
ブロックテーマ(ブロック形式でテンプレートを編集するタイプのテーマ)を有効にしているWordPressを、バージョン6.2.1へ更新したら、投稿や固定ページでショートコードがそのまま表示されるようになってしまったという状況に遭遇した方、ちょっとびっくりしたと思います。
今回の更新は6.2.xへの変更というセキュリティや不具合に関するマイナーアップデートなので、基本的にはすべての更新をオフにするというような措置をしていないサイトでは、100%自動で更新されます。そして、セキュリティ対策の1つとして、テンプレートに直接書いたショートコードを実行しないようにするというものが追加され、不具合?と思える症状が出ているのです(詳しくは後述します)。
そこで本ページでは、いきなりショートコードがそのままになってしまって困っている方のために、対処方法を大きく4つ紹介します。
ブロックテーマのテンプレートでショートコードを動かす方法
1.部分的にテンプレートパーツ化して挿入する
このセキュリティ更新では「テンプレートに直接挿入したショートコードは実行しない」という条件付きになっています。したがって、テンプレートパーツにショートコードを含むコンテンツを作り、それをテンプレートへ挿入すれば問題なく動作します。
テンプレートパーツはHTML上divタグで括られるようになっていますが、div要素は単なる部品ですよと認識されるだけなので、恐らくページ解析上問題は出ないと思います(専門家ではないので責任は持てません)
2.テンプレートのそのものをテンプレートパーツ化して挿入する
1を拡張した方法です。テンプレートパーツにして挿入すれば動作するのですから、部分的ではなく、投稿テンプレートの本文部分をすべてパーツにして、テンプレートへはパーツを挿入するという手法です。
ショートコードがたくさんあって部分的にパーツ化すると管理が大変になるという場合にはこの方法の方がおすすめです。
テンプレートパーツはHTML上divタグで括られるようになっていますが、div要素は単なる部品ですよと認識されるだけなので、恐らくページ解析上問題は出ないと思います(専門家ではないので責任は持てません)
3.テンプレートでもショートコードが実行される状態に戻す
これは、「6.2.1 を使い続けたいが、テンプレートのショートコードのサポートを復元する必要がある場合は、この回避策を試すことができます。」に掲載されている方法なのですが、あまりおすすめしません。というのも、冒頭で書いた通り、セキュリティ上のリスクとなると思われるものを放置することになってしまうからです。
「6.2.1 を使い続けたいが、テンプレートのショートコードのサポートを復元する必要がある場合は、この回避策を試すことができます。」では、コードをプラグイン化して挿入するという形で紹介されていますが、プラグイン化なんて分からないという方のために一応以下からダウンロードできるようにしておきます。ダウンロード後、プラグインの追加から「プラグインのアップロード」を選択してアップロードインストール&有効化してください。
WordPress6.2.2以降でこのプラグインを有効にしていると、囲みショートコードが動作しなくなります(pタグが補完されて不具合がでます)ので、6.2.2へ更新後は必ず停止・削除してください
累計ダウンロード数:68回
このプラグインは、WordPress6.2.1、Twenty Twenty-Twoテーマで動作確認したものであり、環境によっては不具合が起こるかも知れません。不具合に関して責任は負えませんので了承の上使用ください。またコードについては上記リンク先ページのものをそのまま封入していますので、コードについてお問い合わせいただいてもお答えできません
4.ひとまずバージョン6.2へ戻す
何も解決はしませんが、ひとまず今起きていることだけ無効にしたい(やり過ごしたい)場合の緊急措置です。
冒頭で書いた通り、これはセキュリティアップデートなので、特別な措置をしている場合を除き、基本的に更新を拒否することはできません。
従って以下の措置が必要になります。
- 「WP Downgrade | Specific Core Version」というプラグインを使って、バージョンを6.2へ戻す
- 自動更新が走らないように「Disable All WordPress Updates」というプラグインを使って制御する
ただ、本当にやり過ごすという方法なので、こちらもおすすめはしません。
テンプレートでショートコードが動作しなくなった理由
突然こうなるとびっくり..と言いたいところですが、諸所の開発のやり取りなど読んでいると以前からこの件は対処する予定だったようです(泣)。
以下のコアの開発ページでユーザー同士がやり取りをしていて、発言が進んでいます。
WordPress 6.2.1 ショートコード 一部のショートコードが機能しなくなりました。
テンプレート内にショートコードを直接展開するというのがセキュリティ上よろしくないということに対する対処のようですが、そもそもテーマテンプレートだけがどうして?というのがどこにも書かれていないことが混乱を招いているようです(私にもテンプレートはダメでテンプレートパーツや投稿・固定ページの本文はOKというのがなぜなのか分かりません..)。
証拠に、自身のサイトで同じ問題が発生しているなら(というかこのページを見てるのだから恐らく発生してるのでしょう)、以下のことに気づくと思います。
- 「コンテンツ」ブロック(本文のブロック)に挿入したショートコードは問題なく機能している
- テンプレートパーツに挿入したショートコードは問題なく機能している
つまり、前述した通りで、テンプレート内に直接挿入したショートコードは展開されない(動作させない)ということなのです。
— 2023年5月20日追記 —
なぜテンプレート上に直接記述したショートコードが動作しないのか?どんなセキュリティリスクがあるのかについて、以下で記述がされています(前述のやり取りの続きの中です)。
テンプレート PART でレンダリングされたショートコードがテンプレートよりも安全である理由
要約すると、ブロックテーマのテンプレートでは直接書かれているコンテンツすべてに挿入されているショートコードを実行してしまう可能性があって、例えばコメント欄などに入れたショートコードも実行されてしまう=ショートコードによってはセキュリティリスクとなる可能性があるからということのようです(個人的にはこれで納得しました..)。
上記追記部分のことがリスクとなる可能性があるということは、恐らく今後のバージョンアップで元に戻る可能性は低いのかなぁというのが至って個人的な見解です。
要は、テンプレートはその中に含まれるショートコードが実行されてはいけない場所に書かれたものまで実行されてしまう可能性があるが、テンプレートパーツはそれ自体が「テーマエディター」メニューが操作できる人(つまりはブロックテーマの編集権限のある人)でないと改変できない場所であるからということなんですね。
これは多分プラグインの設定画面やテーマのカスタマイザーを作ったことがあったり、フロントエンドの入力フォームや編集画面のカスタムフィールド保存用メタボックスを作ったことのある方なら、その画面を開くための権限を設けたり、そのフォームからの入力だけを受け付けるようにしたりしてセキュリティを保つ措置と似ていて、何となくピンとくる話ですね(こない?とすると危険なカスタマイズをしている方なのかも..)。
後述
2023年5月18日にこのサイトでもテンプレート内でショートコードを使っている部分をテンプレートパーツ化して挿入する措置を行いました。一応パーツ化したところはdiv要素で囲まれますが、div要素は特にHTML上で意味を持たない(何かの塊)ので、特に何かに影響が出るということでもないかと思います(専門家ではないので責任は持てません)。
まあ10年近くWordPressのお世話になってきて、普段の更新では「え?」となることはほとんどなかったのですが、今回はアナウンスなく(と認識しています)だったことと、たまたまその時間に他の機能を触っていたことから、何がどう影響しているのかに戸惑ってまごまごしました(泣)。
冒頭で紹介したやり取りによれば、今回の変更について、WordPressのセキュリティチーム自体(Automattic社)が関与しての措置ではなかったようなことが書かれていますが、今まで、公式の更新チーム?以外の変更が未チェックで有効になったことがあったのかなかったのかというのは定かではないですが、もしも今回のことで、チェックされずに何かの変更ができてしまうということであれば、今までの、また、これからの更新でも同様のことが起こるかもしれない、何か悪意のあるコードなどが挿入されていても気づかないなんてことがあったら..とちょっと飛躍的ですが不安がよぎりました。
コメントを残す