В процессе разработки и администрирования сайтов на WordPress иногда возникает необходимость массово удалить все записи, которые принадлежат определённой таксономии или её термину. Например, нужно очистить все записи, связанные с устаревшей категорией или тегом, или полностью удалить кастомные типы записей, связанные с определённой таксономией.
Почему стандартные способы не всегда удобны
В админке WordPress можно удалить записи через раздел «Записи» или «Все записи», применяя фильтры по категориям или меткам. Однако при большом количестве записей такой метод неудобен и неэффективен. Плюс, если записи принадлежат кастомным таксономиям, их может не быть в стандартных интерфейсах.
Поэтому оптимальным решением будет написать кастомный код, который удалит все записи, связанные с нужной таксономией или термином. Такой подход позволяет автоматизировать процесс, избежать ошибок и экономит время.
Получение всех записей по таксономии
Для начала нам нужно получить все записи, которые связаны с определённой таксономией и её термином. Рассмотрим пример для таксономии genre и термина fantasy.
function wpteam_get_posts_by_taxonomy( $taxonomy, $term_slug ) {
$args = array(
'post_type' => 'any',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => $taxonomy,
'field' => 'slug',
'terms' => $term_slug,
),
),
'fields' => 'ids',
);
$query = new WP_Query( $args );
return $query->posts;
}
Функция wpteam_get_posts_by_taxonomy возвращает массив ID записей, связанных с переданной таксономией и термином.
Удаление записей по ID с безопасностью
После получения ID записей, их нужно удалить. В WordPress для удаления записи используется функция wp_delete_post(). Важно перед удалением убедиться, что у пользователя есть права на удаление, а также использовать безопасные операции.
function wpteam_delete_posts_by_ids( $post_ids ) {
foreach ( $post_ids as $post_id ) {
// Проверяем права текущего пользователя
if ( current_user_can( 'delete_post', $post_id ) ) {
wp_delete_post( $post_id, true ); // true - принудительное удаление без корзины
}
}
}
Обратите внимание, что параметр true указывает на безвозвратное удаление, минуя корзину. Если хотите сначала переместить записи в корзину, передайте false.
Полный пример удаляющего скрипта
Комбинируем всё вместе в одной функции, которую можно использовать в кастомном плагине или файле functions.php темы.
function wpteam_delete_posts_by_taxonomy_term( $taxonomy, $term_slug ) {
$posts = wpteam_get_posts_by_taxonomy( $taxonomy, $term_slug );
if ( empty( $posts ) ) {
return 'Записей для удаления не найдено.';
}
wpteam_delete_posts_by_ids( $posts );
return count( $posts ) . ' записей успешно удалены.';
}
// Пример вызова
// echo wpteam_delete_posts_by_taxonomy_term( 'genre', 'fantasy' );
Такой подход позволяет точно и безопасно удалить все нужные записи.
Использование плагинов для массового удаления
Если вы не хотите писать код, можно воспользоваться плагинами, которые позволяют массово удалять записи по таксономиям:
- Bulk Delete — мощный плагин для массового удаления записей с гибкими фильтрами.
- Clearfy Pro — оптимизационный плагин с инструментами для очистки сайта, включая удаление записей по условиям.
Однако в некоторых случаях именно кастомный код даёт максимальный контроль и безопасность.
Рекомендации по безопасности и резервным копиям
Перед массовым удалением записей настоятельно рекомендуется сделать резервную копию базы данных. Это позволит восстановить данные в случае ошибки. Для этого можно использовать плагины, например, Backup plugins или хостинг-решения.
Также при программном удалении учитывайте права пользователей и запускайте код в безопасной среде. Например, можно реализовать удаление через админский AJAX-запрос с nonce-проверкой.
Пример AJAX-обработчика для удаления записей
add_action( 'wp_ajax_wpteam_delete_posts', 'wpteam_ajax_delete_posts' );
function wpteam_ajax_delete_posts() {
check_ajax_referer( 'wpteam_delete_posts_nonce', 'security' );
if ( ! current_user_can( 'delete_posts' ) ) {
wp_send_json_error( 'Недостаточно прав' );
}
$taxonomy = sanitize_text_field( $_POST['taxonomy'] );
$term_slug = sanitize_text_field( $_POST['term_slug'] );
$result = wpteam_delete_posts_by_taxonomy_term( $taxonomy, $term_slug );
wp_send_json_success( $result );
}
Этот код позволяет вызвать удаление через AJAX, защищённое nonce и проверкой прав.