Conversia operațiunilor fopen/fwrite în WP_filesystem
În funcția de mai jos, încerc să convertesc metodele fopen/fwrite/fclose la metodele preferate WP_filesystem. Totul funcționează conform așteptărilor folosind blocul de script comentat, însă metodele WP_filesystem returnează întotdeauna blocul de eroare.
Aveți idei ce fac greșit?
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 "A apărut o eroare la salvarea fișierului htaccess. Ca urmare, nu au fost efectuate modificări";die;
}
}
return;
}
Când folosesc var_dump($wp_filesystem) rezultatul este:
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) { }
} }

Funcția get_contents returnează conținutul fișierului, nu un handler de fișier. Utilizarea put_contents cu $f după aceea este incorectă.
Încearcă $wp_filesystem->put_contents( $htaccess_file, $htaccessnew, FS_CHMOD_FILE )
în schimb.
De asemenea, nu este neapărat sigur să folosești funcții precum "get_home_path" și altele asemenea cu WP_Filesystem. Calea de pe sistemul remote poate să nu corespundă cu cea locală. Va trebui să faci ceva de genul:
$homedir = $wp_filesystem->abspath();
Pentru a obține echivalentul ABSPATH pe celălalt sistem de fișiere.

Mă aștept ca problema să fie cu datele de autentificare. Codul tău presupune că acestea sunt setate, dar nu ai făcut nimic pentru a te asigura de acest lucru. var_dump($f)
și verifică dacă ai un obiect de eroare la $f->errors
. Adică, fă asta:
$f = $wp_filesystem->get_contents($htaccess_file);
var_dump($wp_filesystem);
Dacă ai un obiect de eroare, va trebui să rescrii codul tău astfel încât să request_filesystem_credential()
dacă acestea nu sunt deja setate.
