it-swarm.com.de

Konvertieren von fopen/fwrite-Operationen in WP_filesystem

In der folgenden Funktion versuche ich, die Methoden fopen/fwrite/fclose in die bevorzugten WP_filesystem-Methoden zu konvertieren. Alles funktioniert wie erwartet mit dem auskommentierten Skriptblock. Die WP_filesystem-Methoden geben jedoch immer den Fehlerblock zurück.

Irgendwelche Ideen, was ich falsch mache?

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;

}

Wenn ich var_dump ($ wp_filesystem) erhalte:

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

Die Funktion get_contents gibt den Inhalt der Datei zurück, kein Dateihandle. Danach ist es falsch, put_contents mit $ f zu verwenden.

Versuchen Sie stattdessen $wp_filesystem->put_contents( $htaccess_file, $htaccessnew, FS_CHMOD_FILE ).

Es ist auch nicht unbedingt sicher, Dinge wie "get_home_path" und dergleichen mit dem WP_Filesystem zu verwenden. Der Remote-Pfad stimmt möglicherweise nicht mit dem lokalen Pfad überein. Sie müssen Folgendes tun:

$homedir = $wp_filesystem->abspath();

Um das Äquivalent des ABSPATH für das andere Dateisystem zu erhalten.

2
Otto

Ich gehe davon aus, dass das Problem bei den Anmeldeinformationen liegt. In Ihrem Code wird davon ausgegangen, dass die Anmeldeinformationen festgelegt wurden, Sie haben jedoch nichts unternommen, um dies sicherzustellen. var_dump($f) und prüfen Sie, ob Sie ein Fehlerobjekt bei $f->errors haben. Das heißt, mach das:

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

Wenn Sie ein Fehlerobjekt haben, müssen Sie Ihren Code umschreiben, den Sie request_filesystem_credential() nicht bereits festgelegt haben.

1
s_ha_dum