Ведение блога или новостного портала на WordPress требует регулярного контроля за контентом, особенно если на сайте публикуются статьи с обязательными изображениями. Но бывает так, что картинки теряются из-за удаления файлов, сбоя загрузки или проблем с хостингом. В таких случаях на сайте остаются записи без миниатюр, что может испортить внешний вид и негативно сказаться на SEO.
В этой статье разберём, как автоматизировать удаление записей с отсутствующими миниатюрами с помощью WP-CLI.
Что делает скрипт?
Этот PHP-скрипт выполняет следующие задачи:
- Сканирует все записи в WordPress, у которых установлена миниатюра.
- Проверяет наличие изображений на сервере и доступность их по URL.
- Удаляет записи, у которых:
- Миниатюра отсутствует физически на сервере.
- Миниатюра недоступна по HTTP (отдаёт 404 или другую ошибку).
- Миниатюра не задана вообще.
- Выводит статистику о количестве обработанных записей, найденных проблемах и количестве удалённых постов.
Исходный код скрипта
Добавим поддержку WP-CLI команды, чтобы можно было вызывать скрипт с помощью wp delete_missing_images.
if ( defined( 'WP_CLI' ) && WP_CLI ) {
// Регистрация команды
WP_CLI::add_command( 'delete_missing_images', 'delete_posts_with_missing_featured_image' );
}
function delete_posts_with_missing_featured_image() {
$posts_per_page = 1000; // Количество записей для обработки за один запрос
$page = 1; // Начальная страница пагинации
$total_deleted = 0; // Счётчик удалённых записей
$total_checked = 0; // Счётчик проверенных записей
$total_no_image = 0; // Счётчик записей без изображения
$total_posts_count = count( get_posts( array(
'post_type' => 'post',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_thumbnail_id',
'compare' => 'EXISTS',
),
),
'fields' => 'ids',
) ) );
WP_CLI::log( "Общее количество записей с изображениями: $total_posts_count" );
do {
$query_args = array(
'post_type' => 'post',
'posts_per_page' => $posts_per_page,
'paged' => $page,
'meta_query' => array(
array(
'key' => '_thumbnail_id',
'compare' => 'EXISTS',
),
),
'fields' => 'ids'
);
$post_ids = get_posts( $query_args );
$total_posts = count( $post_ids );
if ( $total_posts > 0 ) {
foreach ( $post_ids as $post_id ) {
$total_checked++;
show_progress_bar( $total_checked, $total_deleted, $total_posts_count );
$thumbnail_id = get_post_thumbnail_id( $post_id );
$thumbnail_url = wp_get_attachment_url( $thumbnail_id );
if ( ! empty( $thumbnail_url ) ) {
$file_path = get_attached_file( $thumbnail_id );
if ( ! file_exists( $file_path ) ) {
WP_CLI::log( "Файл отсутствует. Удаляем запись ID: $post_id" );
wp_delete_post( $post_id, true );
$total_deleted++;
} else {
$response = wp_remote_get( $thumbnail_url );
$status_code = wp_remote_retrieve_response_code( $response );
if ( $status_code == 404 || is_wp_error( $response ) ) {
WP_CLI::log( "Изображение недоступно (код $status_code). Удаляем запись ID: $post_id" );
wp_delete_post( $post_id, true );
$total_deleted++;
}
}
} else {
WP_CLI::log( "Миниатюра отсутствует. Удаляем запись ID: $post_id" );
$total_no_image++;
wp_delete_post( $post_id, true );
$total_deleted++;
}
if ( function_exists( 'wp_cache_flush' ) ) {
wp_cache_flush();
}
}
}
$page++;
} while ( $total_posts > 0 );
WP_CLI::log( "\nРезультаты сканирования:\n" );
WP_CLI::log( "Обработано записей: $total_checked" );
WP_CLI::log( "Без изображений: $total_no_image" );
WP_CLI::log( "Удалено записей: $total_deleted" );
WP_CLI::success( "Сканирование завершено." );
}
function show_progress_bar( $current, $deleted, $total ) {
$percentage = round( ( $current / $total ) * 100 );
$bar = str_repeat( '=', ( $percentage / 2 ) ) . str_repeat( ' ', 50 - ( $percentage / 2 ) );
echo "\r[$bar] $percentage% — Просканировано: $current, Удалено: $deleted";
}
Как запустить?
Запуск через WP-CLI
После добавления скрипта в файл (например, delete_missing_images.php), вы можете вызвать его из командной строки следующим образом:
wp delete_missing_images
Этот метод позволяет удобно управлять очисткой записей без изображений прямо из консоли.
Использование скрипта в functions.php
Если вам необходимо запускать удаление записей без миниатюр при каждом входе в административную панель WordPress, можно добавить следующий код в functions.php вашей активной темы:
add_action('admin_init', 'delete_posts_with_missing_featured_image');
Этот метод подходит, если вы хотите автоматизировать процесс без дополнительной настройки, но он будет выполняться при каждом входе в админ-панель, что может замедлить её работу на больших сайтах.
Использование скрипта как отдельного файла
Если вы хотите запускать скрипт вручную или через командную строку, создайте отдельный PHP-файл, например delete_missing_images.php, и вставьте в него код функции delete_posts_with_missing_featured_image(). Затем вы можете выполнить его через WP-CLI:
- Подключитесь к серверу через SSH.
- Перейдите в корневую папку WordPress.
- Запустите скрипт командой:
wp eval-file delete_missing_images.php
Если вам необходимо запускать удаление записей без миниатюр автоматически при загрузке административной панели, можно добавить следующий код в functions.php вашей темы:
add_action('admin_init', 'delete_posts_with_missing_featured_image');
Этот код автоматически вызовет функцию удаления при каждой загрузке панели администратора WordPress.
Автоматизация с помощью Cron
Если вы хотите запускать этот скрипт автоматически, например, раз в день, добавьте его выполнение в crontab:
- Откройте crontab для редактирования:
crontab -e - Добавьте строку для выполнения скрипта каждый день в 3 часа ночи:
0 3 * * * /usr/bin/wp delete_missing_images --path=/путь/к/wordpress > /dev/null 2>&1- Замените
/путь/к/wordpressна путь к вашей установке WordPress. > /dev/null 2>&1скрывает вывод команды, чтобы не засорять логи. Если вы хотите запускать этот скрипт автоматически, например, раз в день, добавьте его выполнение в crontab:
- Замените
- Откройте crontab для редактирования:
crontab -e - Добавьте строку для выполнения скрипта каждый день в 3 часа ночи:
0 3 * * * /usr/bin/wp eval-file /путь/к/файлу.php --path=/путь/к/wordpress- Замените
/путь/к/файлу.phpна путь к вашему скрипту. - Замените
/путь/к/wordpressна путь к вашей установке WordPress.
- Замените
Этот скрипт предназначен для использования через WP-CLI (интерфейс командной строки WordPress). Для его запуска:
- Подключитесь к серверу по SSH.
- Перейдите в корневую папку WordPress.
- Введите команду:
wp eval-file путь_к_файлу.php
Заключение
Этот скрипт помогает автоматически удалять записи без изображений, поддерживая чистоту базы данных и улучшая пользовательский опыт. Он будет особенно полезен для новостных порталов, где наличие изображений в статьях критично. Если у вас много записей и вы хотите избежать ошибок, лучше сначала протестировать его на тестовом сайте.
