В ряде случаев возникает необходимость массово удалить записи (посты, страницы или кастомные типы записей) вместе с их метаданными без использования дополнительных плагинов. Это может быть связано с очисткой базы данных, удалением устаревшего контента или оптимизацией сайта.
Почему удаление записей и метаданных важно
Стандартное удаление записи через админку WordPress помещает запись в корзину, а метаданные могут оставаться в базе, занимая место и замедляя работу сайта. Если требуется полностью очистить базу — удаление записи вместе с метаданными и, возможно, комментариями — лучший подход.
Удаление метаданных помогает избежать «мусорных» данных в таблицах wp_postmeta, которые могут накапливаться и влиять на производительность.
Как удалить запись и связанные метаданные программно
Для удаления записи и всех связанных с ней метаданных в WordPress можно использовать встроенную функцию wp_delete_post(). Важно передать второй параметр $force_delete = true, чтобы удалить запись без перемещения в корзину.
function wpall_delete_post_and_meta($post_id) {
if (!current_user_can('delete_post', $post_id)) {
return false; // Нет прав на удаление
}
// Удаляем запись и все связанные данные без корзины
$result = wp_delete_post($post_id, true);
return $result !== false;
}Данная функция удалит запись, все метаданные и связанные с ней комментарии.
Пример вызова функции:
$deleted = wpall_delete_post_and_meta(123);
if ($deleted) {
echo 'Запись успешно удалена вместе с метаданными';
} else {
echo 'Ошибка удаления или недостаточно прав';
}Удаление записей по определённому критерию
Если нужно удалить сразу несколько записей, например, все записи кастомного типа или старше определённой даты, можно использовать WP_Query и проходить по результатам в цикле, вызывая нашу функцию удаления.
function wpall_delete_old_custom_posts($post_type, $date_before) {
$args = [
'post_type' => $post_type,
'date_query' => [
[
'before' => $date_before,
'inclusive' => true,
],
],
'posts_per_page' => -1,
'fields' => 'ids',
'post_status' => 'any',
];
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $post_id) {
wpall_delete_post_and_meta($post_id);
}
}
}Например, вызов wpall_delete_old_custom_posts('my_custom_type', '2022-01-01'); удалит все записи типа my_custom_type, опубликованные до 1 января 2022 года.
Удаление метаданных напрямую через SQL
Иногда эффективнее удалить метаданные напрямую через SQL-запрос, особенно когда нужно удалить данные по определённому ключу или группе записей.
Пример запроса для удаления метаданных с ключом _my_custom_meta_key:
DELETE pm FROM wp_postmeta pm
INNER JOIN wp_posts p ON pm.post_id = p.ID
WHERE pm.meta_key = '_my_custom_meta_key'
AND p.post_type = 'my_custom_type';<Важно делать резервные копии базы перед выполнением таких запросов и убедиться в правильности условий, чтобы не удалить нужные данные.
Пример функции для удаления метаданных по ключу:
function wpall_delete_postmeta_by_key($meta_key) {
global $wpdb;
$meta_key = sanitize_key($meta_key);
$table = $wpdb->postmeta;
$deleted = $wpdb->query(
$wpdb->prepare("DELETE FROM $table WHERE meta_key = %s", $meta_key)
);
return $deleted !== false;
}Рекомендации по безопасности и производительности
Удаление записей и метаданных — операция необратимая, поэтому всегда:
- Создавайте резервные копии базы данных перед массовыми операциями.
- Проверяйте права пользователя (в коде выше пример с проверкой
current_user_can). - Не выполняйте большие циклы удаления на страницах с высокой нагрузкой, лучше запускать такие операции через WP-CLI или cron-задачи.
- Используйте транзакции при работе напрямую с базой, если это поддерживается.
Полезные плагины для управления удалением (опционально)
Хотя статья про удаление без плагинов, иногда удобно использовать специализированные плагины:
- Clearfy Pro — имеет функции оптимизации базы и удаления мусорных данных.
- WPRemark — помогает управлять комментариями и отзывами, включая удаление спама.
Выводы
Удаление записей и метаданных напрямую через код позволяет гибко управлять контентом и базой данных WordPress без лишних плагинов. Следуйте рекомендациям по безопасности и тестируйте операции на копии сайта.