Дубликаты постов в WordPress могут возникать по разным причинам: ошибки импорта, некорректная работа плагинов, ручное дублирование контента. Они приводят к ухудшению SEO, путанице пользователей и увеличению нагрузки на базу данных. В этой статье разберём, как найти и удалить дубликаты постов в WordPress с помощью готовых решений и собственного кода.
Почему появляются дубликаты постов в WordPress
Чаще всего дубликаты создаются из-за:
- Ошибок при массовом импорте через CSV или XML.
- Использования некачественных плагинов для клонирования или резервного копирования.
- Случайного создания копий вручную через админку.
- Ошибок синхронизации между несколькими сайтами или мультиязычными плагинами.
Важно вовремя выявлять и устранять дубликаты для поддержания чистоты базы данных и качественного SEO.
Как найти дубликаты постов в базе данных WordPress
Для поиска дубликатов можно использовать SQL-запросы к базе данных. Основные критерии дубликата — совпадение заголовка post_title и статуса post_status. Пример запроса для поиска повторяющихся заголовков:
SELECT post_title, COUNT(*) as count_duplicates
FROM wp_posts
WHERE post_type = 'post' AND post_status = 'publish'
GROUP BY post_title
HAVING count_duplicates > 1;Этот запрос покажет заголовки постов, которые встречаются более одного раза. Аналогично можно искать дубликаты по URL (post_name) или содержимому (post_content), но это сложнее и менее эффективно.
Для более тонкого поиска можно использовать плагин Clearfy Pro, который имеет встроенные инструменты для оптимизации базы и удаления дубликатов контента.
Удаление дубликатов постов через 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-скрипты.
PHP-скрипт для удаления дубликатов постов по заголовку
Предлагаю пример функции с префиксом домена wpquery, которую можно добавить в файл functions.php вашей темы или в плагин:
function wpquery_delete_duplicate_posts() {
global $wpdb;
// Получаем заголовки с количеством дубликатов
$duplicates = $wpdb->get_results(
"SELECT post_title, COUNT(*) as count_duplicates
FROM {$wpdb->posts}
WHERE post_type = 'post' AND post_status = 'publish'
GROUP BY post_title
HAVING count_duplicates > 1"
);
foreach ( $duplicates as $dup ) {
// Получаем все ID постов с таким заголовком
$post_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND post_type = 'post' AND post_status = 'publish' ORDER BY ID ASC",
$dup->post_title
));
// Оставляем первый пост, остальные удаляем
array_shift($post_ids);
foreach ( $post_ids as $id ) {
wp_delete_post($id, true); // true - удаление без перемещения в корзину
}
}
}Для запуска функции достаточно вызвать wpquery_delete_duplicate_posts(). Помните, что данная операция необратима без резервной копии!
Использование плагинов для удаления дубликатов постов
Если хочется избежать работы с кодом и базой напрямую, можно использовать специализированные плагины:
- Delete Duplicate Posts — простой и бесплатный плагин для поиска и удаления дубликатов по заголовку или содержимому.
- Duplicate Post Cleaner — расширенный инструмент с возможностью выбора критериев дубликатов и автоматическим удалением.
- Clearfy Pro — многофункциональный плагин оптимизации WordPress с модулем удаления дубликатов и очистки базы. Поддерживается надежной поддержкой и интеграциями.
При выборе плагина обращайте внимание на совместимость с вашей версией WordPress и отзывы пользователей.
Пример настройки Clearfy Pro для удаления дубликатов
После установки Clearfy Pro перейдите в раздел «Оптимизация базы» и активируйте модуль «Удаление дубликатов». Далее можно выбрать типы записей и запустить анализ. По результатам получите список дубликатов с возможностью массового удаления.
Как предотвратить появление дубликатов в будущем
Чтобы не сталкиваться с проблемой повторно, рекомендуются следующие практики:
- Используйте надежные плагины для клонирования и импорта контента.
- При массовом импорте проверяйте уникальность заголовков и URL.
- Ограничьте права доступа пользователей, чтобы предотвратить случайное дублирование.
- Настройте автоматические проверки и очистку базы через плагины оптимизации, например, Clearfy Pro.
Также полезно интегрировать проверку на дубликаты при создании новых постов с помощью хуков WordPress, например, проверяя в функции wpquery_check_duplicate_on_save_post совпадение заголовков.
function wpquery_check_duplicate_on_save_post($post_id) {
if ( wp_is_post_revision($post_id) ) return;
$post_title = get_post_field('post_title', $post_id);
global $wpdb;
$exists = $wpdb->get_var($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND ID != %d AND post_type = 'post'",
$post_title, $post_id
));
if ( $exists ) {
wp_die('Ошибка: пост с таким заголовком уже существует!');
}
}
add_action('save_post', 'wpquery_check_duplicate_on_save_post');Это поможет заблокировать сохранение поста с уже существующим заголовком.