Иногда в проектах на 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 для оптимизации и безопасности сайта, которые помогут упростить управление правами и защитить сайт.