Дубликаты постов в WordPress могут появляться по разным причинам: ошибки импорта, некорректная работа плагинов, пользовательские ошибки. Они негативно влияют на SEO, увеличивают размер базы данных и могут привести к путанице в контенте. В этой статье подробно рассмотрим, как найти и удалить дубликаты записей программно, без использования сторонних плагинов.
Почему важно удалять дубликаты постов в WordPress
Дубликаты создают проблемы на нескольких уровнях. Во-первых, они снижают качество сайта в глазах поисковых систем, что может привести к падению позиций. Во-вторых, избыточные записи увеличивают нагрузку на базу данных, замедляют сайт и затрудняют управление контентом. В-третьих, для пользователей дубликаты создают путаницу и ухудшают восприятие сайта.
Своевременное удаление дубликатов — это часть регулярного технического обслуживания сайта. Часто такие дубликаты появляются после массовых импортов или ошибок в синхронизации контента с внешними сервисами.
Как определить дубликаты постов в WordPress
Дубликаты постов обычно имеют одинаковый заголовок post_title, идентичный контент post_content или совпадающие метаданные. В зависимости от ситуации критерии могут отличаться.
Для начала стоит определить, по каким признакам считать записи дубликатами. Например, чаще всего достаточно проверить совпадение заголовков и типов записей. Если заголовок полностью совпадает, а дата публикации близка — это почти наверняка дубликат.
Для поиска можно использовать SQL-запросы напрямую к базе данных или WP_Query с последующей фильтрацией в PHP.
Пример SQL-запроса для поиска дубликатов по заголовку
Запрос ниже выявляет заголовки постов, которые встречаются более чем один раз:
SELECT post_title, COUNT(*) as cnt FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' GROUP BY post_title HAVING cnt > 1;Этот запрос покажет, какие заголовки повторяются. После этого можно получить ID постов с этими заголовками и решить, какие удалить.
Автоматическое удаление дубликатов с помощью PHP-кода
Для автоматизации процесса удалим все дубликаты, оставив только одну запись с уникальным заголовком. Важно: перед выполнением таких операций обязательно сделайте резервную копию базы данных.
Ниже пример функции, которую можно добавить в файл functions.php вашей темы или создать отдельный плагин:
function wpmoney_delete_duplicate_posts() {
global $wpdb;
// Получаем заголовки дубликатов
$duplicates = $wpdb->get_col(
"SELECT post_title FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' GROUP BY post_title HAVING COUNT(*) > 1"
);
foreach ($duplicates as $title) {
// Получаем все посты с этим заголовком, отсортированные по дате (оставим самый старый)
$posts = $wpdb->get_results($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND post_type = 'post' AND post_status = 'publish' ORDER BY post_date ASC",
$title
));
// Оставляем первый пост, остальные удаляем
if (count($posts) > 1) {
array_shift($posts); // удаляем первый элемент из массива
foreach ($posts as $post) {
wp_delete_post($post->ID, true); // true - чтобы удалить без перемещения в корзину
}
}
}
}
// Запуск функции один раз (например, по хуку admin_init)
add_action('admin_init', 'wpmoney_delete_duplicate_posts');Этот код находит дубликаты по заголовку и удаляет все, кроме самого первого поста. Можно модифицировать логику под свои нужды, например, сравнивать по содержимому или дате.
Как избежать появления дубликатов в будущем
Удаление дубликатов — лишь часть решения. Чтобы не допускать их появления, нужно:
- Использовать корректные импортеры и проверять данные перед массовой загрузкой.
- Настроить уникальность заголовков через валидацию при создании постов.
- Ограничить права пользователей и автоматизировать проверки через хуки WordPress.
Для автоматической проверки при сохранении записи можно использовать фильтр wp_insert_post_data:
function wpmoney_check_duplicate_title($data, $postarr) {
if ($data['post_type'] === 'post' && $data['post_status'] === 'publish') {
global $wpdb;
$exists = $wpdb->get_var($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND post_type = 'post' AND ID != %d LIMIT 1",
$data['post_title'],
$postarr['ID'] ?? 0
));
if ($exists) {
wp_die('Ошибка: Запись с таким заголовком уже существует. Пожалуйста, выберите другой заголовок.');
}
}
return $data;
}
add_filter('wp_insert_post_data', 'wpmoney_check_duplicate_title', 10, 2);Этот код остановит публикацию записи с дублирующимся заголовком и выведет ошибку.
Полезные плагины для работы с дубликатами
Если вы предпочитаете готовые решения, есть несколько плагинов, которые помогут обнаружить и удалить дубликаты:
- Remove Duplicate Posts — простой плагин для поиска и удаления дубликатов.
- Duplicate Post — позволяет клонировать записи, но также можно обнаружить дубли.
Для более комплексных задач оптимизации можно использовать плагин Clearfy от WPGear, который помогает очищать базу и удалять мусорные данные.
Заключение
Удаление дубликатов постов в WordPress — важный шаг для поддержания чистоты базы данных и улучшения SEO. Используя SQL-запросы и PHP-функции, вы можете автоматизировать этот процесс и избежать появления дублирующего контента. Обязательно тестируйте код на тестовом сайте и делайте резервные копии перед изменениями.