Диагностика проблемы пустых и дублирующихся записей в WordPress
Пустые записи и дубли в базе данных WordPress могут возникать по разным причинам: ошибки импорта, сбои плагинов, некорректные автоматические импорты или ручное создание контента. Такие записи негативно влияют на SEO, замедляют работу сайта и усложняют администрирование.
Для диагностики можно выполнить SQL-запросы напрямую к базе данных или использовать WP-CLI. Основные признаки:
- Посты с пустым содержанием (
post_content = ''или NULL) - Повторяющиеся записи с одинаковым заголовком и содержанием
- Повторяющиеся записи с одинаковым slug (
post_name)
Пример поиска пустых записей в базе данных
SELECT ID, post_title FROM wp_posts WHERE post_content = '' AND post_type = 'post' AND post_status = 'publish';Поиск дублирующихся постов по заголовку и содержимому
SELECT post_title, post_content, COUNT(*) as cnt FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' GROUP BY post_title, post_content HAVING cnt > 1;Пошаговое решение удаления пустых и дублирующихся постов через functions.php
Для автоматизации можно написать скрипт на PHP и запустить его один раз через админку или WP-CLI. Ниже пример функции для удаления пустых постов и дубликатов с одинаковым заголовком и содержанием.
function remove_empty_and_duplicate_posts() {
global $wpdb;
// Удаляем пустые посты
$empty_posts = $wpdb->get_col(
"SELECT ID FROM {$wpdb->posts} WHERE post_content = '' AND post_type = 'post' AND post_status = 'publish'"
);
foreach ($empty_posts as $post_id) {
wp_delete_post($post_id, true);
}
// Находим дублирующиеся посты по заголовку и содержанию
$duplicates = $wpdb->get_results(
"SELECT post_title, post_content, COUNT(*) as cnt
FROM {$wpdb->posts}
WHERE post_type = 'post' AND post_status = 'publish'
GROUP BY post_title, post_content
HAVING cnt > 1"
);
foreach ($duplicates as $dup) {
$posts = $wpdb->get_results($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND post_content = %s ORDER BY ID ASC",
$dup->post_title, $dup->post_content
));
// Оставляем один пост, остальные удаляем
array_shift($posts); // удаляем первый из массива, оставляем его
foreach ($posts as $post) {
wp_delete_post($post->ID, true);
}
}
}
// Запускаем функцию один раз (после выполнения желательно удалить вызов)
remove_empty_and_duplicate_posts();Добавьте этот код в файл functions.php вашей темы, обновите страницу админки, чтобы функция сработала, затем обязательно удалите вызов функции, чтобы она не выполнялась постоянно.
Проверка результата после внедрения
Проверьте, что пустые и дублирующиеся записи удалились следующим образом:
- Выполните SQL-запросы из раздела диагностики заново — они должны возвращать пустой результат.
- В панели админки WordPress проверьте раздел «Записи» на наличие пустых или повторяющихся.
- Проверьте логи сайта и базу данных на наличие ошибок, связанных с удалением.
Частые ошибки и как их исправить
- Удаление постов не происходит: Возможно, функция не вызывается. Убедитесь, что вызов
remove_empty_and_duplicate_posts();вfunctions.phpактивен, и обновляете страницу администратора. - Потеря нужного контента: Скрипт удаляет все дубликаты кроме одного, но если контент отличается незначительно, они могут остаться. В таком случае уточните критерии дубликатов.
- Ошибка базы данных: Проверьте префикс таблиц и корректность SQL-запросов. Используйте
$wpdb->prefixдля динамического префикса. - Функция мешает работе сайта: Удалите вызов функции сразу после первого запуска.
Практические советы по безопасности и производительности
- Перед запуском таких скриптов обязательно создайте полную резервную копию базы данных.
- Для очень больших сайтов с тысячами постов разделяйте удаление на части, чтобы избежать превышения времени выполнения.
- Используйте WP-CLI для запуска подобных операций, чтобы снизить нагрузку на веб-сервер.
- Для автоматизации чистки пустых записей можно настроить CRON-задачу с WP-CLI или отдельным PHP-скриптом.
Сравнение методов удаления пустых и дублирующихся постов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручные SQL-запросы | Быстро, без кода | Риск ошибок, требует доступа к базе |
| PHP-скрипт в functions.php | Автоматизация, интеграция с WP API | Нужно удалить после выполнения, возможные ошибки без отладки |
| WP-CLI | Удобно для больших сайтов, безопасно | Требует SSH-доступа |