Как удалить записи со своими пользовательскими полями в WordPress через код

В WordPress часто возникает необходимость массово удалять записи, которые содержат определённые пользовательские поля (мета-поля). Например, если вы реализовали кастомный функционал через пользовательские поля и теперь хотите очистить базу от устаревших данных. В этой статье я подробно расскажу, как это сделать безопасно и эффективно через собственный PHP-код, минуя стандартные инструменты админки, которые не позволяют фильтровать записи по мета-полям.

Почему стандартные инструменты WordPress не подходят

В админке WordPress вы можете фильтровать записи по категориям, меткам, статусу и даже по типу записи, но фильтрации по пользовательским полям нет. Это ограничение создаёт неудобства при управлении большим объёмом контента с кастомной логикой.

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

Основы работы с WP_Query и мета-запросами для поиска по пользовательским полям

Для выборки записей с определённым пользовательским полем нам понадобится использовать класс WP_Query с параметром meta_query. Вот базовый пример:

$args = [
    'post_type' => 'post',
    'meta_query' => [
        [
            'key' => 'my_custom_field',
            'value' => 'value_to_find',
            'compare' => '=',
        ]
    ],
    'posts_per_page' => -1
];
$query = new WP_Query($args);

Этот запрос выбирает все записи типа "post", у которых в мета-поле "my_custom_field" значение равно "value_to_find".

Обработка результатов запроса и удаление записей

После того, как мы получили нужные записи, можно пройтись по ним циклом и удалить каждую с помощью функции wp_delete_post(). Важный момент — перед удалением стоит убедиться, что это действительно те записи, которые нужно удалить, и обязательно делать резервную копию базы данных.

if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        $post_id = get_the_ID();
        // Удаляем запись и все связанные с ней данные
        wp_delete_post($post_id, true); // true — безвозвратно
    }
    wp_reset_postdata();
}

Полный пример функции удаления записей по пользовательскому полю для wpcom.ru

Ниже пример функции с префиксом wpcom_, которую вы можете добавить в файл functions.php вашей темы или в собственный плагин. Функция принимает ключ и значение мета-поля и удаляет все подходящие записи.

function wpcom_delete_posts_by_meta($meta_key, $meta_value) {
    $args = [
        'post_type' => 'post',
        'meta_query' => [
            [
                'key' => $meta_key,
                'value' => $meta_value,
                'compare' => '=',
            ]
        ],
        'posts_per_page' => -1,
        'fields' => 'ids' // Получаем только ID для оптимизации
    ];

    $query = new WP_Query($args);

    if (!empty($query->posts)) {
        foreach ($query->posts as $post_id) {
            // Удаляем безвозвратно
            wp_delete_post($post_id, true);
        }
        return count($query->posts);
    }

    return 0;
}

Для вызова функции, например, чтобы удалить все посты с мета-полем old_data и значением yes, используйте:

$deleted_count = wpcom_delete_posts_by_meta('old_data', 'yes');
echo "Удалено записей: " . $deleted_count;

Поддержка других типов записей и сложных условий

Если у вас есть пользовательские типы записей (custom post types), просто замените параметр 'post_type' => 'post' на нужное значение, например 'post_type' => 'product' или массив типов:

'post_type' => ['post', 'custom_type']

Также можно расширить мета-запрос на несколько условий, например, удалить записи с мета-полем status равным inactive и датой создания позже определённого срока. Вот пример сложного meta_query:

$args = [
    'post_type' => 'post',
    'meta_query' => [
        'relation' => 'AND',
        [
            'key' => 'status',
            'value' => 'inactive',
            'compare' => '=',
        ],
        [
            'key' => 'creation_date',
            'value' => '2023-01-01',
            'compare' => '>',
            'type' => 'DATE'
        ]
    ],
    'posts_per_page' => -1,
    'fields' => 'ids'
];

Риски и рекомендации

Удаление записей — необратимая операция. Рекомендую действовать осторожно:

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

Альтернативы — плагины для управления пользовательскими полями и удалением

Если вы предпочитаете готовые решения, на wpshop.ru есть плагины, которые помогают работать с мета-полями и фильтрами, например, Clearfy Pro оптимизирует работу с мета-данными и базой данных, что косвенно помогает управлять пользовательскими полями. Для более продвинутых задач можно использовать Expert Review для фильтрации и массового управления контентом.

Выводы

Удаление записей по пользовательским полям в WordPress — частая задача для разработчиков и администраторов. Используя WP_Query с мета-запросами и функцию wp_delete_post(), можно быстро и безопасно управлять контентом. Главное — не забывать про резервное копирование и тестирование кода.

Сервис определения шаблона и плагинов на сайте