PHPををバージョンアップしたらWordPressがエラーで動かなくなったんだが

Filed in 未分類

このブログはWordPressで動いている。で、WordPressのバージョンアップを久しぶりに行ったところ、ヘルスチェックなるものにPHPが古いから新しくしろというメッセージが出ていた。

ああそうですか、と思い調べたらバージョン5.6を使っておりサポートも終了していた。そりゃダメねと軽い気持ちでバージョンアップをしてからWordPressにアクセスすると「致命的なエラー」などといままで見たことのないメッセージだけが画面に表示されてコンテンツが全く見られない。

再起動しても回復はしない。いつもならスナップショットを取ってから作業するのだが、今回に限ってサボってしまったせいで結構焦ってしまった。

いや、こんな時こそ落ち着かねばと小一時間ほど放置してからログを調べた。

問題点1.

/var/log/httpd/error.logには「PHP Fatal error:Array and string offset access syntax with curly braces is no longer supported」と記録されていた。

Syntax エラーだと。。そんな馬鹿な。。内容は書いてある通りだが、調べてみるとPHPの配列アクセスに{}が使えなくなったとのこと。使っているWordPressのプラグインに{}を使った配列アクセスがあったようだった。幸いエラーが発生した1か所だけ修正するとこのエラーは消えた。

問題点2.

これだけで問題は終わらなかった。

次なるエラーは「PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function~」

調べてみるとWordPressのバージョンアップで置き換わった関数の引数が変わったようで、使っているテーマから渡されている引数の数が少なくてエラーになっているということであった。こんなの直すのしんどいよ。。ということで同じテーマの最新版がGitHubで配布されていたので入手してディレクトリごと置き換えた。これでこの問題は解決して投稿記事を見られる状態にはなった。

問題点3.

だが、それでも問題は終わらなかった。管理用サイトにアクセスするとやはり致命的なエラーが起きた。これは管理用サイトで使っていたプラグインがエラーを起こしていた。Search Regexというプラグインだ。どうやらPHPで静的に宣言されていない関数を静的関数のように呼ぶとエラーになるように厳格にチェックされるようになったようだ。こちらは問題2と違って最新版でも修正されていないという情報を見たのでプラグインそのものを削除して対応した。

こうして何だかんだで復活したのでついでに書き込みしてみた次第であったが、普段PHPを使っていないのでこんなに変更があったのを知らなかった。PHPのシステムを保守している人たちには衝撃だったんだろうなあ。

と書き終えたところで、左上のCount Per Dayの見出しと数字が逆になっていることに気づいた。そのうち直したい。

P.S.

直しましたよっと。でもなんかスタイルシートが読めてない。これまたそのうち直したい。

# pwd
/var/www/html/blog/wp-content/plugins/count-per-day

# diff counter.php.bk counter.php
1446a1447
>                                               echo __($instance[$k.'_name']).':';
1454c1455
<                                               echo '</span>'.__($instance[$k.'_name']).':</li>';
---
>                                               echo '</span></li>';

修正前

                                        if ( ($k == 'show' && is_singular()) || $k != 'show' )
                                        {
                                                $f = str_replace( $this->funcs, $this->cpd_funcs, $k );
                                                echo '<li class="cpd-l">';
                                                echo '<span id="cpd_number_'.$k.'" class="cpd-r">';
                                                // parameters only for special functions
                                                if ( $f == 'getUserPerDay' )
                                                        echo $count_per_day->getUserPerDay($count_per_day->options['dashboard_last_days']);
                                                else if ( $f == 'show' )
                                                        echo $count_per_day->show('', '', false, false);
                                                else
                                                        echo call_user_func( array(&$count_per_day, $f) );
                                                echo '</span>'.__($instance[$k.'_name']).':</li>';
                                        }

修正後

                                        if ( ($k == 'show' && is_singular()) || $k != 'show' )
                                        {
                                                $f = str_replace( $this->funcs, $this->cpd_funcs, $k );
                                                echo '<li class="cpd-l">';
                                                echo '<span id="cpd_number_'.$k.'" class="cpd-r">';
                                                echo __($instance[$k.'_name']).':';
                                                // parameters only for special functions
                                                if ( $f == 'getUserPerDay' )
                                                        echo $count_per_day->getUserPerDay($count_per_day->options['dashboard_last_days']);
                                                else if ( $f == 'show' )
                                                        echo $count_per_day->show('', '', false, false);
                                                else
                                                        echo call_user_func( array(&$count_per_day, $f) );
                                                echo '</span></li>';
                                        }

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)