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”がでまくっておりまして、なんとかバタバタと対応しました。

【前提条件】

  1. サーバ機は正常に動作している。(ApacheもWordPressも)
  2. php7.0はインストール済み

<手順>

  1. wp-config.phpの編集 
  2. バックアップ 
  3. 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です。消えていない場合は、修正箇所を見直します。ほとんどの場合、なにがしかのエラーメッセージが出ているのでそれを参考に修正します。私の場合一番多いのがスペルミスとカッコ類のつけ忘れ等です。

図3:警告「Notice: Only variables should be passed by reference」が消えました。

図3:警告「Notice: Only variables should be passed by reference」が消えました。

(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 ) : '';

上書き保存をして、アップします。確認してみます。

図4:警告「Declaration of description_walker::start_el(&$output, $item, $depth, $args)」は、消えましたが、別の警告が出ました。

図4:警告「Declaration of description_walker::start_el(&$output, $item, $depth, $args)」は、消えましたが、別の警告が出ました。

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) {

保存後、アップして確認します。エラーは消えました。

図5:クライアント表示上では、警告が消えました。

図5:クライアント表示上では、警告が消えました。

(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()」に修正します。

修正が終わったものから順に保存して、アップして確認します。これで、エラー表示はすべて消えました。

図6:警告が消えました。

図6:警告が消えました。

文章にすると、ともて長くなりますが、実際の作業は、ほとんどがコピペなので1時間程度で終わります。(ただし、コードの意味はある程度理解している必要はありますが、ほとんどgoogle先生が教えてくれます。)