Convertir operaciones fopen/fwrite a WP_filesystem
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) { }
} }

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.

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.
