В процессе работы с WordPress часто возникают ситуации, когда в базе данных появляются дублирующиеся записи. Это может случиться из-за ошибок импорта, некорректной работы плагинов или человеческого фактора. Дублирование контента негативно влияет на SEO, увеличивает размер базы и создает путаницу для пользователей. В этой статье разберем, как найти и удалить дубликаты записей программно, используя PHP-код и возможности WordPress.
Почему появляются дубликаты записей в WordPress
Дубликаты могут возникать по разным причинам:
- Импорт контента из внешних источников без проверки уникальности.
- Ошибки в работе плагинов, которые создают или копируют записи.
- Ручное дублирование записей администратором.
- Сбои в процессе обновления или синхронизации сайта.
Важно понимать, что дубликаты могут иметь одинаковый заголовок, содержимое или метаполя. В зависимости от задачи, критерии уникальности могут отличаться — например, считать дубликатами записи с одинаковым заголовком или же с полностью совпадающим содержимым.
Поиск дубликатов записей в WordPress по заголовку
Самый простой метод — найти записи с одинаковыми заголовками. Для этого можно использовать SQL-запрос, который вернет заголовки, встречающиеся более одного раза:
SELECT post_title, COUNT(*) c FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' GROUP BY post_title HAVING c > 1;Этот запрос покажет заголовки, которые повторяются. Дальше можно получить ID всех записей с этими заголовками и принять решение, какие удалять.
Пример функции для получения ID дубликатов по заголовку
Для автоматизации задачи напишем функцию yarpp_get_duplicate_post_ids(), которая вернет массив ID дублирующихся записей:
function yarpp_get_duplicate_post_ids() {
global $wpdb;
$duplicates = $wpdb->get_results(
"SELECT post_title, GROUP_CONCAT(ID) as ids, COUNT(*) c
FROM {$wpdb->posts}
WHERE post_type = 'post' AND post_status = 'publish'
GROUP BY post_title HAVING c > 1"
);
$duplicate_ids = [];
foreach ($duplicates as $dup) {
$ids = explode(',', $dup->ids);
// Оставляем первую запись, остальные считаем дубликатами
array_shift($ids);
$duplicate_ids = array_merge($duplicate_ids, $ids);
}
return $duplicate_ids;
}Данная функция собирает ID всех записей с повторяющимся заголовком, кроме первой записи (предполагаемой оригинальной).
Удаление дубликатов программно
После того, как мы получили массив ID дубликатов, можно их удалить программно с помощью функции WordPress wp_delete_post(). Ниже пример функции yarpp_delete_duplicates(), которая выполнит удаление:
function yarpp_delete_duplicates() {
$duplicate_ids = yarpp_get_duplicate_post_ids();
foreach ($duplicate_ids as $post_id) {
wp_delete_post($post_id, true); // true - удаление без помещения в корзину
}
}<Рекомендуется запускать такую очистку на тестовом окружении и делать резервные копии базы, чтобы избежать потери нужных данных.
Как запускать очистку дубликатов
Запускать функцию удаления можно несколькими способами:
- Добавить вызов
yarpp_delete_duplicates()в файлfunctions.phpвашей темы и один раз загрузить страницу сайта. - Создать отдельный плагин с данной функцией и запускать через админку.
- Использовать WP-CLI для выполнения кода из командной строки.
Важно после выполнения удалить или закомментировать вызов функции, чтобы не произошло повторного удаления.
Поиск дубликатов по содержимому записи
Иногда заголовки могут быть разными, а вот содержимое совпадать. Для поиска таких дубликатов нужно сравнивать поле post_content. Это более ресурсоемкая задача, но ее можно реализовать с помощью PHP:
function yarpp_find_content_duplicates() {
global $wpdb;
$posts = $wpdb->get_results("SELECT ID, post_content FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish'");
$hashes = [];
$duplicates = [];
foreach ($posts as $post) {
$hash = md5($post->post_content);
if (isset($hashes[$hash])) {
$duplicates[] = $post->ID;
} else {
$hashes[$hash] = $post->ID;
}
}
return $duplicates;
}Здесь мы создаем хэш содержимого каждой записи и если хэш уже встречался, считаем запись дубликатом.
Полезные плагины для работы с дубликатами записей
Если вы не хотите писать код, можно использовать готовые плагины, которые помогут найти и удалить дубликаты:
- Remove Duplicate Posts — бесплатный плагин, который ищет записи с одинаковыми заголовками и предлагает их удалить.
- Bulk Delete — позволяет массово удалять записи по различным критериям, включая дубликаты.
- Duplicate Post Cleaner — расширенный плагин с фильтрами по содержимому и метаданным.
Однако любые автоматические решения требуют осторожности и предварительного резервного копирования.
Советы по предотвращению появления дубликатов
Чтобы не сталкиваться с проблемой дублирования, используйте следующие рекомендации:
- Проверяйте импортируемые данные на уникальность перед загрузкой.
- Настраивайте плагины, которые создают записи, чтобы исключить повторное добавление.
- Используйте уникальные идентификаторы (например, метаполя) для контроля.
- Регулярно проверяйте базу данных на наличие дубликатов и очищайте её.