Дубликаты постов в WordPress могут появляться по разным причинам: сбои при импорте контента, ошибки в плагинах, ручное дублирование или технические сбои. Они негативно влияют на SEO, увеличивают размер базы данных и ухудшают пользовательский опыт. В этой статье мы подробно разберём, как найти и удалить дубликаты постов в WordPress, используя как готовые плагины, так и собственные SQL-запросы и PHP-код.
Почему появляются дубликаты постов и как это влияет на сайт
Чаще всего дублирование происходит при импорте контента с ошибками, либо из-за неправильно настроенных плагинов, которые создают копии записей. Иногда пользователи вручную дублируют записи для изменения, забывая потом удалить старые. Также дубликаты могут появляться из-за багов в теме или ошибках обновлений. Это приводит к:
- Падению позиций сайта в поисковых системах из-за дублированного контента.
- Увеличению размера базы данных и замедлению работы сайта.
- Запутыванию в админке и неудобству управления контентом.
Как найти дубликаты постов в базе данных WordPress с помощью SQL
Самый точный способ — использовать SQL-запросы для поиска записей с одинаковыми заголовками или контентом. Ниже пример запроса, который находит заголовки, встречающиеся более одного раза:
SELECT post_title, COUNT(*) as count_posts
FROM wp_posts
WHERE post_type = 'post' AND post_status = 'publish'
GROUP BY post_title
HAVING count_posts > 1
ORDER BY count_posts DESC;
Этот запрос покажет вам, какие заголовки встречаются чаще одного раза. Далее можно получить ID этих записей и вручную или программно удалить лишние.
Аналогично можно искать дубликаты по содержимому:
SELECT SUBSTRING(post_content, 1, 100) as content_snippet, COUNT(*) as count_posts
FROM wp_posts
WHERE post_type = 'post' AND post_status = 'publish'
GROUP BY content_snippet
HAVING count_posts > 1
ORDER BY count_posts DESC;
Этот запрос группирует записи по первым 100 символам контента, чтобы выявить похожие записи.
Удаление дубликатов постов с помощью пользовательской функции WordPress
Для автоматизации удаления дубликатов можно создать функцию, которая будет искать записи с одинаковыми заголовками и удалять все, кроме одной. Ниже пример такой функции с префиксом wpdream_:
function wpdream_delete_duplicate_posts() {
global $wpdb;
$duplicates = $wpdb->get_results(
"SELECT post_title, MIN(ID) as keep_id, GROUP_CONCAT(ID) as all_ids, COUNT(*) as cnt
FROM {$wpdb->posts}
WHERE post_type = 'post' AND post_status = 'publish'
GROUP BY post_title
HAVING cnt > 1"
);
foreach ( $duplicates as $dup ) {
$all_ids = explode(',', $dup->all_ids);
foreach ( $all_ids as $id ) {
if ( $id != $dup->keep_id ) {
wp_delete_post( $id, true ); // true — принудительное удаление
}
}
}
echo 'Дубликаты удалены';
}
// Для запуска функции: wpdream_delete_duplicate_posts();
Эту функцию можно запускать в файле темы или подключать через плагин. Рекомендуется сначала сделать резервную копию базы данных.
Плагины для поиска и удаления дубликатов постов
Если вы предпочитаете готовые решения, обратите внимание на следующие плагины:
- Remove Duplicate Posts — простой плагин, который ищет дубликаты по заголовку и контенту, позволяет удалять их массово.
- Duplicate Post Cleaner — более продвинутый, позволяет настраивать критерии совпадения, поддерживает фильтры по типу записей.
- Clearfy Pro — универсальный плагин для оптимизации WordPress, в том числе включает инструменты для удаления дубликатов и оптимизации базы данных.
Плагины удобны для пользователей без навыков программирования, но они могут не покрывать все случаи дублирования.
Как предотвратить появление дубликатов постов в будущем
Чтобы избежать повторного появления дубликатов, рекомендуем:
- При импорте контента использовать проверенные инструменты с опцией пропуска дубликатов.
- Контролировать работу плагинов, которые создают записи, и следить за обновлениями.
- Внедрять уникальные правила для заголовков, например, автоматически добавлять дату или уникальный идентификатор.
- Использовать плагины типа Clearfy Pro, которые помогают оптимизировать работу и следить за контентом.
Пример кода для автоматического добавления уникального суффикса к заголовку
Если в вашем проекте часто дублируются заголовки, можно подключить такой фильтр:
function wpdream_unique_post_title( $title, $post_id ) {
global $wpdb;
$count = $wpdb->get_var( $wpdb->prepare(
"SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_title = %s AND ID != %d",
$title,
$post_id
) );
if ( $count > 0 ) {
$title .= ' ('.uniqid().')';
}
return $title;
}
add_filter( 'the_title', 'wpdream_unique_post_title', 10, 2 );
Этот код добавляет уникальный идентификатор к заголовку, если такой уже существует.
Итоги
Удаление дубликатов постов — важный этап поддержания чистоты и производительности WordPress сайта. Используйте SQL-запросы для диагностики, автоматизируйте процесс через PHP-функции или плагины. Не забывайте создавать резервные копии перед массовыми удалениями и следите за качеством контента, чтобы предотвращать повторное появление дубликатов.