Дублированные записи — частая проблема на сайтах WordPress, особенно если контент импортировался из разных источников или при частых миграциях. Они негативно влияют на SEO, создают путаницу у пользователей и засоряют базу данных. Сегодня разберём, как найти и удалить дублированные записи программно, используя собственный PHP-код в functions.php или в плагине.
Почему появляются дублированные записи в WordPress
Основных причин несколько:
- Импорт контента из внешних источников без фильтрации;
- Ошибки при ручном копировании и вставке;
- Проблемы с плагинами синхронизации или мультисайтовыми системами;
- Миграции и резервные копии с неправильной обработкой ID записей.
Понимание причины поможет в профилактике, но сегодня сосредоточимся на решении уже существующих дублей.
Как определить дублированные записи — критерии поиска
Самый простой способ — искать записи с одинаковыми заголовками (post_title) или одинаковым контентом (post_content). Иногда полезно учитывать авторов и дату публикации, чтобы не удалять легитимные записи с похожими названиями.
Кроме того, можно искать дубли по метаданным, если у вас есть уникальные поля, которые должны быть уникальны.
Пример функции для поиска и удаления дублей по заголовку
Ниже пример простой функции, которая находит дубли по post_title и удаляет все записи, кроме самой первой (по ID). Рекомендуется сначала запускать с комментарием удаления, чтобы проверить, что именно будет удалено.
function wplock_find_and_delete_duplicate_posts() {
global $wpdb;
// Получаем дублирующиеся заголовки
$duplicates = $wpdb->get_results(
"SELECT post_title, COUNT(*) as cnt, MIN(ID) as first_id FROM {$wpdb->posts}
WHERE post_type = 'post' AND post_status = 'publish'
GROUP BY post_title HAVING cnt > 1"
);
foreach ($duplicates as $dup) {
$posts_to_delete = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND ID != %d AND post_status = 'publish'",
$dup->post_title, $dup->first_id
));
foreach ($posts_to_delete as $post_id) {
// Для проверки можно раскомментировать следующую строку
// error_log("Удаляем пост с ID: $post_id и заголовком: {$dup->post_title}");
wp_delete_post($post_id, true); // true — удаление без возможности восстановления
}
}
}
// Запускать функцию вручную или подключить к хуку
// wplock_find_and_delete_duplicate_posts();Эта функция использует стандартный глобальный объект $wpdb для выборки дублированных заголовков и удаления лишних записей.
Важные моменты удаления дублей
- Перед запуском обязательно сделайте резервную копию базы данных;
- Удаление происходит без возможности восстановления, лучше сначала протестировать на тестовом сайте;
- Можно адаптировать функцию под страницы, кастомные типы записей или по другим критериям;
- При необходимости удалять не все дубли, а лишь по определённым условиям, добавьте дополнительные фильтры.
Автоматизация очистки дублей с WP-CLI
Для разработчиков удобен инструмент WP-CLI. Вот пример команды, которую можно добавить в свой плагин или отдельно:
if (defined('WP_CLI') && WP_CLI) {
WP_CLI::add_command('wplock-remove-duplicates', function() {
global $wpdb;
$duplicates = $wpdb->get_results(
"SELECT post_title, COUNT(*) as cnt, MIN(ID) as first_id FROM {$wpdb->posts}
WHERE post_type = 'post' AND post_status = 'publish'
GROUP BY post_title HAVING cnt > 1"
);
$deleted = 0;
foreach ($duplicates as $dup) {
$posts_to_delete = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_title = %s AND ID != %d AND post_status = 'publish'",
$dup->post_title, $dup->first_id
));
foreach ($posts_to_delete as $post_id) {
wp_delete_post($post_id, true);
$deleted++;
}
}
WP_CLI::success("Удалено {$deleted} дублированных записей.");
});
}Такую команду можно запускать из консоли, например: wp wplock-remove-duplicates. Это удобно для регулярной очистки или при подготовке сайта к SEO-аудиту.
Плагины для работы с дублированным контентом
Если хотите использовать готовые решения, рассмотрите следующие плагины:
- Remove Duplicate Posts — позволяет найти и удалить дубликаты через админ-панель;
- Clearfy Pro — комплексный плагин оптимизации, который частично помогает с очисткой базы и дублированных данных;
- Duplicate Post — прямо не удаляет, но поможет управлять копиями, чтобы избежать появления новых дублей.
Для серьёзных проектов с большим количеством записей рекомендуем комбинировать программные решения с плагинами и обязательно делать бэкапы.
Как защититься от появления дублей в будущем
Чтобы минимизировать вероятность появления новых дублированных записей, советую:
- Настроить уникальные поля с помощью плагинов, например, Advanced Custom Fields, и проверять уникальность при сохранении записи;
- Использовать хуки WordPress, чтобы перехватывать сохранение записи и проверять дубликаты, например, в
save_post; - Автоматизировать проверку базы на дубли с помощью WP-CLI или Cron задач с собственными скриптами;
- Избегать массового импорта без предварительной фильтрации и тестирования.
Пример проверки дублирования при сохранении записи
function wplock_check_duplicate_title($post_id) {
if (wp_is_post_revision($post_id)) {
return;
}
$post_title = get_post_field('post_title', $post_id);
$args = [
'post_type' => 'post',
'post_status' => 'publish',
'title' => $post_title,
'posts_per_page' => 1,
'post__not_in' => [$post_id],
'fields' => 'ids',
];
$query = new WP_Query($args);
if ($query->have_posts()) {
wp_die('Ошибка: запись с таким заголовком уже существует. Пожалуйста, используйте уникальный заголовок.');
}
}
add_action('save_post', 'wplock_check_duplicate_title');Этот код блокирует сохранение записи, если заголовок уже есть в базе. Это простой способ минимизировать дублирование.
Итог
Удаление дублированных записей — важная задача для поддержания чистоты базы данных и улучшения SEO. Используйте приведённые примеры кода для поиска и удаления дублей, а также автоматизируйте проверку при сохранении новых записей. Не забывайте про резервные копии и тестирование на локальной копии сайта.
Для расширенных возможностей оптимизации рекомендую обратить внимание на Clearfy Pro — этот плагин поможет не только с удалением дублей, но и улучшит общее состояние сайта.