В процессе работы с WordPress часто возникает необходимость массово удалить или заменить изображения в медиабиблиотеке. Это может быть связано с оптимизацией сайта, заменой устаревших или некачественных фотографий, а также с изменениями дизайна. В этой статье мы подробно разберём, как решить эту задачу без использования плагинов, используя собственные скрипты и функции WordPress.
Почему стоит избегать плагинов для массовой замены картинок
Хотя в репозитории WordPress существует множество плагинов для работы с изображениями, иногда их использование нежелательно:
- Плагины могут сильно нагружать сайт при массовых операциях.
- Некоторые плагины не обновляются и могут вызвать конфликты.
- Иногда нужна тонкая настройка и автоматизация, которую сложно реализовать через интерфейс.
Поэтому мы рассмотрим методы, которые можно адаптировать под свои задачи, сохраняя контроль и безопасность.
Как массово удалить изображения из медиабиблиотеки WordPress
Удаление изображений из медиабиблиотеки — задача не только очистки файлов, но и удаления всех связанных с ними записей в базе данных, чтобы не оставлять «мертвых» ссылок.
1. Поиск ID всех изображений
В WordPress все медиафайлы — это записи с типом attachment. Чтобы получить ID всех изображений, выполните следующий запрос:
SELECT ID FROM wp_posts WHERE post_type = 'attachment' AND post_mime_type LIKE 'image/%';Для автоматизации в PHP можно получить список так:
function wparticles_get_all_image_ids() {
$args = array(
'post_type' => 'attachment',
'post_mime_type' => 'image%',
'numberposts' => -1,
'fields' => 'ids',
);
return get_posts($args);
}2. Удаление изображений программно
Чтобы удалить изображения и все их физические файлы, используйте функцию wp_delete_attachment(). Она удалит запись и связанные файлы.
function wparticles_mass_delete_images() {
$image_ids = wparticles_get_all_image_ids();
foreach ($image_ids as $id) {
wp_delete_attachment($id, true); // true — удаляет навсегда
}
}<Внимание! Запускать такую функцию нужно с осторожностью, лучше на локальной копии сайта или после резервного копирования.
Как массово заменить изображения в WordPress с помощью кода
Замена изображений — более сложная задача. Предположим, у вас есть новые картинки, которые нужно заменить по определённым критериям (например, по имени файла или метаданным).
1. Загрузка новых изображений в медиабиблиотеку
Для начала нужно загрузить новые файлы программно. Пример функции для загрузки файла из директории сервера:
function wparticles_upload_image($file_path) {
$filetype = wp_check_filetype(basename($file_path), null);
$upload_dir = wp_upload_dir();
$new_file_path = $upload_dir['path'] . '/' . basename($file_path);
if (!copy($file_path, $new_file_path)) {
return new WP_Error('upload_failed', 'Не удалось скопировать файл');
}
$attachment = array(
'guid' => $upload_dir['url'] . '/' . basename($file_path),
'post_mime_type' => $filetype['type'],
'post_title' => preg_replace('/\.[^.]+$/', '', basename($file_path)),
'post_content' => '',
'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment($attachment, $new_file_path);
require_once(ABSPATH . 'wp-admin/includes/image.php');
$attach_data = wp_generate_attachment_metadata($attach_id, $new_file_path);
wp_update_attachment_metadata($attach_id, $attach_data);
return $attach_id;
}2. Поиск и замена старых изображений на новые
Допустим, вы хотите заменить все изображения с определённым названием новым файлом. Можно сделать так:
function wparticles_replace_image_by_name($old_name, $new_file_path) {
$args = array(
'post_type' => 'attachment',
'post_mime_type' => 'image%',
'name' => $old_name,
'numberposts' => 1,
'fields' => 'ids',
);
$old_image_ids = get_posts($args);
if (empty($old_image_ids)) {
return false; // Старое изображение не найдено
}
$old_id = $old_image_ids[0];
$new_id = wparticles_upload_image($new_file_path);
if (is_wp_error($new_id)) {
return false; // Ошибка загрузки нового
}
// Обновляем все посты, где используется старое изображение
global $wpdb;
$old_url = wp_get_attachment_url($old_id);
$new_url = wp_get_attachment_url($new_id);
// Меняем URL в контенте постов
$wpdb->query(
$wpdb->prepare(
"UPDATE {$wpdb->posts} SET post_content = REPLACE(post_content, %s, %s) WHERE post_content LIKE %s",
$old_url, $new_url, '%' . $wpdb->esc_like($old_url) . '%'
)
);
// Удаляем старое изображение
wp_delete_attachment($old_id, true);
return true;
}Этот пример показывает базовую логику замены. В реальных проектах стоит продумывать обработку кастомных полей, виджетов и других мест, где могут быть ссылки на изображения.
Советы по безопасности и оптимизации при массовой работе с изображениями
При работе с медиафайлами важно соблюдать несколько правил:
- Всегда делайте бэкап базы данных и файлов перед массовыми операциями.
- Используйте транзакции и проверяйте успешность каждого шага.
- Для больших сайтов операции лучше разбивать на части или запускать через WP-CLI.
- Оптимизируйте новые изображения с помощью специализированных инструментов, например Clearfy Pro, чтобы ускорить загрузку страниц.
Пример скрипта для запуска массовой замены изображений в WordPress
Объединим всё в единый скрипт, который можно запускать в административной части:
add_action('admin_post_wparticles_mass_replace_images', 'wparticles_handle_mass_replace_images');
function wparticles_handle_mass_replace_images() {
if (!current_user_can('manage_options')) {
wp_die('Доступ запрещён');
}
$old_name = isset($_POST['old_image_name']) ? sanitize_text_field($_POST['old_image_name']) : '';
$new_file_path = isset($_POST['new_image_path']) ? sanitize_text_field($_POST['new_image_path']) : '';
if (empty($old_name) || empty($new_file_path)) {
wp_redirect(admin_url('upload.php?message=error'));
exit;
}
$result = wparticles_replace_image_by_name($old_name, $new_file_path);
if ($result) {
wp_redirect(admin_url('upload.php?message=success'));
} else {
wp_redirect(admin_url('upload.php?message=error'));
}
exit;
}Такой подход позволяет интегрировать процесс в админку, избегая постоянного редактирования кода.