WordPressで「要求された操作を実行するためには、接続情報が必要です」と出る原因とその対処法メモ

まえがき

 先日のPHPカンファレンスWordPress の話を聞き、その場で初めてインストールしてみて以来、まだ数日ですが、WordPress熱が上がっています。


 特に何か本を読んだり特別に調べたりすることなく、気の赴くままに直感でどこまで触れるかのお試しの意味も含め、好き勝手触っているのですが、ひとつ躓いていることがありました。
 WordPressではサイトの見栄えである「テーマ」を、なんと管理画面内で一覧表示して選択し、それをダウンロードすることができる機能を提供しています。XOOPS時の私の経験では「作者のサイトなどからダウンロード→FTPで転送」という作業が必要だったので、これはすごい、と思いました。


 が、管理画面から実際にテーマのインストールをしようとすると「要求された操作を実行するためには、接続情報が必要です。」というメッセージが出て、FTPのアカウント情報の入力を求められます。

要求された操作を実行するためには、接続情報が必要です。
 ホスト名:  [      ]
 ユーザー名: [      ]
 パスワード: [      ]
 接続形式:  接続形式 FTP:FTPS(SSL)


 ちょっと乱暴なのですが、一時的に WordPressファイルおよびディレクトリ一式のパーミションを 777 に変えても状況に変化なし。困り果てたので「気の向くままに」のルールを破ってソースを見ることにしました。

原因

 上記の判定は wp-admin/includes/file.php 内の get_filesystem_method() 関数で行っていました。
 以下、かなり端折って処理のコア部分のみ抜粋。

function get_filesystem_method($args = array(), $context = false) {        
   :
       $context = WP_CONTENT_DIR;
       $temp_file_name = $context . '.write-test-' . time();

       $temp_handle = @fopen($temp_file_name, 'w');
       if ( $temp_handle ) {
          if ( getmyuid() == fileowner($temp_file_name) )
             $method = 'direct';
           @fclose($temp_handle);
           unlink($temp_file_name);
        }
   :

 $temp_file_name は、WPインストールディレクトリ/wp-content/.write-test-[現在時刻:例 1252385502]
 というファイル名として作成されます。
 この作成したファイルのオーナーと、実行中のPHPスクリプトのオーナーが一致していれば $method を 'direct' にしてその後の処理でFTPを使用しない直接のダウンロードの処理を行うことになります。


 私の環境(適当に yum で突っ込んだ程度の CentOS)では、PHPスクリプトは私の個人アカウント権限。$temp_file_name として作成されたファイルのオーナーは apache となっていました。

解決法?

 ということで、予め配置してある WordPressPHPファイルと apache がダウンロードして作成してくれるファイルのオーナが一致すればいいわけです。
(1)スクリプトを私のユーザアカウント権限で動かす案
    全然やり方を知らないのですが、suExec とかするのに cgi にしなきゃいけないような情報をちらほら見かけました。cgiじゃなくてもいいよねぇ、、、というなんとなくな抵抗感から、この方法は私の選択外となりました。あとで詳しそうな人に聞いてみよう。


(2)スクリプトを予め apache さんの持ち物にしておく方法
    結局今回はとりあえずこれでやってみました。 chown -R wordpress apache で、全ファイルを apache の持ち物に。
    これによって管理画面からの操作のみで、FTPの情報も要求されることなくテーマをダウンロードできるようになりました。


(3)スクリプトは私の名前で、新しく管理画面の操作によって作られるファイルは apache の持ち物として作られても気にしない案

    なんだか気持ち悪いのですが、ひとつの選択肢かなぁと思います。 wp-config.php に define('FS_METHOD','direct'); としておけば、いずれにせよ FTP を使用しないモードとして動作します。
    ただし 必要なディレクトリに apache が書き込める必要があるので、把握にちょっとコツがいりますね。
    少なくとも、wp-content/upgrade、wp-content/themes にはapacheが書き込める必要があるようです。


 とりあえずこれで通過は出来た、というレベルの話なので、それはやばいとかこれはひどいとかありましたらコメントで教えて下さい。