エックスサーバーから「PHP 8.0 導入のお知らせ」という連絡がきました。そこでさっそく8.0に変更♪といきたいところですが、かつてこんなことがありました。
PHP 7.4にバージョンアップしたら大変なことに Crayon Syntax Highlighter
そこで実験で作成しているどうでもいいサイトで実験。
やはり問題が発生しました。
create_function関数は不可
ひとつめはワードプレステーマのfunctions.php。
ウィジェットを、’widgets_init’ フックを使用してで登録しているのですが、古いテーマはこのように書かれています。これまではこれでも問題なかったのですが、8.0ではダメなようです。create_functionは使用不可となりました。
1 2 3 |
add_action('widgets_init', create_function('', 'return register_widget("My_Widget");') ); |
この部分は以下のように書き換えます。
1 2 3 |
add_action( 'widgets_init', function(){ register_widget( 'My_Widget' ); }); |
プラグイン Crayon Syntax Highlighterについて
もうひとつはプラグイン Crayon Syntax Highlighterです。(ワードプレスがインストールされているディレクトリ)/wp-content/plugins/crayon-syntax-highlighter/util/crayon_util.class.phpにこのような部分があります。
1 |
$lines = implode($lines, $delimiter); |
implode関数は配列要素を文字列により連結するためのものです。第一引数がseparatorで第二引数がarrayです。これまでは逆でもよかったのですが、8.0ではサポートされなくなりました。
1 2 |
// 引数を逆にする $lines = implode($delimiter, $lines); |
これで解決できます。
では、よきワードプレスライフを。
追記
じつはまだありました。コードを書いているページをひとつだけ調べて問題ないと思っていたら別のページでエラーが発生していました(こういうのが一番やっかい)。
1 2 3 4 5 6 7 8 9 10 11 |
// Retrieve by element name or set by CrayonElement function element($name, $element = NULL) { if (is_string($name)) { $name = trim(strtoupper($name)); if (array_key_exists($name, $this->elements) && $element === NULL) { return $this->elements[$name]; } else if (@get_class($element) == CRAYON_ELEMENT_CLASS) { // ここでエラーがでる $this->elements[$name] = $element; } } } |
エラーの原因はget_class。これはオブジェクトのクラス名を返す関数ですが、明示的に null を渡すことは、 許されなくなりました。そこでelement関数の第二引数でNULLが渡されたり、省略された場合はget_class($element)ではなくget_class()としなければなりません。
以下のようにすれば解決です。
1 2 3 4 5 6 7 8 9 10 11 12 |
function element($name, $element = NULL) { if (is_string($name)) { $name = trim(strtoupper($name)); if (array_key_exists($name, $this->elements) && $element === NULL) { return $this->elements[$name]; } else if ($element !== NULL && @get_class($element) == CRAYON_ELEMENT_CLASS) { $this->elements[$name] = $element; } else if (@get_class() == CRAYON_ELEMENT_CLASS) { // $element === NULLなら引数は渡さない $this->elements[$name] = $element; } } } |
他にも気づかないところでエラーがでているかもしれません。見つけたら連絡をください。