web-dev-qa-db-ja.com

Fopen/fwrite操作をWP_filesystemに変換する

以下の関数では、fopen/fwrite/fcloseメソッドを適切なWP_filesystemメソッドに変換しようとしています。コメントアウトされたスクリプトブロックを使用してすべてが期待通りに動作しますが、WP_filesystemメソッドは常にエラーブロックを返します。

私が悪いことをしているという考えはありますか?

function so_doHtaccess(){
if ( !current_user_can( 'manage_options' ) ) return;

    if ( file_exists( get_home_path() . ".htaccess" ) ) {
        $htaccess_file = get_home_path() . ".htaccess";
        $htaccessnew   = get_option('my_updated_htaccess');

/*
        if ( is_writeable( $htaccess_file ) ) {
            $f = fopen( $htaccess_file, 'w+' );
            fwrite( $f, $htaccessnew );
            fclose( $f );
        }
*/
            WP_Filesystem();
            global $wp_filesystem;

            $f = $wp_filesystem->get_contents($htaccess_file);

            if ( ! $wp_filesystem->put_contents( $f, $htaccessnew, 0644) ) {
                echo "There was an error saving the htaccess file. As a result no changes were made";die;
            }

    }

return;

}

Var_dump($ wp_filesystem)を実行すると、次のようになります。

object(WP_Filesystem_Direct)#358 (4) { 
["verbose"]=> bool(false) ["cache"]=> array(0) { } 
["method"]=> string(6) "direct" 
["errors"]=> object(WP_Error)#361 (2) { 
    ["errors"]=> array(0) { } 
    ["error_data"]=> array(0) { } 
} }
1
Scott B

Get_contents関数はファイルハンドルではなくファイルの内容を返します。その後に$ fでput_contentsを使用するのは正しくありません。

代わりに$wp_filesystem->put_contents( $htaccess_file, $htaccessnew, FS_CHMOD_FILE )を試してください。

また、 "get_home_path"のようなものをWP_Filesystemで使うのは必ずしも安全ではありません。リモートパスがローカルパスと一致していない可能性があります。あなたはこのようなことをする必要があります:

$homedir = $wp_filesystem->abspath();

他のファイルシステムのABSPATHと同等のものを取得します。

2
Otto

問題はログイン認証情報にあると思います。あなたのコードは資格が設定されていると仮定していますが、それを確実にするために何もしていません。 var_dump($f)$f->errorsにエラーオブジェクトがあるかどうかを確認します。つまり、次のようにします。

$f = $wp_filesystem->get_contents($htaccess_file);
var_dump($wp_filesystem);

エラーオブジェクトがある場合は、まだ設定されていない場合は、コードを request_filesystem_credential() に書き換える必要があります。

1
s_ha_dum