В 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(), можно быстро и безопасно управлять контентом. Главное — не забывать про резервное копирование и тестирование кода.