PHPのバージョンを7系にしてWordPress管理ページの表示が崩れた原因

このブログはまだPHP5で動かしていますが、自宅のPCにPHP7とWordPressの4.6を新規インストールして動かしたら管理画面の表示が崩れました。スタイルシートを読み込めてないようですが、原因はwp-include/plugin.php の 600行目でした。

ちなみに32Bit版 Linux Mint 18で次のようにして入れた PHP です。関係ないと思いますが、WebサーバーはH2Oでhttpsにしています。

sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install php7.1-fpm php7.1-cgi php7.1-mbstring php7.1-mysql php7.1-xml php7.1-xmlrpc php7.1-xsl php7.1-zip php7.1-bz2 

wp-include/plugin.php の 600行目は次のようになっています。

do {
        foreach ( (array) current($wp_filter[$tag]) as $the_ )
                if ( !is_null($the_['function']) )
                        call_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args']));

} while ( next($wp_filter[$tag]) !== false );

この call_user_func_array が原因でした。上の部分を次のとおりに変えたら直りました。

do {
        foreach ( (array) current($wp_filter[$tag]) as $the_ )
                if ( !is_null($the_['function']) ){
                        $arr = array();
                        foreach(array_slice($args, 0, $the_['accepted_args']) as $a){
                            $arr[] = &$a;
                        }
                        call_user_func_array($the_['function'], $arr);
                }

} while ( next($wp_filter[$tag]) !== false );

PHP の関数 call_user_func_array へ渡す値が参照渡しになっていなかった事が原因です。上の改変箇所ではその値が参照渡しになるように変えています。

参考サイト PHP 5.3: 参照渡しの関数/メソッドを定義してた人は call_user_func_array に注意 – 肉とビールとパンケーキ by @sotarok

ただし、WordPress のバージョンをアップデートすると上書きされて元に戻ってしまうと思います。

プラグインを作る場合、この関数自体にはフックがないので、この関数を呼び出している元の関数にフックする必要がありそうです。

コメントを残す

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