HTMLやPHPなどのソースコードを見やすく表示するため、プラグイン:SyntaxHighlighter Evolvedを使用していますが、複数コードを載せた場合の処理が重たく感じます。そこで、軽快に動作するPrism.jsへと変更しました。結果、SyntaxHighlighter Evolvedと比較してかなり軽くなりました。
WordPressでPrism.jsをショートコードで表示するためにハマったポイントをまとめておきます。なお、Prism.jsについてはWordPressでプラグインを使わずにシンタックスハイライトがとても参考になりました。
Prism.js 読み込み設定
ソースコードは記事ページでのみ載せる予定ですので、ダウンロードしたprism.cssとprism.jsをsingle(記事)ページでのみ読み込むように設定します。
Prism.jsの使い方
例としてPrism.jsとPrism.jsプラグイン(Line Highlight、Line Numbers、Show Language)を使用した場合のWordPressテキストエディタは以下のようになります。
↑が↓と表示されます。
ただ、毎回pre
とcode
の入力。そして、<>
などを特殊文字(文字実体参照)へ変換するのは面倒なので、ショートコード化します。
Prism.jsをショートコード化する
先ほどのコードを以下のショートコードで表示できるようにします。
ショートコードの定義
ショートコードの使い方は以前に記事でまとめていますので、今回は完成したコードのみを載せておきます。
ショートコード内のソースコードに余計なタグが入る
先ほどのコードでは、[prism][/prism]内のソースコードに余計な<p></p>
と<br />
が入り、意図するように表示されません。
WordPressには<p></p>
と<br />
を付加するwpautop
という関数があり、デフォルトで記事本文に適用されているようです。ですが、本来であればwpautop
は<pre>...</pre>
タグをスルーするはずです。
調べてみたところ、原因は記事本文を取得表示する関数the_content
に登録されているフィルターの優先順位にありました。ショートコードを展開するdo_shortcode
よりも先にwpautop
を実行するように優先順位が設定されてあります。
ですので、wpautop
実行の時点では、[prism][/prism]は単なる文字列として扱われます。当然、<pre>
では無いので、[prism][/prism]内の文字列(ソースコード)にwpautop
が適用されます。
原因がわかったのでwpautop
よりも先に[prism][/prism]を展開させます。
指定のショートコードをwpautopよりも先に展開させる
the_content
をフックして実現させます。the_content
の第3引数の数値(優先順位)にwpautop
よりも少ない数値(10未満)を設定し、指定のショートコードを先に展開させます。
以上で意図した動作と表示になりました。
エディタのクイックボタンにprismを追加する
さて、ショートコード化したことでタグ入力よりも簡素になったとは言え、長いショートコードを自分で打つのも同じように面倒です。そこで、prism ショートコードの挿入をエディタのクイックボタンに追加します。
prismボタンが追加されました。クイックボタンをクリックすると…
が挿入されます。以上で完成です。
追記: ショートコードが展開されない時がある
ショートコードがうまく展開されないときがあり、閉じタグが文字列のまま出力されてしまうときがありましたが、ショートコードの展開よりも先にエスケープ処理をすることで対処できました。