Conversione delle operazioni fopen/fwrite in WP_filesystem
Nella funzione qui sotto, sto cercando di convertire i metodi fopen/fwrite/fclose nei metodi preferiti di WP_filesystem. Tutto funziona come previsto utilizzando il blocco di script commentato, tuttavia i metodi WP_filesystem restituiscono sempre il blocco di errore.
Qualcuno ha idea di cosa sto sbagliando?
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 "Si è verificato un errore durante il salvataggio del file htaccess. Di conseguenza, non sono state apportate modifiche";die;
}
}
return;
}
Quando eseguo var_dump($wp_filesystem) ottengo:
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 funzione get_contents restituisce il contenuto del file, non un handle del file. Utilizzare put_contents con $f dopo è errato.
Prova invece $wp_filesystem->put_contents( $htaccess_file, $htaccessnew, FS_CHMOD_FILE )
.
Inoltre, non è necessariamente sicuro utilizzare funzioni come "get_home_path" e simili con il WP_Filesystem. Il percorso remoto potrebbe non corrispondere al percorso locale. Dovrai fare qualcosa del genere:
$homedir = $wp_filesystem->abspath();
Per ottenere l'equivalente di ABSPATH sull'altro filesystem.

Mi aspetto che il problema sia con le credenziali di accesso. Il tuo codice presuppone che le credenziali siano impostate ma non hai fatto nulla per assicurartene. var_dump($f)
e controlla se hai un oggetto di errore in $f->errors
. Cioè, fai questo:
$f = $wp_filesystem->get_contents($htaccess_file);
var_dump($wp_filesystem);
Se hai un oggetto di errore, dovrai riscrivere il tuo codice in modo da request_filesystem_credential()
se non sono già state impostate.
