Проблема дублирующихся постов в WordPress встречается довольно часто, особенно на сайтах с большим объемом контента или при автоматическом импорте данных из внешних источников. Повторяющиеся записи не только ухудшают SEO-показатели сайта, но и создают неудобства для посетителей. В этой статье мы подробно рассмотрим, как найти и удалить автоматические повторяющиеся посты в WordPress, используя как готовые плагины, так и собственные решения на PHP.
Почему появляются дублирующиеся посты в WordPress
Дублирование контента может возникать по нескольким причинам:
- Импорт данных из внешних источников с ошибками или без фильтрации;
- Ошибки в работе плагинов для автоматической публикации;
- Ручное копирование постов без корректного изменения URL и заголовков;
- Некорректные настройки кеширования, приводящие к повторной публикации;
- Проблемы с синхронизацией сайта и мобильных приложений, создающих записи.
Выявить дубли можно по совпадению заголовков, URL, содержимого или метаданных.
Как найти дублирующиеся записи: SQL-запросы и WP_Query
Для начала важно определить, какие записи повторяются. Один из способов — использовать SQL-запрос к базе данных WordPress, чтобы выявить одинаковые заголовки или URL.
Пример SQL-запроса для поиска дублирующихся заголовков
SELECT post_title, COUNT(*) c FROM wp_posts
WHERE post_type = 'post' AND post_status = 'publish'
GROUP BY post_title HAVING c > 1;
Этот запрос покажет все заголовки, которые встречаются более одного раза среди опубликованных постов.
Поиск дубликатов через WP_Query с PHP
Если вы хотите найти дубли в коде плагина или темы, можно использовать функцию с префиксом домена wpcodex_find_duplicate_posts():
function wpcodex_find_duplicate_posts() {
global $wpdb;
$query = "SELECT post_title, GROUP_CONCAT(ID) as ids, COUNT(*) as count
FROM {$wpdb->posts}
WHERE post_type = 'post' AND post_status = 'publish'
GROUP BY post_title
HAVING count > 1";
return $wpdb->get_results($query);
}
$duplicates = wpcodex_find_duplicate_posts();
foreach ($duplicates as $dup) {
echo 'Дублирующийся заголовок: ' . esc_html($dup->post_title) . ' (ID: ' . $dup->ids . ')<br>';
}
Этот код выводит заголовки и ID повторяющихся постов.
Удаление дублирующихся постов вручную и автоматизировано
После того как дубли найдены, возникает задача их удаления. Сделать это можно вручную через админку, но при большом количестве записей это неудобно. Рекомендуется автоматизировать процесс.
Автоматическое удаление дубликатов с помощью PHP-функции
Ниже пример функции wpcodex_delete_duplicate_posts(), которая оставляет только одну запись с уникальным заголовком и удаляет остальные:
function wpcodex_delete_duplicate_posts() {
global $wpdb;
// Получаем дубли по заголовку
$duplicates = $wpdb->get_results(
"SELECT post_title, GROUP_CONCAT(ID ORDER BY ID ASC) as ids, 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) {
$ids = explode(',', $dup->ids);
// Оставляем первый ID, остальные удаляем
$ids_to_delete = array_slice($ids, 1);
foreach ($ids_to_delete as $id) {
wp_delete_post($id, true); // true - безвозвратно
echo 'Удален пост ID: ' . esc_html($id) . '<br>';
}
}
}
// Запуск функции
wpcodex_delete_duplicate_posts();
Перед запуском функции обязательно сделайте резервную копию базы данных. Можно запускать этот код в файле плагина или через WP-CLI.
Использование плагинов для удаления дубликатов
Если вы предпочитаете готовые решения, обратите внимание на плагины:
- Remove Duplicate Posts — позволяет искать и удалять дубли по заголовкам и содержимому;
- Duplicate Post — плагин для копирования, но с настройками, позволяющими контролировать дубли;
- Clearfy Pro — мощный инструмент для оптимизации и очистки базы, включая удаление дубликатов.
Использование плагина Clearfy Pro будет особенно полезно, если вы хотите одновременно оптимизировать сайт и избавиться от повторов в автоматическом режиме.
Профилактика появления дублирующихся постов
Чтобы не сталкиваться с повторяющимися записями в будущем, рекомендуем:
- Настроить уникальность заголовков и URL при импорте данных;
- Использовать функции проверки наличия поста перед созданием нового (например, с помощью WP_Query или SQL);
- Регулярно очищать базу и мониторить появление дублей;
- Контролировать работу плагинов автопубликации и импортёров;
- Внедрять кастомные проверки в коде темы или плагинов с префиксом
wpcodex_, чтобы избежать повторной публикации.
Пример проверки существующего поста перед добавлением
function wpcodex_check_post_exists_by_title($title) {
$args = [
'post_type' => 'post',
'post_status' => 'publish',
'title' => $title,
'fields' => 'ids',
'posts_per_page' => 1
];
$query = new WP_Query($args);
return !empty($query->posts);
}
// Использование
if (!wpcodex_check_post_exists_by_title('Заголовок')) {
// Создаем пост
}
Эта проверка поможет предотвратить создание дублей по названию.