В процессе разработки и администрирования сайтов на WordPress часто возникает необходимость массового удаления записей, например, постов, страниц или произвольных типов записей. Особенно удобно удалять записи, если известен набор их ID — уникальных идентификаторов в базе данных. В этой статье мы подробно разберём, как программно удалить записи по массиву ID, учитывая особенности WordPress, и приведём несколько практических примеров с кодом.
Почему важно использовать встроенные функции WordPress для удаления записей
WordPress хранит записи в таблице wp_posts и связывает их с метаданными, таксономиями и другими сущностями. Простое удаление строк из базы данных через SQL может привести к неконсистентности данных, например, оставит «висеть» метаданные или связи с категориями. Чтобы избежать таких проблем, нужно использовать API WordPress, который корректно удалит запись и все связанные с ней данные.
Основной функцией для удаления записей является wp_delete_post(). Она принимает ID записи и параметр, указывающий, нужно ли удалять запись безвозвратно (без помещения в корзину).
Использование этой функции гарантирует, что WordPress выполнит все необходимые операции по очистке данных.
Удаление нескольких записей по массиву ID: пример функции
Для массового удаления удобно создать свою функцию, которая принимает массив ID и удаляет каждую запись по очереди через wp_delete_post(). Вот пример такой функции с подробными комментариями.
function wpconfig_delete_posts_by_ids(array $post_ids, bool $force_delete = false) {
if (empty($post_ids)) {
return false; // Нет ID для удаления
}
foreach ($post_ids as $post_id) {
// Проверяем, что ID это число
$post_id = intval($post_id);
if ($post_id > 0) {
// Удаляем запись. Если $force_delete=true – удаляем безвозвратно
wp_delete_post($post_id, $force_delete);
}
}
return true;
}Пример использования:
$ids_to_delete = [12, 34, 56];
wpconfig_delete_posts_by_ids($ids_to_delete, true); // Удаление безвозвратное
В этом примере мы удаляем записи с ID 12, 34 и 56 без помещения в корзину. Если $force_delete передать как false, записи будут перемещены в корзину, что полезно для возможности восстановления.
Обработка ошибок и проверка прав пользователя
При удалении записей важно убедиться, что у пользователя, запускающего удаление, есть соответствующие права. Обычно это права на редактирование или удаление записей.
Расширим функцию, чтобы она проверяла права текущего пользователя и возвращала массив результатов для каждого ID:
function wpconfig_delete_posts_with_check(array $post_ids, bool $force_delete = false) {
if (empty($post_ids)) {
return [];
}
$results = [];
foreach ($post_ids as $post_id) {
$post_id = intval($post_id);
if ($post_id <= 0) {
$results[$post_id] = 'invalid_id';
continue;
}
$post = get_post($post_id);
if (!$post) {
$results[$post_id] = 'not_found';
continue;
}
// Проверяем права текущего пользователя
if (!current_user_can('delete_post', $post_id)) {
$results[$post_id] = 'no_permission';
continue;
}
$deleted = wp_delete_post($post_id, $force_delete);
if ($deleted) {
$results[$post_id] = 'deleted';
} else {
$results[$post_id] = 'failed';
}
}
return $results;
}Такой подход помогает отладить процесс удаления и понять, почему какие-то записи не удалились.
Автоматизация удаления с помощью AJAX в админке WordPress
Если нужно предоставить инструмент для удаления записей по массиву ID из админки, удобно использовать AJAX. Для этого создадим AJAX-обработчик, который будет принимать массив ID, проверять права и удалять записи.
Пример регистрации AJAX-обработчика:
add_action('wp_ajax_wpconfig_delete_posts', 'wpconfig_ajax_delete_posts_handler');
function wpconfig_ajax_delete_posts_handler() {
// Проверяем nonce для безопасности
check_ajax_referer('wpconfig_delete_posts_nonce', 'security');
if (!current_user_can('delete_posts')) {
wp_send_json_error('no_permission');
}
$post_ids = isset($_POST['post_ids']) ? (array) $_POST['post_ids'] : [];
$force_delete = isset($_POST['force_delete']) && $_POST['force_delete'] === '1';
$result = wpconfig_delete_posts_with_check($post_ids, $force_delete);
wp_send_json_success($result);
}Для подключения скрипта с AJAX-запросом в админке используйте wp_enqueue_script и передайте туда nonce и URL AJAX:
function wpconfig_enqueue_admin_scripts() {
wp_enqueue_script('wpconfig-admin-delete', plugin_dir_url(__FILE__) . 'admin-delete.js', ['jquery'], null, true);
wp_localize_script('wpconfig-admin-delete', 'wpconfigAjax', [
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wpconfig_delete_posts_nonce'),
]);
}
add_action('admin_enqueue_scripts', 'wpconfig_enqueue_admin_scripts');В файле admin-delete.js можно реализовать отправку массива ID и получение результата:
jQuery(document).ready(function($) {
$('#delete-posts-button').on('click', function() {
var postIds = [12, 34, 56]; // Пример ID
$.post(wpconfigAjax.ajax_url, {
action: 'wpconfig_delete_posts',
security: wpconfigAjax.nonce,
post_ids: postIds,
force_delete: 1
}, function(response) {
if(response.success) {
console.log('Результаты удаления:', response.data);
} else {
alert('Ошибка: ' + response.data);
}
});
});
});Полезные плагины для управления массовым удалением записей
Если хочется использовать готовое решение, можно обратить внимание на плагины, которые позволяют фильтровать и массово удалять записи. Например:
- Clearfy Pro — содержит инструменты для очистки и оптимизации базы, включая массовое удаление записей и метаданных.
- WPRemark — помогает управлять комментариями и записями, в том числе массово удалять ненужные элементы.
Использование подобных плагинов может сэкономить время и исключить ошибки при работе с базой.
Резюме и рекомендации
Удаление записей по массиву ID — задача, которая часто встречается при поддержке сайтов на WordPress. Главное — использовать встроенные функции WordPress для корректной работы с данными и заботиться о безопасности — проверять права пользователя и использовать nonce в AJAX.
Программное решение через функцию wpconfig_delete_posts_by_ids подходит для автоматизации и интеграции в кастомные инструменты. Для администраторов удобны AJAX-интерфейсы и готовые плагины, которые расширяют возможности по работе с записями.
Надеемся, что представленные примеры и советы помогут вам эффективно решать задачи массового удаления записей на ваших сайтах WordPress.