Использование файловой системы wp в плагинах


Я написал плагин (https://github.com/bassjobsen/custom-bootstrap-editor ) этот плагин записывает таблицу стилей в wp-content/uploads/cbe.

Для этого я буду использовать что-то вроде кода ниже:

$upload_dir = wp_upload_dir();
$this->folder = trailingslashit($upload_dir['basedir']).'cbe/';
if( !is_dir( $this->folder ) ) wp_mkdir_p( $this->folder );
if ( is_writable( $this->folder ) ){
    file_put_contents( $this->folder.$this->filename, $css);
}

Мой первый вопрос по поводу вышесказанного: как лучше всего проверить, доступен ли wp_upload_dir() для записи? Будет ли для этого стандартная проверка (плюс ошибка)?

После прочтения http://ottopress.com/2011/tutorial-using-the-wp_filesystem / я у меня есть и другие вопросы.

В упомянутом сообщении говорится, что я должен использовать API файловой системы для замены приведенного выше кода. Будет ли это наблюдение по-прежнему верным?

request_filesystem_credentials кажется, все работает так, как ожидалось, но входить в систему при каждом изменении файла кажется каким-то излишеством. Может ли мой плагин пропустить экран входа в систему?

Хотя кредиты кажутся действительными, мои $wp_filesystem->mkdir( $folder ) и $wp_filesystem->put_contents( $folder.'/'.$filename, $css, FS_CHMOD_FILE), похоже, всегда возвращают false. Как я могу отладить вызовы API файловой системы?

Обновление благодаря файлу @otto написание работ сейчас:

if (isset($_POST['SaveCBESettings'])) {

        if ( !empty($_POST) && check_admin_referer( 'cbe-nonce') ) 
        {



            $SaveCBESettings = 1;
            $in = true;
            $url = wp_nonce_url('options-general.php?page=filewriting','cbe-nonce');
            if (false === ($creds = request_filesystem_credentials($url, '', false, false, array('SaveCBESettings')) ) ) {
                $in = false;
            }
            if ($in && ! WP_Filesystem($creds) ) {
                // our credentials were no good, ask the user for them again
                request_filesystem_credentials($url, '', true, false,array('SaveCBESettings'));
                $in = false;
            }
            if($in)
            {
            // by this point, the $wp_filesystem global should be working, so let's use it to create a file
            global $wp_filesystem;
            $contentdir = trailingslashit( $wp_filesystem->wp_content_dir() ); 
            $wp_filesystem->mkdir( $contentdir. 'cbe' );
            if ( ! $wp_filesystem->put_contents(  $contentdir . 'cbe/test.txt', 'Test file contents', FS_CHMOD_FILE) ) 
            {
                echo "error saving file!";
            }
                unset($_POST);
            }
        }
}
Author: Bass Jobsen, 2013-11-29

1 answers

Здесь нужно объяснить несколько вещей:

В этом уроке я выбрал только upload_dir в качестве примера того, как это сделать. Демонстрация того, как работают функции WP_Filesystem. Обычно вы не используете файловую систему WP_Filesystem для записи в каталог загрузки. Этот код не предназначен для копирования в рабочий производственный код.

Запись CSS, PHP, HTML или любых других файлов, кроме изображений, в каталог загрузки... и который затем будет включен в веб-страницу в какая-то мода, небезопасна.

На самом деле не имеет значения, как вы это делаете, ожидается, что каталог загрузки будет содержать вещи, которые не обязательно считаются безопасными для XSS по самой своей природе. Если вам нужно записать файлы для включения в страницу, например таблицы стилей, то вам следует создать свою собственную папку в /wp-content, а не в /wp-content/uploads. Каталог загрузок должен использоваться строго для медиафайлов, загрузок и других вещей, загружаемых через различные wp_upload функции.

При использовании $wp_filesystem есть удобный вызов функции для получения пути к каталогу содержимого: $wp_filesystem->wp_content_dir();. Вам необходимо использовать эту функцию, потому что путь к "удаленному" каталогу может отличаться от пути к "локальному" каталогу.

Аналогичной функции для получения uploads_dir не существует, потому что, опять же, обычно вы никогда бы этого не сделали. На самом деле не имеет большого смысла использовать каталог загрузки для этих файлов.

Итак, это даст вам "удаленный" путь к каталог содержимого, и вы можете использовать его для записи файлов и создания каталогов и тому подобного:

$contentdir = trailingslashit( $wp_filesystem->wp_content_dir() ); 
$wp_filesystem->mkdir( $contentdir. 'cbe' );
$wp_filesystem->put_contents( $contentdir . 'cbe/filename.whatever', $css, FS_CHMOD_FILE);

И так далее. Конечно, вам все равно нужно запросить учетные данные и сначала создать экземпляр с помощью вызова WP_Filesystem($creds), чтобы использовать этот global $wp_filesystem, но это работает.

 5
Author: Otto, 2013-11-29 22:14:26