Дубликаты записей в WordPress могут появляться по разным причинам: ошибки импорта, некорректная работа плагинов, сбои при миграциях или дублирование контента пользователями. Они негативно влияют на SEO, замедляют сайт и создают путаницу в админке. В этой статье мы подробно разберём, как обнаружить и удалить дубликаты записей в WordPress, используя как готовые плагины, так и собственные скрипты с примерами кода.
Почему появляются дубликаты постов в WordPress
Чаще всего дубликаты появляются из-за:
- Ошибок при импорте контента из CSV, XML или других систем;
- Повторного сохранения записей с одинаковыми заголовками;
- Сбоев в работе плагинов, которые создают записи автоматически;
- Некорректной миграции сайта между разными хостингами;
- Ручного копирования и вставки контента без контроля.
Проблема усугубляется, если на сайте большое количество записей. Ручное удаление дубликатов становится непрактичным, поэтому нужно использовать технические методы.
Как найти дубликаты записей в базе данных WordPress
Для поиска дубликатов удобно использовать SQL-запросы к базе данных. Например, чтобы найти посты с одинаковыми заголовками, выполните следующий запрос через phpMyAdmin или любой другой интерфейс работы с базой данных:
SELECT post_title, COUNT(*) c
FROM wp_posts
WHERE post_type = 'post' AND post_status = 'publish'
GROUP BY post_title
HAVING c > 1;
Этот запрос покажет заголовки, которые встречаются более одного раза среди опубликованных записей.
Для более точного поиска дубликатов можно сравнивать и содержание записей, но это сложнее и требует дополнительных скриптов.
Удаление дубликатов записей с помощью SQL-запроса
После того как вы нашли дубликаты, можно автоматически удалить все кроме одного поста с одинаковым заголовком. Ниже пример запроса, который оставляет самый ранний пост и удаляет остальные:
DELETE p1 FROM wp_posts p1
INNER JOIN wp_posts p2
ON p1.post_title = p2.post_title
AND p1.ID > p2.ID
WHERE p1.post_type = 'post' AND p1.post_status = 'publish';
Этот запрос удалит все дубликаты с большими ID, то есть оставит самый первый пост по дате.
Внимание: перед выполнением любых запросов на удаление обязательно создайте резервную копию базы данных.
Автоматизация удаления дубликатов с помощью PHP-функции в WordPress
Если вы хотите интегрировать процесс удаления дубликатов в админку или запускать периодически, можно использовать PHP-функцию. Ниже пример функции wpmax_remove_duplicate_posts(), которая удаляет дубликаты постов с одинаковыми заголовками, оставляя один:
function wpmax_remove_duplicate_posts() {
global $wpdb;
// Получаем все посты с дубликатами заголовков
$duplicates = $wpdb->get_results(
"SELECT post_title, GROUP_CONCAT(ID ORDER BY ID) as ids, COUNT(*) as count_posts
FROM {$wpdb->posts}
WHERE post_type = 'post' AND post_status = 'publish'
GROUP BY post_title
HAVING count_posts > 1"
);
foreach ($duplicates as $dup) {
$ids = explode(',', $dup->ids);
// Оставляем первый ID, остальные удаляем
array_shift($ids);
foreach ($ids as $delete_id) {
wp_delete_post($delete_id, true); // true – удаляет без перемещения в корзину
}
}
}
// Используйте функцию вручную или привяжите к крону
// wpmax_remove_duplicate_posts();
Эта функция безопаснее, чем прямой SQL-запрос, так как использует WordPress API для удаления, учитывая все связанные данные.
Лучшие плагины для поиска и удаления дубликатов постов
Если вы не хотите писать код, можно воспользоваться готовыми плагинами:
- Remove Duplicate Posts – бесплатный плагин, который помогает находить и удалять дубликаты по заголовку и контенту.
- Duplicate Post Cleaner – плагин с расширенными настройками фильтрации дубликатов и массовым удалением.
- WP Bulk Delete – универсальный инструмент для массового удаления записей по разным условиям, включая дубликаты.
Например, Remove Duplicate Posts прост в использовании и отлично подходит для большинства задач.
Советы по предотвращению появления дубликатов в WordPress
Чтобы минимизировать вероятность появления дубликатов, рекомендуем:
- Использовать уникальные идентификаторы или мета-поля при импорте контента;
- Контролировать работу плагинов, которые создают записи автоматически;
- Добавить проверку на уникальность заголовков при создании поста (можно использовать хуки
wpmax_prevent_duplicate_titleдля этого); - Регулярно проводить аудит базы данных и удалять ненужные записи;
- Резервировать базу данных перед крупными операциями импорта или миграции.
Пример проверки уникальности заголовка при сохранении поста
Для предотвращения сохранения записи с дубликатным заголовком можно использовать такой код:
function wpmax_prevent_duplicate_title( $data , $postarr ) {
global $wpdb;
$post_title = $data['post_title'];
$post_id = isset($postarr['ID']) ? intval($postarr['ID']) : 0;
$exists = $wpdb->get_var($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND ID != %d AND post_type = %s AND post_status != 'trash'",
$post_title, $post_id, $data['post_type']
));
if ($exists) {
// Отменяем сохранение и выводим ошибку
wp_die('Ошибка: запись с таким заголовком уже существует. Пожалуйста, используйте уникальный заголовок.');
}
return $data;
}
add_filter('wp_insert_post_data', 'wpmax_prevent_duplicate_title', 10, 2);
Этот фильтр остановит сохранение записи с дублирующимся заголовком, что значительно снизит количество дубликатов.