Convertir operaciones fopen/fwrite a WP_filesystem

27 oct 2013, 18:47:08
Vistas: 4.13K
Votos: 1

En la función a continuación, estoy intentando convertir los métodos fopen/fwrite/fclose a los métodos preferidos de WP_filesystem. Todo funciona como se espera usando el bloque de script comentado, sin embargo, los métodos WP_filesystem siempre devuelven el bloque de error.

¿Alguna idea de qué estoy haciendo 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 "Hubo un error al guardar el archivo htaccess. Como resultado no se realizaron cambios";die;
            }

    }

return;

}

Cuando hago var_dump($wp_filesystem) muestra:

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) { } 
} }
2
Comentarios

¿qué has hecho para depurar?

Chip Bennett Chip Bennett
27 oct 2013 18:53:45

He confirmado que estoy obteniendo los resultados esperados hasta la llamada a put_contents() (mostrando los resultados en pantalla). Agradecería cualquier sugerencia que tengas.

Scott B Scott B
27 oct 2013 19:07:40
Todas las respuestas a la pregunta 2
0

La función get_contents devuelve el contenido del archivo, no un manejador de archivos. Usar put_contents con $f después de eso es incorrecto.

Prueba $wp_filesystem->put_contents( $htaccess_file, $htaccessnew, FS_CHMOD_FILE ) en su lugar.

Además, no es necesariamente seguro usar cosas como "get_home_path" y similares con WP_Filesystem. La ruta remota puede no coincidir con la ruta local. Necesitarás hacer algo como esto:

$homedir = $wp_filesystem->abspath();

Para obtener el equivalente de ABSPATH en el otro sistema de archivos.

27 oct 2013 22:48:33
1

Espero que el problema esté con las credenciales de inicio de sesión. Tu código asume que las credenciales están configuradas pero no has hecho nada para asegurarte de ello. var_dump($f) y verifica si tienes un objeto de error en $f->errors. Es decir, haz esto:

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

Si tienes un objeto de error, necesitarás reescribir tu código para que request_filesystem_credential() si no están ya configuradas.

27 oct 2013 19:28:46
Comentarios

Gracias por el consejo. He actualizado mi pregunta con los resultados del var_dump.

Scott B Scott B
27 oct 2013 19:52:30