web-dev-qa-db-fra.com

Conversion des opérations fopen/fwrite en WP_filesystem

Dans la fonction ci-dessous, j'essaie de convertir les méthodes fopen/fwrite/fclose en méthodes WP_filesystem préférées. Tout fonctionne comme prévu à l'aide du bloc de script commenté. Toutefois, les méthodes WP_filesystem renvoient toujours le bloc d'erreur.

Des idées que je fais mal?

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;

}

Quand je var_dump ($ wp_filesystem), il donne:

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

La fonction get_contents renvoie le contenu du fichier, pas un descripteur de fichier. Utiliser put_contents avec $ f après cela est incorrect.

Essayez plutôt $wp_filesystem->put_contents( $htaccess_file, $htaccessnew, FS_CHMOD_FILE ).

En outre, l'utilisation d'éléments tels que "get_home_path" et d'autres éléments tels que WP_Filesystem n'est pas nécessairement sûre. Le chemin d'accès distant peut ne pas correspondre au chemin d'accès local. Vous aurez besoin de faire quelque chose comme ça:

$homedir = $wp_filesystem->abspath();

Pour obtenir l'équivalent de ABSPATH sur l'autre système de fichiers.

2
Otto

Je suppose que le problème est avec les informations d'identification de connexion. Votre code suppose que les informations d'identification sont définies, mais vous n'avez rien fait pour vous en assurer. var_dump($f) et voyez si vous avez un objet d'erreur à $f->errors. C'est-à-dire, faites ceci:

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

Si vous avez un objet d'erreur, vous devrez réécrire votre code/ request_filesystem_credential() s'il n'est pas déjà défini.

1
s_ha_dum