プログラム書けるわけではないので、初歩的なエラーを繰り返しながら自作のPHPプログラムを作っていたのですが、プログラムにミスはないのにエラーが出るという厄介な問題に出くわしました。
WordPressのfunction.phpに外部PHPファイルを読み込む関数を作って、その関数のショートコードを固定ページに書いて自作の外部PHPファイルを読み込んでます。
自作PHPはテスト用のサイトで簡単な動作をしてから、本番用とテスト用に分けた方がいいかと思い、ディレクトリの名前を変えてコピー。
本番用のこのブログに実装して(まだ非公開)、それからテスト用サイトもショートコードのパスを変更して固定ページの記事を保存。
しかし、「保存できませんでした」とエラー。更新ボタンが無反応だったのでブラウザ更新。
そしたら、PHPのエラーメッセージ「Fatal error: Cannot redeclare…」と「サイトに重大なエラーがありました。 詳細については、サイト管理者のメール受信ボックスを確認してください。」が出て、固定ページの編集画面に入れません。
PHPエラーの内容から、同じファイルを2回読み込んでいるか、2重に定義された同じ関数を実行しているの原因のよう。
本番用からテスト用にPHPファイルをコピーしたときにショートコードのパスを変更したのが関係して、同じソースのファイルも2つ存在していて、現在のリビジョンと過去リビジョンの影響が原因。
環境
- サーバー:さくらインターネット共有サーバー
- WordPress:5.4.1
- テーマ:Cocoon
テストサイトなので、WordPressクイックインストール後に、追加でテーマのCocoonしかインストールしていません。
同じ関数を2回読み込んでいた
「Fatal error: Cannot redeclare」のエラーは、同じファイルを2回読み込んだり、同じ関数を2回読み込むと出るエラー。
自作PHPも、表示と処理でファイル分けてるし本番用とテスト用ファイル作った時のファイルのパス間違えたかなあってソース確認しても問題なし。
編集画面は「サイトに重大なエラーがありました。 詳細については、サイト管理者のメール受信ボックスを確認してください。」と出て入れないが、表示は出来る。
PHPコードにミスがあれば、編集ページも表示ページも「サイトに重大なエラー…」のメッセージが表示されるんですけどね。
PHPエラー文をよく見ると、「previously declared in…」のエラーと、それを示すPHPファイルの何行目のエラー。
該当するPHPファイルが2つと、エラーが出てる関数名も書いてある。
「../hog/control.php」
「../hoge_test/control.php」
外部PHPファイルは表示と処理で分けていて、表示ファイルで処理ファイルをインクルードしてる。
なので、表示ファイルの「view.php」に書いてあるパスが間違いかと思いソースを確認するも「hoge_test」になっていて合ってる。
さらに、エラー文の「previously declared in」でググってみると、WordPress環境でのエラーを解説してるサイトが出てきた。
2重に定義されている関数の一方を削除する
WordPress ワードプレスのエラー解説:Fatal error: Cannot redeclare X previously declared in Y
やっはり、同じ関数を2回読んでいる原因が高いようだ。
ただ、ソースを追っかけても関数の2重定義してるような場所が無い。エラー文に問題となっている関数名も表示されているが、その関数は1つしか書かれていないし実行も1つしかしていない。
2重に定義されている関数エラーはリビジョンが関係?
少し考えて今までの作業で出たエラーを対処した時を思い出した。
外部ファイルのPHPのエラーになる状態で、固定ページの内容編集して保存すると「保存できません」ってメッセージが表示され、ブラウザを更新すると「サイトに技術的な問題が発生しています」が出て編集画面が表示されないことを。
ひょっとしたら編集画面で記事更新の際に、ショートコードで読み込んでる外部PHPをエラーチェックか何かでWordPress内部で実行しているのかもしれない・・・
それがもし、編集前の古いリビジョンも実行していたら、外部PHPのパスを変更したのが影響して2つの”同じ”PHPファイルを読み込んでいるかもしれない。
テーマエディタでThemeのCSSやPHPファイルを編集して保存するときも内部でエラーチェックしているようだし何か関係あるのかもしれない。
プラグイン「WP-Optimize」で過去リビジョン削除してみた
WP-Optimizeで過去のリビジョンを削除した。
再び、問題のある固定ページの編集画面にアクセス。
今度は問題なく表示された。
外部PHPを読み込むショートコードのパス変更で
- 過去のリビジョンで「/hog/control.php」
- 現在のリビジョンで「/hoge_test/control.php」
この2つの同じファイルを読み込んでたのが影響だったとは。
WP自作プログラムは過去のリビジョンが影響することも
どうやら、WordPressの記事編集画面はショートコードなどのプログラムを内部で実行しているらしいです。
普通はショートコードの記載ミスなどの場合はプレビューで表示が乱れるだけだと思いますが、自作の外部PHPを読み込んで、その自作PHPにエラーが出てたら「サイトに技術的な問題が発生しています」になりやすいのだと思います。
その関係から、外部PHPのパス名を変えて、変更前と変更後が同じソースで、2つともファイルが存在していたら、過去リビジョンと現リビジョンの影響で、二重に定義された関数のエラーになるのかなと。
自作PHPファイル単独で動かすと多分問題は起きないので、WordPress固有の問題かと思います。