普段使っているエックスサーバーでPHPを5.6から7.1にアップグレードしたところ、運営しているいくつかのサイトにエラーが出てしまいました。
古いプラグインのコードに問題があったのですが、多く使われているプラグインだと思うので解決策をメモしておきます。
サクッと読める目次
Revolution Sliderで発生したエラーと解決策
有料テーマの中に一緒に入っていたRevolution Sliderバージョン4.6がエラーを出していました。
最新版は5.3なのですが、テーマと一緒に頒布されているプラグインは新しいものに更新ができないため、直すしかないようです。
PHP Fatal error: Uncaught Error: [] operator not supported for strings というエラーとその理由
PHPのバージョン更新後、ワードプレスの管理画面に入ろうとすると、このエラーが出てしまい管理画面にすらアクセスができなくなっていました。
PHP7.0までは以下のように空文字で配列を初期化できたのですが、
$myarray = "";
$myarray [] = $myobject; // PHP7.1ではここでエラー発生
PHP7.1からは下記のように配列を初期化しないといけないようです。
$myarray = array();
$myarray [] = $myobject;
Revolution Sliderのファイル変更
対象ファイル:/wp-content/plugins/revslider/inc_php/framework/base_admin.class.php 23行目
表示されているエラーから場所はすぐに分かりました。
ここにある$arrMetaBoxesという配列画から文字で初期化されているため、代入時にエラーとなっていました。
なので、array()で初期化をするようになり、解決。
他にもエラーが出てくるかなと思いましたが、ここ1箇所の修正で問題なく動いています。
qtranslate-xで発生したエラーと解決策
qtranslate-xは多言語化サイトを作るときにとても便利なプラグインで、2年前に開発が止まっていますが今も使い続けています。
今回PHP7.1にアップデートした際にエラーが出たのですが、まだまだ使い続けられそうです。
Warning: Parameter 2 to qtranxf_postsFilter() expected to be a reference, value givenというエラーとその理由
qtranxf_postsFilter()というqtranslate-xの関数には参照渡しを行わなければいけないところに値が渡されたとエラーがでています。
この関数は/wp-includesclass-wp-hook.phpのcall_user_func_array()から呼び出されるのですが、ここでは値で渡しています。
qtranslate-xのファイル変更
ワードプレスのフォーラムに解決策がありました。こうやって解決策が見つかると、多くの方が使っているプラグインで本当に良かったと思います。
/wp-content/plugins/qtranslate-x/qtranslate_frontend.phpで、下記の2箇所を
//523行目
function qtranxf_postsFilter($posts,&$query) {//WP_Query
//597行目
function qtranxf_excludeUntranslatedPosts($where,&$query) {//WP_Query
下記のように変更します
//523行目
function qtranxf_postsFilter($posts,$query) {//WP_Query
//597行目
function qtranxf_excludeUntranslatedPosts($where,$query) {//WP_Query
関数自体を参照渡しではなく値渡しにすることで正しく動くようです。
参考:Topic: Problem with PHP 7.1 | WordPress.org
まとめ
PHPのバージョンアップで性能が上がったり、信頼性が増えるのですが、やはりこういうエラーはいくつか出るものですね。
今回も、特にバージョンアップの必要性がなかったのでずっとPHP5.6で運用していたのですが、急遽PHP7.0以降が必要なアプリを入れることになり、バージョンアップを行いました。
ワードプレスは便利なのですが、無料のオープンソースなのでこのあたりは専門業者にお願いするか、自分で解決しないといけないですね。