Как удалить и запретить удаление записей в WordPress

Иногда в проектах на WordPress возникает необходимость не только удалять записи, но и запретить их удаление для определённых пользователей или ролей. В этой статье рассмотрим, как правильно удалять записи, а также как запретить удаление с помощью кода и плагинов.

Удаление записей в WordPress: базовые возможности

По умолчанию WordPress позволяет удалять записи через админ-панель, а также программно с помощью функций API. Например, для удаления записи используется функция wp_delete_post(). Она принимает ID записи и второй параметр — $force_delete, который указывает, нужно ли удалять запись без помещения в корзину.

function wordpressa_delete_post_example($post_id) {
    // Удаляем запись без помещения в корзину
    wp_delete_post($post_id, true);
}

Если $force_delete установлен в false (по умолчанию), запись сначала попадает в корзину и может быть восстановлена. Для полного удаления укажите true.

Удаление можно делать и через SQL-запросы, но это не рекомендуется, так как могут остаться метаданные и связи.

Как запретить удаление записей для определённых ролей

Чтобы запретить удаление записей определённым пользователям, можно использовать хуки и фильтры WordPress. Например, фильтр map_meta_cap позволяет переопределять права доступа.

Рассмотрим пример, как запретить удалять записи пользователям с ролью «редактор»:

function wordpressa_forbid_post_deletion_for_editors($caps, $cap, $user_id, $args) {
    if ($cap === 'delete_post') {
        $user = get_userdata($user_id);
        if (in_array('editor', $user->roles)) {
            // Запрещаем удаление записей
            $caps[] = 'do_not_allow';
        }
    }
    return $caps;
}
add_filter('map_meta_cap', 'wordpressa_forbid_post_deletion_for_editors', 10, 4);

Такой код блокирует удаление записей для редакторов, при этом администраторы сохраняют это право.

Запрет удаления для кастомных типов записей

Если у вас есть кастомные типы записей, например, product, и вы хотите запретить удаление для них, дополните проверку:

function wordpressa_forbid_deletion_custom_post_type($caps, $cap, $user_id, $args) {
    if ($cap === 'delete_post') {
        $post = get_post($args[0]);
        if ($post && $post->post_type === 'product') {
            $user = get_userdata($user_id);
            if (in_array('editor', $user->roles)) {
                $caps[] = 'do_not_allow';
            }
        }
    }
    return $caps;
}
add_filter('map_meta_cap', 'wordpressa_forbid_deletion_custom_post_type', 10, 4);

Использование плагинов для контроля удаления записей

Если вы предпочитаете использовать готовые решения, можно обратить внимание на следующие плагины:

  • Capability Manager Enhanced — позволяет гибко настраивать права ролей, в том числе запрет на удаление записей.
  • Advanced Access Manager — мощный плагин для контроля прав доступа с возможностью запрета удаления по ролям и конкретным постам.
  • WPFront User Role Editor — удобный редактор ролей, с помощью которого можно снять права удаления.

Все эти плагины можно найти и скачать с WPSHOP.RU.

Как удалить записи по определённым критериям программно

Иногда нужно массово удалить записи, удовлетворяющие условиям, например, старые записи или с определённым метаполем. Это можно сделать так:

function wordpressa_mass_delete_old_posts() {
    $args = array(
        'post_type' => 'post',
        'date_query' => array(
            array(
                'before' => '1 year ago',
            ),
        ),
        'posts_per_page' => -1,
        'fields' => 'ids',
    );
    $old_posts = get_posts($args);
    foreach ($old_posts as $post_id) {
        wp_delete_post($post_id, true);
    }
}
// Вызовите функцию где нужно, например, через WP-Cron

Этот код удалит все посты старше года без помещения в корзину.

Защита от случайного удаления записей: создание подтверждения

Чтобы защититься от случайного удаления, можно добавить JavaScript-подтверждение в админ-панели WordPress. Вот пример, как добавить подтверждение при нажатии на кнопку удаления:

function wordpressa_confirm_post_deletion() {
    global $pagenow;
    if ($pagenow === 'edit.php') {
        ?>
        <script>
            jQuery(document).ready(function($) {
                $('.submitdelete').on('click', function(e) {
                    if (!confirm('Вы действительно хотите удалить эту запись?')) {
                        e.preventDefault();
                    }
                });
            });
        </script>
        <?php
    }
}
add_action('admin_footer', 'wordpressa_confirm_post_deletion');

Это простой способ добавить дополнительный уровень защиты от удаления.

Итоги и рекомендации

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

Для массового удаления лучше пользоваться API WordPress, чтобы корректно очищать все связанные данные. А чтобы избежать случайных удалений, добавляйте подтверждения в интерфейсе.

Если хотите расширить функционал, рекомендуем обратить внимание на плагины WPSHOP, например, Clearfy Pro для оптимизации и безопасности сайта, которые помогут упростить управление правами и защитить сайт.

Как сделать автоматический откат обновлений плагинов WordPress при ошибках
06.02.2026
Как использовать REST API для авторизации пользователей в WordPress
16.02.2026
Как использовать хуки в WordPress для расширения функционала
23.11.2025
Как создать автозадачу в WordPress без использования WP-Cron
04.04.2026
Как создать адаптивные блоки в WordPress с помощью Gutenberg
10.04.2026