В WordPress при работе с плагинами, темами и кастомными скриптами часто возникает необходимость создавать временные файлы, например, для кэширования, экспорта данных или промежуточного хранения результатов. Однако отсутствие правильной автоматизации удаления таких файлов может привести к разрастанию директории и проблемам с производительностью и безопасностью.
Почему важно контролировать временные файлы в WordPress
Временные файлы — это файлы, которые нужны на короткий промежуток времени, после чего они должны быть удалены. Если их не удалять, то они накапливаются, занимают дисковое пространство и могут замедлять работу сайта. Особенно это актуально для хостингов с ограниченным дисковым пространством.
Кроме того, забытые временные файлы могут содержать чувствительную информацию, что является угрозой безопасности. Поэтому автоматизация их создания и удаления — важный аспект поддержки сайта.
В WordPress нет встроенных методов комплексного управления временными файлами, но с помощью хуков, CRON задач и правильного кода можно реализовать удобную и надежную систему.
Создание временных файлов с префиксом и хранение в wp-content/uploads
Лучше всего временные файлы создавать в папке wp-content/uploads/tmp или в похожей директории, которая не удаляется при обновлениях, и доступ к которой можно ограничить через .htaccess.
Для создания временного файла используем функцию wptavern_create_temp_file(), которая гарантирует уникальное имя файла с префиксом и запись содержимого:
function wptavern_create_temp_file( $content, $prefix = 'wptavern_tmp_' ) {
$upload_dir = wp_upload_dir();
$tmp_dir = trailingslashit( $upload_dir['basedir'] ) . 'tmp/';
if ( ! file_exists( $tmp_dir ) ) {
wp_mkdir_p( $tmp_dir );
}
$filename = $prefix . uniqid() . '.tmp';
$filepath = $tmp_dir . $filename;
file_put_contents( $filepath, $content );
return $filepath;
}
Такой подход помогает структурировать временные файлы и легко их находить для последующего удаления.
Автоматическое удаление старых временных файлов через WP-Cron
Чтобы не накапливать мусор, нужно запускать периодическую очистку временных файлов. Сделаем это через планировщик задач WordPress — WP-Cron.
Создадим функцию wptavern_cleanup_temp_files(), которая удалит файлы старше заданного времени (например, 1 день):
function wptavern_cleanup_temp_files() {
$upload_dir = wp_upload_dir();
$tmp_dir = trailingslashit( $upload_dir['basedir'] ) . 'tmp/';
if ( ! file_exists( $tmp_dir ) ) {
return;
}
$files = glob( $tmp_dir . 'wptavern_tmp_*.tmp' );
$now = time();
$max_age = 24 * 3600; // 24 часа
foreach ( $files as $file ) {
if ( $now - filemtime( $file ) > $max_age ) {
@unlink( $file );
}
}
}
// Регистрируем событие, если еще не зареган
if ( ! wp_next_scheduled( 'wptavern_cleanup_temp_files_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'wptavern_cleanup_temp_files_hook' );
}
add_action( 'wptavern_cleanup_temp_files_hook', 'wptavern_cleanup_temp_files' );
Этот код запускает очистку каждый час, удаляя временные файлы старше суток.
Ограничение доступа к временным файлам через .htaccess
Чтобы защитить временные файлы от прямого доступа извне, нужно добавить в папку tmp файл .htaccess с таким содержимым:
deny from all
Это простое правило запретит доступ к файлам через браузер, что повысит безопасность.
Пример использования временных файлов для экспорта данных
Рассмотрим пример задачи — экспорт товаров WooCommerce в CSV, с временным сохранением файла для последующей загрузки пользователем.
Функция создания файла:
function wptavern_export_products_csv() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
);
$products = get_posts( $args );
if ( empty( $products ) ) {
return false;
}
$csv = "ID,Name,Price\n";
foreach ( $products as $product_post ) {
$product = wc_get_product( $product_post->ID );
$csv .= sprintf(
"%s,%s,%s\n",
$product->get_id(),
esc_csv( $product->get_name() ),
$product->get_price()
);
}
return wptavern_create_temp_file( $csv, 'products_export_' );
}
function esc_csv( $value ) {
$value = str_replace( '"', '""', $value );
if ( preg_match( '/[",\r\n]/', $value ) ) {
$value = '"' . $value . '"';
}
return $value;
}
После вызова wptavern_export_products_csv() вы получите путь к временному CSV-файлу, который можно выдать пользователю для скачивания.
Вывод на страницу ссылки для скачивания временного файла
Для предоставления пользователю ссылки на скачивание временного файла можно использовать простой обработчик:
function wptavern_handle_download() {
if ( ! isset( $_GET['wptavern_download'] ) ) {
return;
}
$file = sanitize_text_field( wp_unslash( $_GET['wptavern_download'] ) );
$upload_dir = wp_upload_dir();
$tmp_dir = trailingslashit( $upload_dir['basedir'] ) . 'tmp/';
$filepath = realpath( $tmp_dir . $file );
if ( strpos( $filepath, realpath( $tmp_dir ) ) !== 0 || ! file_exists( $filepath ) ) {
wp_die( 'Файл не найден.' );
}
header( 'Content-Description: File Transfer' );
header( 'Content-Type: application/octet-stream' );
header( 'Content-Disposition: attachment; filename="' . basename( $filepath ) . '"' );
header( 'Expires: 0' );
header( 'Cache-Control: must-revalidate' );
header( 'Pragma: public' );
header( 'Content-Length: ' . filesize( $filepath ) );
readfile( $filepath );
exit;
}
add_action( 'init', 'wptavern_handle_download' );
На странице можно вывести ссылку вида:
<a href="?wptavern_download=products_export_5f6d7e8c9b.tmp">Скачать экспорт товаров</a>
Поддержка плагина Clearfy Pro для улучшения управления временными файлами
Плагин Clearfy Pro содержит расширенные инструменты оптимизации, в том числе по очистке временных файлов и кэша. Его можно использовать для дополнительной автоматизации и контроля, особенно если вы не хотите писать собственный код для WP-Cron.
Итог
Автоматизация создания и удаления временных файлов в WordPress — важная задача для поддержания здоровья и безопасности сайта. Используя описанные методы, вы сможете:
- Создавать временные файлы в организованной структуре;
- Автоматически очищать их через WP-Cron;
- Защищать доступ к временным файлам;
- Использовать временные файлы для удобных задач, например, экспорта данных;
- Подключать готовые решения, такие как Clearfy Pro, для расширения функционала.
Такой подход поможет избежать накопления мусора, повысить безопасность и упростить техническое сопровождение WordPress-проекта.