В WordPress существует удобный и безопасный способ работы с файлами и директориями — WP Filesystem API. Он скрывает особенности работы с файловой системой на разных хостингах и обеспечивает абстракцию, позволяя писать универсальный и безопасный код для чтения, записи и удаления файлов.
Что такое WP Filesystem API и зачем он нужен
WP Filesystem API — это набор функций и классов, которые позволяют взаимодействовать с файловой системой сервера в рамках WordPress. В отличие от прямого использования PHP-функций, таких как file_get_contents, fopen или unlink, API учитывает настройки хостинга, права доступа и интегрируется с системой безопасности WordPress.
Особенно это важно для плагинов и тем, которые должны работать на разных серверах без проблем с правами доступа и особенностями конфигурации.
WP Filesystem поддерживает несколько драйверов для работы с файлами:
- Direct — прямой доступ к файловой системе (работает, если PHP имеет соответствующие права);
- FTP и FTPS — доступ через FTP(S), если прямой доступ невозможен;
- SSH2 — работа через SSH, если настроено.
Как инициализировать WP Filesystem API в вашем коде
Перед использованием API необходимо инициализировать объект файловой системы. Это делается с помощью функции WPUpload_rus_init_filesystem() (придуманный нами префикс для примера). Ниже пример инициализации:
function WPUpload_rus_init_filesystem() {
global $wp_filesystem;
require_once ABSPATH . 'wp-admin/includes/file.php';
$creds = request_filesystem_credentials(site_url() . '/wp-admin/', '', false, false, null);
if (!WP_Filesystem($creds)) {
return false; // Ошибка инициализации
}
return $wp_filesystem;
}Функция request_filesystem_credentials автоматически запрашивает доступные учетные данные для работы с файловой системой (например, FTP), если прямой доступ невозможен.
После успешной инициализации глобальная переменная $wp_filesystem содержит объект с методами для работы с файлами.
Основные методы для работы с файлами и папками
Рассмотрим несколько часто используемых методов API и примеры их применения.
Чтение содержимого файла
function WPUpload_rus_read_file($file_path) {
$wp_filesystem = WPUpload_rus_init_filesystem();
if (!$wp_filesystem) {
return false;
}
if ($wp_filesystem->exists($file_path)) {
return $wp_filesystem->get_contents($file_path);
}
return false;
}Этот код проверяет, существует ли файл, и возвращает его содержимое или false при ошибке.
Запись в файл
function WPUpload_rus_write_file($file_path, $content) {
$wp_filesystem = WPUpload_rus_init_filesystem();
if (!$wp_filesystem) {
return false;
}
return $wp_filesystem->put_contents($file_path, $content, FS_CHMOD_FILE);
}Метод put_contents записывает данные в файл, создает его при необходимости. Третий параметр — права доступа.
Создание директории
function WPUpload_rus_create_dir($dir_path) {
$wp_filesystem = WPUpload_rus_init_filesystem();
if (!$wp_filesystem) {
return false;
}
if (!$wp_filesystem->is_dir($dir_path)) {
return $wp_filesystem->mkdir($dir_path, FS_CHMOD_DIR);
}
return true; // Папка уже есть
}Удаление файла
function WPUpload_rus_delete_file($file_path) {
$wp_filesystem = WPUpload_rus_init_filesystem();
if (!$wp_filesystem) {
return false;
}
if ($wp_filesystem->exists($file_path)) {
return $wp_filesystem->delete($file_path);
}
return false;
}Практическое применение: Автоматическое создание лог-файла плагина
Допустим, вы пишете плагин, в котором нужно вести лог в файл в папке wp-content/uploads/my-plugin-logs/. Используем WP Filesystem API для создания директории и записи в файл.
function WPUpload_rus_write_log($message) {
$upload_dir = wp_upload_dir();
$log_dir = $upload_dir['basedir'] . '/my-plugin-logs';
$log_file = $log_dir . '/plugin.log';
$wp_filesystem = WPUpload_rus_init_filesystem();
if (!$wp_filesystem) {
return false;
}
// Создаем папку, если нет
if (!$wp_filesystem->is_dir($log_dir)) {
$wp_filesystem->mkdir($log_dir, FS_CHMOD_DIR);
}
// Формируем строку с датой
$date = date('Y-m-d H:i:s');
$log_entry = "[{$date}] {$message}\n";
if ($wp_filesystem->exists($log_file)) {
$content = $wp_filesystem->get_contents($log_file);
$content .= $log_entry;
} else {
$content = $log_entry;
}
return $wp_filesystem->put_contents($log_file, $content, FS_CHMOD_FILE);
}Теперь вызов WPUpload_rus_write_log('Тестовое сообщение'); добавит строку в лог-файл, создаст нужную директорию и файл при необходимости.
Советы по безопасности при работе с WP Filesystem API
Несмотря на удобство WP Filesystem API, важно учитывать меры безопасности:
- Всегда проверяйте и валидируйте пути и имена файлов, особенно если они получены от пользователя.
- Не записывайте в директории, доступные из интернета, без защиты, чтобы избежать утечки данных.
- Используйте константы FS_CHMOD_FILE и FS_CHMOD_DIR для установки корректных прав доступа.
- Обрабатывайте ошибки и исключения, чтобы не оставлять неочищенные временные файлы или открытые дескрипторы.
Заключение
WP Filesystem API — мощный инструмент для безопасной и кросс-хостинговой работы с файлами в WordPress. Использование этого API позволит избежать проблем с правами доступа и сделает ваш код более универсальным и надежным.
Для расширения функционала и удобства можно комбинировать WP Filesystem API с плагинами оптимизации и безопасности, например, Clearfy Pro, который помогает управлять правами и оптимизировать работу сайта.