WordPressでJavascriptではなくPHPを使ってシンタックスハイライトを行う手順
Photo by Chris Ried on Unsplash
はじめに
シンタックスハイライトを行うライブラリとしてJavascriptのhighlight.jsが有名ですが、JavascriptではなくPHP版のhighlight.phpというものがあります。JavascriptではなくPHPだと何が嬉しいかと言うと、AMPではJavascriptが基本的に動作できないため、highlight.jsを使用することができません。そこでPHP版のhighlight.phpを使用すれば、サーバーサイドでのハイライターとして動作します。つまりJavascriptを使わない、すなわちAMP対応のページでも問題なく動作します。AMP対応のWebサイトでない場合でも、読み込むJavascriptを減らせるので表示速度の高速化が期待できます。 この記事では、WordPressでhighlight.phpを使用する手順をまとめます。
前提と環境
以下の通りです。
- PHPはインストール済とする。バージョン情報は後述
- WordPressで使用しているテーマのディレクトリにComposerがインストール済とする
- 確認したOS : Ubuntu18.04、Cloud Linux
PHPのバージョン情報は以下です。
$ php -v
PHP 7.3.3 (cli) (built: Mar 7 2019 10:02:44) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.3, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.3, Copyright (c) 1999-2018, by Zend Technologies
なお、PHPのパッケージ管理システムであるComposerを以降の手順で使用します。もしまだComposerをインストールしていない場合は、はじめにComposerをインストールする必要があります。以下にComposerのインストール手順をまとめていますので、必要な方は見てみてください。レンタルサーバのような共有環境でもインストール可能です。
PHPのパッケージ管理システムであるComposerをUbuntu、Cloud Linuxの両方に入れる機会があったのでその手順をメモします。UbuntuとCloud Linuxで手順は同じです。また、グローバル、ローカルそれぞれにインストール手順もまとめます。
Composerを使ってhighlight.phpをインストールする
ここでは、WordPressにて実際に使用しているテーマファイルのディレクトリにComposerを使ってhighlight.phpをインストールします。Composerはグローバル環境、ローカル環境のどちらにインストールされていても問題ありません。ここでは、WordPressのテーマファイルのディレクトリをmytheme
とし、mytheme/bin
にComposerがインストールされている前提で進めます。
Composerがインストールされていればhighlight.phpのインストールは簡単で、以下のコマンドを実行するだけです。
$ bin/composer require scrivo/highlight.php
Using version v9.15.6.1 for scrivo/highlight.php
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
- Installing scrivo/highlight.php (v9.15.6.1): Downloading (100%)
Writing lock file
Generating autoload files
以上でhighlight.phpのインストールは完了です。自身のテーマファイルのディレクトリにvendor
というディレクトリが作成され、そこの中にhighlight.phpがインストールされています。続いて実際にWordPressでhighlight.phpを使うための手順を説明します。
function.phpに追記する
highlight.phpをWordPressのテーマファイル内で使用するために、function.php
にいくつか追記します。
まず、Composerでインストールしたhighlight.phpを読み込むために、以下をfunction.php
に追記します。
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Highlight\Highlighter;
(...以下省略...)
また、WordPressの記事本文の中から、コード部分に相当する部分(例えば、
~
など)を探してシンタックスハイライトを適用するために以下の関数をfunction.php
に追加します。追加箇所はfunction.php
の一番最後で大丈夫です。
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Highlight\Highlighter;
(...途中省略...)
function applySyntaxHighlighting($content) {
// 以下の正規表現で、記事本文の中から<pre><code> ~ </code></pre>等を探し出す。
$pattern = '~<pre><code[^>]*>\K.*(?=</code></pre>)~Uis';
return preg_replace_callback($pattern, function ($match) {
$highlighter = new Highlighter();
// 以下でシンタックスハイライトを行いたい言語を追加しておきます。
// 以下の中からhighlight.phpが自動でハイライトルールを選択します。
$highlighter->setAutodetectLanguages([
'html',
'php',
'css',
'javascript',
'shell',
'ruby',
'java'
]);
$input = htmlspecialchars_decode($match[0]);
return $highlighter->highlightAuto($input)->value;
}, $content);
}
// WordPressのthe_content関数のフィルターとして使用する
add_filter('the_content', 'applySyntaxHighlighting', 10);
上記のapplySyntaxHighlighting
という関数は自分で定義した関数であり、WordPress記事本文の中に含まれるコード部分を検索し、ハイライト処理を行ないます。
重要なのは以下3点です。それぞれについて後述します。
$pattern
に記事本文のコード部分の検索を行うための正規表現を指定します。setAutodetectLanguages
に渡す引数にハイライトしたい言語を指定します。add_filter
でWordPressのthe_content
関数のフィルターとして登録します。
正規表現を使ってコード部分を検索する
以下の正規表現によって、
~
を検索することができます。
// <pre><code> ~ </code></pre> を検索する
$pattern = '~<pre><code[^>]*>\K.*(?=</code></pre>)~Uis';
また、もし
~
ではなく、例えば何かしらCSSのクラスを使用しているような場合は、検索がマッチするよう正規表現をそれぞれの状況に合わせて調整する必要があります。例えばこのサイトでは、~ ~
というように、
と
の間に
が入っている場合と入っていない場合の両方があります。よって、これを検索するには正規表現を以下のようにします。
/wp-content/themes/mytheme/function.php// <pre><span class="code-title">~</span><code> ~ </code></pre> のようなパターンを検索したい場合は以下 $pattern = '~<pre>(<span class="code-title">.*</span>)?<code[^>]*>\K.*(?=</code></pre>)~Uis';
ここの正規表現で正しく自身のコード相当部分を検索できないとハイライトできません。
setAutodetectLanguagesにハイライトしたい言語を指定する
以下のように、ハイライトしたい言語を事前に指定しておく必要があります。
/wp-content/themes/mytheme/function.php$highlighter->setAutodetectLanguages([ 'html', 'php', 'css', 'javascript', 'shell', 'ruby', 'java' ]);
highlight.phpでは、highlight.jsと同様に現在185言語に対応しています。対応言語は以下から確認できますので、自身の記事の中で使うであろう言語を指定しておきます。
add_filterを使ってフィルターとして登録する
WordPressでは、
the_content
という関数によって記事本文を出力することができます。そしてこの出力前後で記事本文に対して何かしらの修正を加える方法としてadd_filter
が用意されています。なお、the_content
関数は通常だと記事の出力に使われており、当然ながらthe_content
関数に対するフィルターは全ての記事に影響します。したがって、事前に思っている動作をするかをテスト環境などで確認することをおすすめします。 ここではadd_filter
の詳細は省略しますが、以下の記事が大変参考になりました。qiita.com記事本文を加工・解析したい場合は `the_content` に対してフィルターをかけます。
以上で
function.php
への追記は完了です。 なお、上記の関数については以下の記事を参考にさせて頂きました。ありがとうございました。stefanzweifel.ioSyntax Highlighting doesn't always have to be run on the client side.
ハイライト用のCSSを追加する
最後に、ハイライト用に使用するCSSスタイルを自身のWordPressテーマに追加します。highlight.phpではhighlight.jsと同じスタイルが使用でき、以下のサイトから好きなものを選択します。以下ページを開いて左側のメニューの「Styles」から好きなものをクリックしてどのような見た目になるかを確認できます。
このサイトでは
Tomorrow Night Eighties
を使用しています。使用したいスタイルが決まったら、今度は以下のページに全てのスタイルのCSSファイルが置いてあるので決めたスタイルファイルを開きます。例えば
Tomorrow Night Eighties
ならばtomorrow-night-eighties.css
を開きます。以下のような中身になっているのでこれを全てコピーします。tomorrow-night-eighties.css/* Tomorrow Night Eighties Theme */ /* Original theme - https://github.com/chriskempson/tomorrow-theme */ /* https://jmblog.github.com/color-themes-for-google-code-highlightjs */ /* Tomorrow Comment */ .hljs-comment, .hljs-quote { color: #999999; } (...途中省略...) .hljs-strong { font-weight: bold; }
あとは上記CSSを自身のテーマファイルのCSSに追記すれば完了です。もちろん、highlight用のCSSファイルをダウンロードしてインポートしてもOKです。 ちなみに、このスタイルが反映されるには、
のように
~
hljs
クラスが指定された
タグが必要です。 もしこれまでに公開済の自分の記事内のコード部分で
タグで
hljs
が指定されていない場合は、指定しない限りハイライトは有効になりません。記事が少ない場合は手作業でも良いですが、記事が多い場合は、WordPressのMySQLデータベースをエクスポートして一括置換してしまうのが一番はやいです。まとめ
AMP対応にあったってシンタックスハイライトをJavascriptを使わずに実現する方法が意外にネット上にも情報が少なかったのでメモとして残しておきます。
関連記事
- 公開日:2020/01/03 更新日:2020/01/03
WordPressのトップページで特定カテゴリを除外、限定などフィルタして表示するカスタマイズ
この記事では、投稿ページのカテゴリをフィルタして、特定のカテゴリの投稿ページを記事一覧から除外したり、逆に特定のカテゴリの投稿ページのみを記事一覧に含めるためのカスタマイズ方法をまとめます。非常に簡単です。
- 公開日:2019/05/23 更新日:2019/05/23
WordPressサイトを公式プラグインを使ってAMP対応させた結果と手順
Google Analyticsからモバイル表示の問題が深刻のため対応するようメールが届いていました。そしてその中でWordPress公式のAMPプラグイン等を使用するよう書かれていたので実際に導入してみました。この記事ではその手順をメモします。
- 公開日:2019/05/15 更新日:2019/05/15
ConoHa WINGでWordPressサイトを新しく構築する手順
WordPressサイトを構築する際に、現在は色々なレンタルサーバがあり選択肢も豊富です。今回はGMOインターネット株式会社様が提供するConoHa WINGというレンタルサーバ上にWordPressを実際に構築してみたのでその手順をまとめます。
- 公開日:2019/05/15 更新日:2019/05/15
ConoHa WINGへの移行によりサイト表示速度が劇的に改善されたのでその結果と移行手順についてのまとめ
この度このサイトをConoHa WINGに移行したところ、予想を大きく上回る改善となりました。この記事では、実際の改善結果の詳細と、他のレンタルサーバ会社様からConoHa WINGへの移行のために行った手順をまとめます。