В WordPress стандартный путь для медиафайлов обычно начинается с wp-content/uploads. Но в некоторых случаях возникает необходимость изменить этот путь — например, при миграции сайта, использовании CDN, или чтобы хранить медиа в нестандартном каталоге. В данной статье мы подробно рассмотрим, как с помощью фильтра wp_content (а точнее, аналогичных фильтров) реализовать изменение путей к медиаданным.
Почему важно корректно менять путь к медиаданным
Медиаданные — это не только путь к файлам, но и ссылки, которые генерируются в контенте и базе данных. Если изменить путь только частично, можно получить битые ссылки на изображения, видео и другие файлы, что негативно скажется на юзабилити и SEO.
Например, если у вас есть необходимость хранить медиафайлы вне стандартной папки uploads или на другом сервере, а также хотите интегрировать CDN, потребуется грамотное переопределение путей, чтобы WordPress правильно формировал URL и не ломал функционал.
Используя фильтры WordPress, мы можем динамически менять пути к медиафайлам без прямого вмешательства в базу данных или структуру файлов.
Основные фильтры для изменения путей медиаданных
Для изменения путей загрузки и отображения медиа используются несколько ключевых фильтров и функций:
upload_dir— фильтр для изменения основных параметров загрузки: пути и URL;wp_get_attachment_url— возвращает URL вложения (изображения, файла); можно изменить ссылку на файл;wp_prepare_attachment_for_js— используется при выводе медиа в админке, чтобы корректно показать путь;plugins_urlилиcontent_url— также можно фильтровать, если нужно менять путь к контенту.
Фокусируемся на фильтре upload_dir, который позволяет изменять путь загрузки и URL одновременно.
Фильтр upload_dir: структура и параметры
При загрузке файла WordPress вызывает фильтр upload_dir, передавая в функцию массив с такими ключами:
path— физический путь на сервере;url— URL для доступа к файлам;subdir— подкаталог, например,/2024/06;basedir— базовый путь загрузок;baseurl— базовый URL загрузок;error— ошибка, если есть.
Используя этот фильтр, можно переопределить любую часть пути или URL.
Пример: изменение пути загрузки медиафайлов с помощью wpcontent_upload_dir_filter
Рассмотрим, как изменить путь загрузки файлов на /wp-content/custom_uploads и URL на https://example.com/custom_uploads. Это частая задача при использовании собственного хранилища.
function wpcontent_upload_dir_filter( $uploads ) {
// Новая директория для загрузок
$custom_dir = '/wp-content/custom_uploads';
// Корневая директория сайта
$root_dir = ABSPATH;
// Переопределяем пути
$uploads['basedir'] = $root_dir . $custom_dir;
$uploads['baseurl'] = home_url() . $custom_dir;
$uploads['path'] = $uploads['basedir'] . $uploads['subdir'];
$uploads['url'] = $uploads['baseurl'] . $uploads['subdir'];
return $uploads;
}
add_filter( 'upload_dir', 'wpcontent_upload_dir_filter' );
Этот код нужно добавить в файл functions.php вашей темы или в отдельный плагин. После этого все загружаемые файлы будут сохраняться в новую папку, а ссылки на них будут формироваться корректно.
Важно убедиться, что папка wp-content/custom_uploads существует и имеет права на запись.
Как проверить результат
Загрузите новое изображение через медиабиблиотеку и проверьте, что файл реально появился в новой папке. Также откройте страницу с этим изображением — ссылка должна вести на новый URL.
Изменение URL медиафайлов для CDN с помощью wpcontent_attachment_url_filter
Если вы используете CDN, часто необходимо изменить только URL, не меняя физического расположения файлов. Для этого подходит фильтр wp_get_attachment_url.
function wpcontent_attachment_url_filter( $url, $post_id ) {
// Исходный URL медиа
$old_base_url = content_url('/uploads');
// Новый URL CDN
$new_base_url = 'https://cdn.example.com/uploads';
// Заменяем базовый URL на CDN
if ( strpos( $url, $old_base_url ) === 0 ) {
$url = str_replace( $old_base_url, $new_base_url, $url );
}
return $url;
}
add_filter( 'wp_get_attachment_url', 'wpcontent_attachment_url_filter', 10, 2 );
Так вы добьётесь того, что все ссылки на медиа из базы будут подменяться на CDN, при этом файлы останутся в стандартной папке uploads.
Особенности и подводные камни при изменении путей медиаданных
При изменении путей загрузки и URL могут возникнуть несколько проблем:
- Старые ссылки в базе данных останутся без изменений, если не делать миграцию или массовую замену. Для этого можно использовать WP-CLI или плагины типа Clearfy Pro для безопасного поиска и замены URL;
- Права доступа к новым папкам должны быть корректными, иначе загрузка файлов завершится ошибкой;
- Если используется кэширование, может понадобиться его очистка после изменения URL;
- Некоторые плагины и темы могут жестко ссылаться на
wp-content/uploads, что требует дополнительной настройки.
Также советуем протестировать работу сайта в разных браузерах и проверять логи ошибок сервера.
Пример расширения: динамическое переключение путей для мультисайта
Для мультисайтовой установки WordPress может потребоваться использовать разные каталоги загрузок для каждого сайта. В этом случае фильтр upload_dir можно расширить:
function wpcontent_multisite_upload_dir_filter( $uploads ) {
if ( is_multisite() ) {
$blog_id = get_current_blog_id();
$custom_dir = '/wp-content/custom_uploads/site_' . $blog_id;
$uploads['basedir'] = ABSPATH . $custom_dir;
$uploads['baseurl'] = home_url() . $custom_dir;
$uploads['path'] = $uploads['basedir'] . $uploads['subdir'];
$uploads['url'] = $uploads['baseurl'] . $uploads['subdir'];
}
return $uploads;
}
add_filter( 'upload_dir', 'wpcontent_multisite_upload_dir_filter' );
Так для каждого сайта будет своя папка с медиафайлами, что облегчает управление и резервное копирование.
Выводы и рекомендации
Изменение пути медиаданных в WordPress — задача частая и решаемая с помощью фильтров. Основной инструмент — фильтр upload_dir, который позволяет полностью переопределить логику формирования путей и URL для загрузок.
Для подмены ссылок на уже загруженные файлы подходит фильтр wp_get_attachment_url, что удобно для интеграции с CDN и внешними хранилищами.
Всегда тестируйте изменения на тестовом сервере, делайте резервные копии и учитывайте особенности вашей хостинг-среды и используемых плагинов.
Для удобного управления и оптимизации рекомендуем обратить внимание на Clearfy Pro от WPSHOP, который помогает автоматизировать многие задачи по оптимизации и управлению WordPress.