Fatal error: Cannot redeclareの解決

自作のInstagramのフィード表示をショートコードで導入後、プレビュー画面から「編集」画面に進むと、「Fatal error:」が表示されて全く編集できなくなりました。重大なエラーって表示されて、めちゃくちゃ恐ろしい・・・。

とにかく、公開してしまっているメインのページだったので、編集できなくて困るということで、一旦無理やりデータベース上から怪しい記載を削除しました。レンタルサーバー上の、管理ツール(phpMyAdmin)から直接データを編集しました。投稿記事のID(post=●● の数字)はエラーになっている記事ページのURLから確認できます。

問題箇所を特定する

デフォルトでは「重大なエラーがありました」としか表示されないので、WordPressのデバックモードをONにします。wp-configのdefine( ‘WP_DEBUG’, fales );という記載があるので、trueに変更するだけです。

参考:「サイトに重大なエラーがありました」の回避方法

表示されているエラー(Cannot redeclare 自作の関数名と表示されていた)からすると、ショートコードで呼び出したphp(showfeed.php)の中の自作関数が、重複して定義されているとのこと。一回しか定義してないのになんでや・・・と悩みまくりましたが、なんらかの加減で、showfeed.phpのコードが複数回呼び出されている様子。

参考:【PHP】Fatal error: Cannot redeclare f() エラーの原因と対処(複数)

対策する

今回、ショートコードで呼び出したphp(showfeed.php)から、さらにincludeで別のphp(get-json.php)を呼び出す構成にしていたため、includeをinclude_onceにして、1度しか読まないように変更。include_onceするphpファイルの中身には、関数のみの記載に変更しました。変数の定義と関数の実行は、showfeed.phpに移動しました。

なんとか通常通り表示できるようになりました!修正後、デバックモードをOFFにするのを忘れないようにしましょう。

日時の操作について調べる

現在から1ヶ月後の日付を表示するコードを記載してみる。

参考:日付間隔関数(DateInterval)を使って簡単且つ、正確に日付の足し算、引き算をする https://notepad-blog.com/content/154/

参考:DateTime クラスのまとめメモ https://qiita.com/re-24/items/c3ed814f2e1ee0f8e811

$interval = new DateInterval('P1M');//1ヶ月
$currentDate = new DateTime();//現在時刻

echo '<p>現在から1ヶ月後: ' .$currentDate->add($interval)->format('U = Y-m-d H:i:s') . "\n".'</p>'; 

DateTimeクラスについて、簡単に日付の足し算、引き算、比較的なことができて便利なんだけど初心者にはなかなかわかりづらくて、普通にechoで出力できないし、var_dumpで出力すると訳分からん配列が表示される。人がわかるように出力するときは、formatを絶対使う必要あり。

※「->」で処理を複数連続してできるのも便利だなぁ。(あんまりよくわかってないので、また詳しく調べたいと思う。)

固定期間の加算、減算であればmodifyの方がわかりやすいかも。違いはまた調べたい。

参考:https://php.programmer-reference.com/php-datetime-modify/

$currentDate = new DateTime();//現在時刻

echo '<p>現在の1ヶ月前: ' .$currentDate->modify('-1 month')->format('U = Y-m-d H:i:s') . "\n".'</p>';