Дубликаты постов в WordPress — частая проблема, которая может возникать при импорте контента, ошибках плагинов или неправильных настройках. Они негативно влияют на SEO, увеличивают нагрузку на базу данных и ухудшают пользовательский опыт. В этой статье разберём, как найти и удалить дублирующиеся записи программно, используя собственные функции WordPress и SQL-запросы.
Почему появляются дубликаты постов и как это влияет на сайт
Дубликаты постов могут появляться по разным причинам:
- Массовый импорт контента с ошибками;
- Конфликты плагинов и тем;
- Ошибки при клонировании записей;
- Некорректная работа API или внешних сервисов.
Последствия дубликатов:
- Падение позиций в поисковой выдаче из-за повторяющегося контента;
- Увеличение размера базы данных и замедление работы сайта;
- Путаница для посетителей и администраторов;
- Сложности с аналитикой и учётом посетителей.
Как найти дубликаты постов по заголовку и контенту
Первый шаг — идентифицировать дубликаты. Обычно дубликатами считаются записи с одинаковым заголовком post_title или одинаковым содержимым post_content. Для поиска дубликатов можно использовать SQL-запросы напрямую, но лучше — через WP_Query или собственную функцию для гибкости.
Пример запроса, который возвращает заголовки с количеством повторений:
SELECT post_title, COUNT(*) as count FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' GROUP BY post_title HAVING count > 1;Этот запрос покажет заголовки, которые встречаются более одного раза. Аналогично можно сделать для содержания, но это более ресурсоёмко.
Удаление дубликатов с помощью PHP-функции в WordPress
Создадим функцию wpturbo_remove_duplicate_posts(), которая ищет дублирующие заголовки и удаляет все, кроме самой старой записи. Такой подход безопасен и позволяет сохранить оригинал.
function wpturbo_remove_duplicate_posts() {
global $wpdb;
// Получаем дублирующиеся заголовки
$duplicates = $wpdb->get_results(
"SELECT post_title, COUNT(*) as count FROM {$wpdb->posts} \
WHERE post_type = 'post' AND post_status = 'publish' \
GROUP BY post_title HAVING count > 1"
);
foreach ($duplicates as $dup) {
// Получаем все посты с этим заголовком, сортируем по дате публикации
$posts = get_posts([
'title' => $dup->post_title,
'post_type' => 'post',
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'ASC',
'numberposts' => -1
]);
// Оставляем первый пост, остальные удаляем
array_shift($posts); // Удаляем первый из массива — сохраняем
foreach ($posts as $post) {
wp_delete_post($post->ID, true); // Удаляем без перемещения в корзину
}
}
}Вы можете вызвать эту функцию вручную или через WP-CLI для массовой очистки. Обязательно сделайте резервную копию базы данных перед выполнением.
Использование плагинов для поиска и удаления дубликатов
Если предпочитаете готовые решения, рассмотрите следующие плагины:
- Remove Duplicate Posts — удобный плагин для обнаружения и удаления дубликатов по заголовкам и содержимому.
- Clearfy Pro — многофункциональный плагин оптимизации, в том числе с инструментами для чистки базы и удаления дубликатов.
Эти плагины позволяют делать выборочную очистку, резервное копирование и автоматическую проверку.
Как избежать появления дубликатов в будущем
Чтобы не сталкиваться с дублированием, рекомендуем:
- Внедрить проверку при импорте контента — сравнивать заголовки и уникальные идентификаторы;
- Использовать плагины с функцией предотвращения дублирования, например, при клонировании постов;
- Регулярно чистить базу данных, используя WP-CLI или плагины оптимизации;
- Настроить уникальные правила валидации для форм ввода контента.
Например, можно использовать следующий фильтр, который проверяет уникальность заголовка при сохранении поста:
function wpturbo_unique_post_title_check($data, $postarr) {
if ($data['post_type'] === 'post') {
global $wpdb;
$exists = $wpdb->get_var($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND ID != %d AND post_type = 'post' LIMIT 1",
$data['post_title'],
$postarr['ID']
));
if ($exists) {
wp_die('Ошибка: Запись с таким заголовком уже существует. Пожалуйста, измените заголовок.');
}
}
return $data;
}
add_filter('wp_insert_post_data', 'wpturbo_unique_post_title_check', 10, 2);Этот код запрещает сохранение поста с уже существующим заголовком, предотвращая дублирование на уровне админки.
Заключение
Удаление дубликатов постов — важная задача для поддержания здоровья сайта и SEO. Используя SQL-запросы, собственные функции и проверенные плагины, можно эффективно находить и удалять ненужные дубли. Не забывайте про профилактику — лучше предотвратить проблему, чем потом её исправлять.
Для расширенной оптимизации базы данных рекомендуем ознакомиться с плагином Clearfy Pro, который поможет автоматизировать очистку и ускорить работу сайта.