Дублирование записей в WordPress — частая проблема, которая может возникнуть по разным причинам: ошибки импорта, некорректные миграции данных или сбои в работе плагинов. Наличие дубликатов негативно влияет на SEO и пользовательский опыт, поэтому важно их своевременно находить и удалять.
Почему появляются дубликаты записей в WordPress
Дублированные записи могут появляться из-за:
- Импорта контента без проверки уникальности;
- Ошибок в плагинах, создающих записи автоматически;
- Ручного копирования контента без изменения идентификаторов;
- Некорректной работы кастомных скриптов и миграций.
Понимание причин поможет избежать повторного появления дубликатов после их удаления.
Как обнаружить дубликаты записей в базе данных WordPress
Самый надежный способ — поиск по базе данных. Обычно дубликатами считаются записи с одинаковым заголовком (post_title) и/или содержимым (post_content).
Пример SQL-запроса для поиска дубликатов по заголовку:
SELECT post_title, COUNT(*) c FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' GROUP BY post_title HAVING c > 1;Этот запрос выведет заголовки, которые повторяются более одного раза. Аналогично можно искать по содержимому.
Для более точной проверки можно использовать дополнительные поля, например, post_date или post_author.
Удаление дубликатов через код: пример функции для WPLite
Ниже пример функции wplite_delete_duplicate_posts(), которая удаляет все дубли по заголовку, оставляя только одну запись (с минимальным ID).
function wplite_delete_duplicate_posts() {
global $wpdb;
// Находим дубли по заголовку
$duplicates = $wpdb->get_results(
"SELECT post_title, MIN(ID) as keep_id FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' GROUP BY post_title HAVING COUNT(*) > 1"
);
foreach ($duplicates as $dup) {
// Удаляем все записи с этим заголовком кроме той, что с минимальным ID
$wpdb->query($wpdb->prepare(
"DELETE FROM {$wpdb->posts} WHERE post_title = %s AND ID != %d",
$dup->post_title,
$dup->keep_id
));
}
echo 'Дубликаты удалены.';
}Эту функцию можно вызвать из административной части или через WP-CLI. Важно делать резервную копию базы перед удалением.
Плагины для удаления дубликатов записей в WordPress
Если вы не хотите работать напрямую с кодом, воспользуйтесь готовыми плагинами:
- Remove Duplicate Posts — простой и удобный плагин для поиска и удаления дубликатов по заголовку или содержимому. Позволяет выбирать, какие записи сохранять.
- Clearfy Pro — комплексный плагин для оптимизации и очистки сайта, включает инструменты для поиска и удаления дубликатов контента и метаданных.
- WP Bulk Delete — мощный инструмент для массового удаления записей с гибкими условиями, включая дубликаты.
Использование плагинов значительно упрощает процедуру и минимизирует риск ошибок.
Автоматизация удаления дубликатов с помощью WP-CLI
Для опытных администраторов и разработчиков удобен способ удаления через WP-CLI. Пример команды, которая выведет дубли по заголовку:
wp db query "SELECT post_title, COUNT(*) c FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' GROUP BY post_title HAVING c > 1;"Далее можно написать скрипт на PHP с использованием WP-CLI для удаления дубликатов, например:
function wplite_cli_delete_duplicates() {
$posts = get_posts([
'post_type' => 'post',
'posts_per_page' => -1,
'post_status' => 'publish',
]);
$titles = [];
foreach ($posts as $post) {
if (isset($titles[$post->post_title])) {
wp_delete_post($post->ID, true);
} else {
$titles[$post->post_title] = true;
}
}
WP_CLI::success('Дубликаты удалены через WP-CLI.');
}Эту функцию можно подключить как кастомную команду WP-CLI.
Советы для предотвращения появления дубликатов
Чтобы не сталкиваться с этой проблемой в будущем, рекомендуем:
- Перед импортом данных использовать проверку на уникальность;
- Использовать плагины с хорошей репутацией и проверять логи ошибок;
- При написании своих скриптов добавлять проверки на существование записей с таким же заголовком или уникальным полем;
- Регулярно делать аудит базы данных с помощью плагинов типа Clearfy Pro или WP-Optimize.
Профилактика значительно сэкономит время и ресурсы.