Как удалить повторяющиеся посты в WordPress без плагинов

Диагностика проблемы повторяющихся постов в WordPress

Повторяющиеся записи (посты) в WordPress могут возникать при импортах данных, ошибках миграции, сбоях плагинов или ручном дублировании. Они создают путаницу для пользователей и ухудшают SEO, поскольку поисковые системы могут считать это дублированным контентом.

Чтобы убедиться, что у вас есть повторяющиеся записи, выполните SQL-запрос в phpMyAdmin или через wpdb:

SELECT post_title, COUNT(*) AS count FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' GROUP BY post_title HAVING count > 1;

Этот запрос покажет заголовки постов, которые встречаются более одного раза, и количество повторов.

Пошаговое решение удаления дубликатов без плагинов

1. Создайте резервную копию базы данных

Перед удалением обязательно сделайте полную резервную копию базы данных, чтобы можно было восстановить данные в случае ошибки.

2. Определите критерии дублирования

В большинстве случаев дубликаты определяются по post_title и post_type. Иногда полезно учитывать post_date или post_content, чтобы избежать случайного удаления уникальных постов с одинаковыми названиями.

3. Найдите ID всех дублирующихся постов

SELECT ID, post_title FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_title, ID;

Вы можете экспортировать этот список и вручную проверить дубли.

4. Удалите дубликаты программно через wp-cli или скрипт

Пример простого PHP-скрипта для удаления дубликатов, оставляя запись с минимальным ID:

<?php
// Убедитесь, что запускаете скрипт в среде WordPress
require_once('wp-load.php');

global $wpdb;

// Получаем все заголовки с их ID
$posts = $wpdb->get_results("SELECT ID, post_title FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_title, ID");

$last_title = '';
$ids_to_delete = [];
foreach ($posts as $post) {
    if ($post->post_title === $last_title) {
        // Этот пост - дубликат
        $ids_to_delete[] = $post->ID;
    } else {
        $last_title = $post->post_title;
    }
}

if (!empty($ids_to_delete)) {
    foreach ($ids_to_delete as $id) {
        wp_delete_post($id, true); // true - без перемещения в корзину
    }
    echo 'Удалено дубликатов: ' . count($ids_to_delete);
} else {
    echo 'Дубликаты не найдены';
}
?>

Проверка результата после удаления

Повторно выполните SQL-запрос диагностики, описанный выше. Если результат пуст, значит дубликаты успешно удалены.

Также проверьте фронтенд сайта, чтобы убедиться, что нужные записи отображаются корректно и ссылки не ведут на удалённые посты.

Частые ошибки и как их исправить

  • Удаление нужных записей из-за неправильных критериев дублирования. Решение: добавьте дополнительную проверку по дате или уникальным метаданным.
  • Ошибка в SQL-запросах из-за префикса таблиц. Решение: всегда используйте $wpdb->posts вместо жестко прописанного wp_posts.
  • Проблемы с правами доступа при запуске скрипта. Решение: запускать скрипт с достаточными правами или через wp-cli.
  • Удалённые посты не удаляют связанные метаданные. Решение: использовать функцию wp_delete_post с вторым аргументом true, чтобы удалить всё полностью.

Практические советы по безопасности и производительности

  • Перед массовым удалением всегда делайте резервную копию базы данных.
  • Запускайте скрипты удаления на тестовом сервере, чтобы не повредить живой сайт.
  • Для больших сайтов разбивайте удаление на пакеты по 100-200 записей, чтобы не перегружать базу.
  • Используйте wp-cli для управления большими объемами данных — это быстрее и безопаснее.
  • После удаления оптимизируйте таблицу wp_posts через phpMyAdmin или SQL-запросом OPTIMIZE TABLE wp_posts;.

Сравнение методов удаления дубликатов

МетодПреимуществаНедостаткиКогда использовать
Ручное удаление через админкуПростота, не требует технических навыковНевозможно при большом количестве, риск пропускаМало дубликатов
SQL-запросы напрямуюБыстро, без установки плагиновРиск ошибки, требует знаний SQLОпытные разработчики
Скрипт на PHP с wp_delete_postБезопасное удаление с очисткой метаданныхТребует доступа к серверу и навыков PHPСредние и крупные сайты
Плагины для удаления дубликатовУдобство, интерфейсЗависимость от сторонних решений, нагрузкаБыстрое решение без кода
Как создать автоматическую резервную копию WordPress
19.11.2025
Как удалить старые изображения из WordPress: эффективные методы
22.02.2026
Как удалить или отключить REST API WordPress без потери функциональности
25.01.2026
Как избежать конфликтов между WooCommerce и плагинами для оптимизации производительности
25.06.2026
Как использовать WP-Cron для автоматизации задач в WordPress
24.05.2026