WordPress(4.5.2)が少しでも速くなるなら、噂の高速php7.0にしてみました。今までは、デフォルトのphp5.3(おそらくです。5.6にはアップデートしていないはず。)でした。OSはCentOS6.7(Final)です。ちなみにx86(32bit)です。
サーバ機は超非力で、CPU:Intel(R) Celeron(R) D CPU 3.20GHz、Mem:2GB でございます。こいつで、apacheのバーチャルホストを動かしております。めちゃくちゃ遅いです。(メールサーバも兼用、Sendmail)。。。サーバ機をグレードアップするときは、Nginxにする予定です。でも、がんばってくれているので感謝です。
WordPressの編集画面で、更新をかけると軽く5,6秒は待たされます。
だから、速くなった実感はあまりありません。(残念)
それより、何より、お決まりの「警告!」つまり”Notice”と”Warning”がでまくっておりまして、なんとかバタバタと対応しました。
【前提条件】
- サーバ機は正常に動作している。(ApacheもWordPressも)
- php7.0はインストール済み
<手順>
- wp-config.phpの編集
- バックアップ
- google先生にお尋ねする・修正・確認
1.wp-config.phpの編集
(1)wp-config.phpのダウンロード
私は、WinSCPを利用して、ローカルにダウンローそしました。もちろん、FTPツールでもOKです。
(2)デバッグモードを有効
ダウンロードしたwp-config.phpをテキストエディター(私は、Ubuntuなのでgeditですが、Windowsならメモ帳?より、Terapadのような文字コードや改行コードを変更できるものがよろしいかも?まぁ、各自お気に入りのものを利用してください。)で開き、下記の部分を修正・保存します。
#define('WP_DEBUG', false);
define('WP_DEBUG', true);
一応、#で、元のコードをコメントアウトします。その下に、falseをtrueとしたコードを新たに追記します。
(2)アップロード
保存後、wp-config.phpをアップロードします。
ちなみに、私は、セキュリティ上、wp-confing.phpのパーミッションを440にしているので、アップロードする前にサーバ側のwp-config.phpのパーミッションを640に変更し、アップロード後は440に戻します。そして、すべての作業が終了しても、再び、wp-config.phpのデバッグモードを無効化はせずに、有効化のまま運用します。すぐに警告に対処するためです。もし、対処まで時間がかかりそうなら、そのとき無効化します。
だから、php7.0にバージョンアップしたとき、すぐに警告に気づきました。
2.バックアップ
お決まりです、コードを修正するので、もし、しくじった場合のことを考えて、すぐに復元できるようにバックアップを取っておきます。
実際の作業は、バックアップとは別の作業用ディレクトリに、サーバ機から修正が必要なファイルだけをダウンロードして行います。バックアップしたファイルは変更しません。
今回は、警告の内容からwp-content/pluginとwp-content/themesのみをバックアップすればよいのですが、念の為にwpディレクトリ配下すべてをバックアップしました。ものすごく時間がかかります。約1時間は必要でした。保存しているデータ量によります。
バックアップと言っても、単に、WinSCPでサーバ機に接続し、ローカルに全データをコピーするだけです。その後、保存先のディレクトリの名前を変更しておきます。例えばpcshigizemi-20160520みたいにです。
3.google先生にお尋ねする・修正・確認
今回表示されていた警告は下記の通りです。
Notice: Only variables should be passed by reference in /usr/local/shigi/shigidtpc/wp-content/plugins/slayers-custom-widgets/slayer_Custom_Widgets.php on line 51
Warning: Declaration of description_walker::start_el(&$output, $item, $depth, $args) should be compatible with Walker_Nav_Menu::start_el(&$output, $item, $depth = 0, $args = Array, $id = 0) in /usr/local/shigi/shigidtpc/wp-content/themes/pcshigizemi/functions.php on line 0
Notice: get_currentuserinfo の使用はバージョン 4.5 から非推奨になっています! 代わりに wp_get_current_user() を使ってください。 in /usr/local/shigi/shigidtpc/wp-includes/functions.php on line 3658
(1)「Only variables should be passed by reference
」で検索
Notice: Only variables should be passed by reference in /usr/local/shigi/shigidtpc/wp-content/plugins/slayers-custom-widgets/slayer_Custom_Widgets.php on line 51
への対処です。
slayer_Custom_Widgets.phpを開き、51行目を確認します。次のようにコーディングされていました。
'dir'=> array_pop(explode("/", str_replace("\\", "/", dirname(__FILE__)))),
google先生の検索結果によると、array_pop ( array &$array )のような、参照渡しを要求するメソッドには、直接、値を引数として渡してはいけないようです。(php5.4以降。関数を定義するときに、引数を値渡しにするか、参照渡しにするかを宣言するようです。定義されている引数を見ると&$arrayと参照渡しを意味する&が付いてますね。参照渡しの場合は、引数には変数を渡す必要があります。すなわち変数のメモリ番地・メモリ領域を引数に渡すことになりますね。)
つまり、
array_pop(explode("/", str_replace("\\", "/", dirname(__FILE__))))
を、
$explode_txt = explode("/", str_replace("\\", "/", dirname(__FILE__)))
array_pop($explode_txt)
とするとうまく回避できました。というか、これが正しいコーディングのようです。
実際には、下記のように修正しました。
//mod-start-20160520
$explode_txt = explode("/", str_replace("\\", "/", dirname(__FILE__)));
//mod-end-20160520
$this->info = array(
'admin_url' => '?page=' . (!empty($_GET['page']) ? $_GET['page'] : false),
'dir' => array_pop($explode_txt), //mod-20160520
'posts_per_page' => 10,
'blank' => array(
'posts' => array(),
'pages' => array(),
'categories' => array(),
'tags' => array(),
'authors' => array(),
'opts' => array()
)
);
アップロードして、確認し、エラー表示が消えていたらOKです。消えていない場合は、修正箇所を見直します。ほとんどの場合、なにがしかのエラーメッセージが出ているのでそれを参考に修正します。私の場合一番多いのがスペルミスとカッコ類のつけ忘れ等です。
(2)「Declaration of description_walker::start_el(&$output, $item, $depth, $args)」の修正
Warning: Declaration of description_walker::start_el(&$output, $item, $depth, $args) should be compatible with Walker_Nav_Menu::start_el(&$output, $item, $depth = 0, $args = Array, $id = 0) in /usr/local/shigi/shigidtpc/wp-content/themes/pcshigizemi/functions.php on line 0
への対処です。(警告では、一部の引数の初期化と追加をうながしています。)
/themes/pcshigizemi/functions.phpのline 0(0行目)となっていますが、実際は、0行目は存在しません。そこで、ファイル内を、start_eで検索すると
/*-------------------------------------------*/
/* ナビゲーションメニューの英語併記
/*-------------------------------------------*/
class description_walker extends Walker_Nav_Menu {
function start_el(&$output, $item, $depth, $args) {
global $wp_query;
$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
がヒットしました。さっそく、指示通りに引数を修正します。
/*-------------------------------------------*/
/* ナビゲーションメニューの英語併記
/*-------------------------------------------*/
class description_walker extends Walker_Nav_Menu {
//mod-20160518 function start_el(&$output, $item, $depth, $args) {
function start_el(&$output, $item, $depth = 0, $args = Array, $id = 0) {
global $wp_query;
$indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
上書き保存をして、アップします。確認してみます。
Parse error: syntax error, unexpected ',', expecting '(' in /usr/local/shigi/shigidtpc/wp-content/themes/pcshigizemi/functions.php on line 537
残念。537行目でエラーが発生しています。つまり、さっき修正した箇所です。エラーメッセージの内容は、「’,(コンマ)’ではなく'((カッコ)’がいいちゃない。」みたいな意味です。よく見てみると、
$args = Array, は、配列のはずなので、初期化するならArray(), が一般的でしょう。そこで、次のように修正します。
function start_el(&$output, $item, $depth = 0, $args = Array(), $id = 0) {
保存後、アップして確認します。エラーは消えました。
(3)「get_currentuserinfo()」の修正(図2の修正)
Notice: get_currentuserinfo の使用はバージョン 4.5 から非推奨になっています! 代わりに wp_get_current_user() を使ってください。 in /usr/local/shigi/shigidtpc/wp-includes/functions.php on line 3658
警告の通りですね。「get_currentuserinfo()」を「wp_get_current_user()」に変更すればよろしいようです。
さっそく、/wp-includes/functions.phpの3658行目を見ると、
trigger_error( sprintf( __('%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.'), $function, $version, $replacement ) );
となっていて、どこにもget_crrentuserinfo()は見当たりません。これは、実際にエラーメッセージを発しているメソッドを示しているようです。
そこで、wp/配下のすべてのファイルでget_crrentuserinfo()を含む行をgrepしてみます。
wp/ディレクトリに移動して、下記コマンドを実行します。結果が返るまで数十分待ちます。
$ grep -irn get_currentuserinfo *
plugins/duplicate-post/duplicate-post-admin.php:195: } else if (function_exists('get_currentuserinfo')) {
plugins/duplicate-post/duplicate-post-admin.php:197: get_currentuserinfo();
plugins/captcha/bws_menu/bws_functions.php:189: get_currentuserinfo();
plugins/captcha/bws_menu/bws_functions.php:779: get_currentuserinfo();
plugins/captcha/bws_menu/bws_functions.php:795: get_currentuserinfo();
plugins/download-manager/wpdm-start-download.php:12://get_currentuserinfo();
plugins/download-manager/wpdm-functions.php:96: //get_currentuserinfo();
plugins/download-manager/wpdm-functions.php:375: //get_currentuserinfo();
plugins/download-manager/readme.txt:147:* Removed function `get_currentuserinfo`
plugins/download-manager/libs/class.Package.php:479: //get_currentuserinfo();
plugins/download-manager/libs/class.Apply.php:305: //get_currentuserinfo();
themes/pcshigizemi/front-page.php:42:get_currentuserinfo(); ?>
themes/pcshigizemi/module_adminHeader.php:4:get_currentuserinfo();
themes/pcshigizemi/module_adminHeader.php:15: get_currentuserinfo();
上記のような結果が出ました。ここで、「//get_currentuserinfo()」はコメントアウトされているものなので無視します。また、
plugins/download-manager/readme.txt:147:* Removed function `get_currentuserinfo`
も、すでにget_currentuserinfoを削除(remove)しているので、無視します。
plugins/duplicate-post/duplicate-post-admin.php:195: } else if (function_exists('get_currentuserinfo')) {
このコーディングは、意味合い的にget_currntuserinfoのままでも影響なさそうなので、そのままにしておきました。ただし、次の197行目は修正します。
残りのファイルすべてを開き、指定行にある「get_currentuserinfo()」を「wp_get_current_user()」に修正します。
修正が終わったものから順に保存して、アップして確認します。これで、エラー表示はすべて消えました。
文章にすると、ともて長くなりますが、実際の作業は、ほとんどがコピペなので1時間程度で終わります。(ただし、コードの意味はある程度理解している必要はありますが、ほとんどgoogle先生が教えてくれます。)
同じようにPHP7にしたら、「line 0」のエラーが発生。
どのコードが原因でエラーが出ているかは分かったものの、何がおかしいのかが分からない状態にありました。
この記事がなかったら、関連するコードを削除するしか手段がなかったほど知識がないものですから、
貴殿の記事のおかげで、エラー回避が出来ました。ありがとうございました!
お役に立てて、光栄です。自力でメンテナンスするのは、骨が折れますが、スリル満点です。wordpressも含めオープンソース・ソフトウェアは、自己責任で使うので、助け合いの精神がとっても助かります。Google先生に気に入られると、いいことがあります。でも、裏切られることも。。。
Pingback: WordPress で PHP7.0にアップデートしたら start_lvl() と start_el() でエラーが出た場合の対処法 【ブログ】 » 群馬県高崎市の写真撮影・ホームページ制作会社| Kiraba(キラバ)