Преобразование операций fopen/fwrite в WP_filesystem

27 окт. 2013 г., 18:47:08
Просмотры: 4.13K
Голосов: 1

В функции ниже я пытаюсь преобразовать методы fopen/fwrite/fclose в предпочтительные методы WP_filesystem. Все работает как ожидается при использовании закомментированного блока скрипта, однако методы WP_filesystem всегда возвращают блок с ошибкой.

Есть идеи, что я делаю не так?

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 "Произошла ошибка при сохранении файла htaccess. В результате изменения не были применены";die;
            }

    }

return;

}

Когда я выполняю var_dump($wp_filesystem), получается:

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
Комментарии

что ты сделал для отладки?

Chip Bennett Chip Bennett
27 окт. 2013 г. 18:53:45

Я подтвердил, что получаю ожидаемые результаты вплоть до вызова put_contents() (выводя результаты на экран). Буду рад любым твоим предложениям.

Scott B Scott B
27 окт. 2013 г. 19:07:40
Все ответы на вопрос 2
0

Функция get_contents возвращает содержимое файла, а не файловый дескриптор. Использование put_contents с переменной $f после этого некорректно.

Попробуйте использовать $wp_filesystem->put_contents( $htaccess_file, $htaccessnew, FS_CHMOD_FILE ) вместо этого.

Кроме того, не всегда безопасно использовать функции типа "get_home_path" и подобные с WP_Filesystem. Удалённый путь может не совпадать с локальным. Вам нужно сделать что-то вроде этого:

$homedir = $wp_filesystem->abspath();

Чтобы получить эквивалент ABSPATH в другой файловой системе.

27 окт. 2013 г. 22:48:33
1

Я предполагаю, что проблема связана с учетными данными для входа. Ваш код предполагает, что учетные данные установлены, но вы ничего не сделали, чтобы это гарантировать. Используйте var_dump($f) и проверьте, есть ли объект ошибки в $f->errors. То есть сделайте следующее:

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

Если у вас есть объект ошибки, вам нужно переписать код так, чтобы запрашивать request_filesystem_credential(), если они еще не установлены.

27 окт. 2013 г. 19:28:46
Комментарии

Спасибо за подсказку. Я обновил свой вопрос с результатами var_dump.

Scott B Scott B
27 окт. 2013 г. 19:52:30