【WordPress】CrayonSyntaxHighlighterがPHP7.1以降で使えなくなった時の対処方法【Luxeritas】

2019年8月8日

今回はすごい限定的ですがPHP7.2・WordPress5.2・Luxeritas・CrayonSyntaxHighlighterという環境で以下のエラーが発生し、新しい記事や記事の更新ができなくなるバグの対処方法を紹介します。

Warning: Missing argument 3 for {closure}(), called in /home/xxx/program-life.com/public_html/wp-includes/class-wp-hook.php on line 286 and defined in /home/xxx/program-life.com/public_html/wp-content/themes/luxeritas/inc/admin-comments.php on line 46

1. エラーが起きたWordPressの環境

PHP:7.2
WorrdPess:5.2
Luxeritas(WordPessのテーマ):3.6.10
Luxeritasの子テーマ:3.0.0
CrayonSyntaxHighlighter(WordPressのプラグイン):2.8.4

今回は上記のバージョンで試したところエラーが起きました。

2. CrayonSyntaxHighlighterのバージョンあげる

https://github.com/Crunchify/crayon-syntax-highlighter/releases

CrayonSyntaxHighlighterは3年以上も開発がストップしているのですが、有志の方がGitにPHP7.3まで対応した修正版をアップしてくれています。

まずはGitからSource code (zip)をダウンロードします。

次にダウンロードしたcrayon-syntax-highlighter-2.8.6.zipを解凍します。

最後に解凍したプライグインcrayon-syntax-highlighterをFTPを使用して上書きします。
ワードプレスのwp-content/plugins/crayon-syntax-highlighterが上書きすべきプラグインのpathになります。

3. Luxeritas(ルクセリタス)のadmin-comments.phpを修正する

次にLuxeritas(ルクセリタス)のadmin-comments.phpを修正します。
もう一度エラーをよく見ると

Missing argument 3 for {closure}()

というエラーが出ていることがわかります。
こちらのエラーは引数3つ目がありませんという意味です。

エラーがわかったところでadmin-comments.phpの46行目をみると

add_filter( 'get_comment_text', function( $comment_content, $comment, $args ) {
	return thk_admin_comments( $comment_content, $comment );
}, 10, 3 );

add_filterには引数が2つあります。さらに2つ目はfunctionとなっていることがわかります。
先ほどのエラーでは{closure}()と書いてあるので恐らくfunction( $comment_content, $comment, $args )の3つめの引数がないためエラーとなっているということがわかりました。

/*
add_filter( 'get_comment_text', function( $comment_content, $comment, $args ) {
	return thk_admin_comments( $comment_content, $comment );
}, 10, 3 );
*/
add_filter( 'get_comment_text', function( $comment_content, $comment ) {
	return thk_admin_comments( $comment_content, $comment );
}, 10, 3 );

そこでfunction( $comment_content, $comment, $args )の3つめの引数$argsを消してadmin-comments.phpを更新しました。念の為もどせるように前の記述は全文残しておきます。

この状態で新しくしたadmin-comments.phpをFTPを使ってwp-content/themes/luxeritas/inc/admin-comments.phpに上書き保存します。

以上で私の開発環境ではCrayonSyntaxHighlighterを継続して使うことができました!

4. まとめ

PHPのバージョンを7.0やLuxeritasを2.x系にダウングレードしたり、CrayonSyntaxHighlighterをオフにしたりするとエラーはなくなるのですが、どうしても全てのバージョンを最新の状態にしてCrayonSyntaxHighlighterを使いたかったのでがんばりました。

ちなみに、CrayonSyntaxHighlighterを使わず

テーマ:Luxeritas3.6で使えるシンタックスハイライターの機能や、代わりとなるプラグインPrism For WPやSyntax Highlighter EVolvedやjs+cssでシンタックスハイライトの機能を使えるようにするprism.jsやhighlight.jsも試しましたが、色々な言語を綺麗に色分けできて、なおかつ行数やコピーなどかゆいところにまで手が届くのはやっぱりCrayonSyntaxHighlighterだけだった印象です。

ちなみに、以下のようなエラーが出た場合も同じ対処法でエラーを解決することができます。

Fatal error: Uncaught ArgumentCountError: Too few arguments to function {closure}(), 2 passed in /home/cls/program-life.com/public_html/wp-includes/class-wp-hook.php on line 286 and exactly 3 expected in /home/cls/program-life.com/public_html/wp-content/themes/luxeritas/inc/admin-comments.php:46 Stack trace: #0 /home/cls/program-life.com/public_html/wp-includes/class-wp-hook.php(286): {closure}('[…] \xE3\x81\x93\xE3\x81…', Object(WP_Comment)) #1 /home/cls/program-life.com/public_html/wp-includes/plugin.php(208): WP_Hook->apply_filters('[…] \xE3\x81\x93\xE3\x81…', Array) #2 /home/cls/program-life.com/public_html/wp-content/plugins/crayon-syntax-highlighter/crayon_wp.class.php(1097): apply_filters('get_comment_tex…', '[…] \xE3\x81\x93\xE3\x81…', Object(WP_Comment)) #3 /home/cls/program-life.com/public_html/wp-content/plugins/crayon-syntax-highlighter/crayon_wp.class.php(1070): CrayonWP::scan_comment(Object(WP_Comment), 13) #4 /home/cls/program-life.com/public_html/wp-content/plugins/crayon-syntax-h in /home/cls/program-life.com/public_html/wp-content/themes/luxeritas/inc/admin-comments.php on line 46