Дубликаты постов в WordPress могут появляться по разным причинам: ошибки импорта, некорректные миграции, дублирование контента в ручном режиме. Наличие дубликатов негативно влияет на SEO, расходует ресурсы базы данных и ухудшает пользовательский опыт. В этой статье разберем, как найти и удалить дублирующиеся посты без использования сторонних плагинов, используя SQL-запросы и PHP-код.
Причины появления дубликатов постов и последствия
Чаще всего дубликаты появляются при массовом импорте контента, когда один и тот же пост по ошибке импортируется дважды. Также частая причина — ручное копирование постов без удаления оригинала. Иногда их создают плагины бэкапа или миграции, неправильно обрабатывающие запись.
Последствия дубликатов:
- Снижение позиций сайта в поисковых системах из-за дублей контента;
- Увеличение размера базы данных и замедление запросов;
- Запутанность в админке и неудобство управления контентом.
Поэтому важно регулярно проверять и удалять дубликаты.
Поиск дубликатов постов с помощью SQL-запроса
Самый быстрый способ найти дубликаты — выполнить SQL-запрос к базе данных WordPress. Обычно дубликатами считаются записи с одинаковыми заголовками (post_title) и типом записи (post_type), опубликованные или в статусе черновика.
Пример запроса для поиска дублирующих заголовков среди опубликованных постов:
SELECT post_title, COUNT(*) AS cnt
FROM wp_posts
WHERE post_type = 'post' AND post_status IN ('publish', 'draft')
GROUP BY post_title
HAVING cnt > 1
ORDER BY cnt DESC;Этот запрос покажет заголовки с количеством повторов. Для конкретного заголовка можно получить ID всех дубликатов:
SELECT ID, post_title, post_date
FROM wp_posts
WHERE post_title = 'Заголовок поста' AND post_type = 'post' AND post_status IN ('publish', 'draft');Обратите внимание, что wp_posts — это стандартное имя таблицы, но префикс wp_ может отличаться в вашей базе.
Удаление дубликатов постов с помощью PHP-кода
Можно написать скрипт, который с помощью WP_Query и функционала WordPress найдет дубликаты и удалит их, оставив только один пост с уникальным заголовком.
Пример функции wpcheckerRemoveDuplicatePosts:
function wpcheckerRemoveDuplicatePosts() {
global $wpdb;
$results = $wpdb->get_results(
"SELECT post_title, GROUP_CONCAT(ID ORDER BY ID) AS ids, COUNT(*) AS cnt
FROM {$wpdb->posts}
WHERE post_type = 'post' AND post_status IN ('publish', 'draft')
GROUP BY post_title
HAVING cnt > 1"
);
foreach ($results as $row) {
$ids = explode(',', $row->ids);
// Оставляем первый ID, остальные удаляем
array_shift($ids);
foreach ($ids as $id) {
wp_delete_post($id, true); // true — без возможности восстановления
}
}
}Чтобы запустить этот код, добавьте его во временный плагин или используйте WP CLI. Важно сначала сделать резервную копию базы данных.
Использование WP CLI для удаления дубликатов
Если у вас есть доступ к командной строке, можно автоматизировать процесс через WP CLI. К сожалению, штатных команд для удаления дубликатов нет, но можно написать кастомную команду. Вот пример простого скрипта для WP CLI:
wp eval '
$posts = wpdb->get_results(
"SELECT post_title, GROUP_CONCAT(ID ORDER BY ID) AS ids, COUNT(*) AS cnt
FROM {$wpdb->posts}
WHERE post_type = "post" AND post_status IN ("publish", "draft")
GROUP BY post_title
HAVING cnt > 1"
);
foreach ($posts as $post) {
$ids = explode(",", $post->ids);
array_shift($ids); // оставляем первый
foreach ($ids as $id) {
wp_delete_post($id, true);
}
}
'Эта команда удалит все дубликаты постов, оставив по одному с каждым уникальным заголовком.
Особенности и рекомендации при удалении дубликатов
При удалении дубликатов важно учитывать следующие моменты:
- Связанные данные: комментарии, метаданные и таксономии дубликатов будут удалены вместе с постами.
- Выбор поста для сохранения: в примерах оставляется пост с наименьшим ID. При необходимости можно изменить логику, например, оставить последний по дате.
- Резервное копирование: перед удалением обязательно сделайте полную резервную копию базы данных.
- Проверка результатов: после удаления проверьте сайт на наличие ошибок и корректность отображения контента.
Полезные плагины для контроля дубликатов (опционально)
Хотя задача стояла без плагинов, для контроля и предотвращения появления дубликатов можно использовать плагины:
- Clearfy Pro — мощный инструмент для оптимизации и очистки базы, включая работу с дубликатами.
- WPRemark — управление отзывами, помогает избежать повторяющихся отзывов и комментариев.
Выводы
Удаление дубликатов постов в WordPress без использования плагинов — задача вполне решаемая с помощью SQL и PHP. Главное — аккуратность, резервное копирование и тестирование. Следите за целостностью контента и периодически проверяйте сайт на наличие дублирующих записей, чтобы поддерживать высокое качество и скорость работы ресурса.