Conversione delle operazioni fopen/fwrite in WP_filesystem

27 ott 2013, 18:47:08
Visualizzazioni: 4.13K
Voti: 1

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

cosa hai fatto per debug?

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

Ho confermato che sto ottenendo i risultati attesi fino alla chiamata put_contents() (visualizzando i risultati sullo schermo). Accoglierei volentieri qualsiasi suggerimento tu abbia.

Scott B Scott B
27 ott 2013 19:07:40
Tutte le risposte alla domanda 2
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.

27 ott 2013 22:48:33
1

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.

27 ott 2013 19:28:46
Commenti

Grazie per il suggerimento. Ho aggiornato la mia domanda con i risultati del var_dump.

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