如何阻止WordPress用户永久删除回收站文章且保留回收/恢复权限?
解决方案
原代码的问题在于:WordPress恢复回收站文章时,会检查delete_post权限,而原代码直接禁止了所有针对回收站文章的该权限,导致恢复功能也被限制。以下是两种精准实现需求的方法:
方法一:通过权限钩子区分操作
利用user_has_cap钩子,结合当前请求的动作,仅在永久删除回收站文章时禁止权限,保留恢复操作的权限:
add_filter('user_has_cap', 'prevent_permanent_trash_deletion', 10, 3); function prevent_permanent_trash_deletion($allcaps, $caps, $args) { // 仅处理删除文章的权限请求,且存在目标文章ID if (isset($args[0]) && $args[0] === 'delete_post' && isset($args[2])) { $post = get_post($args[2]); // 检查文章是否处于回收站状态 if ($post && $post->post_status === 'trash') { // 获取当前操作动作,区分永久删除和恢复 $current_action = $_REQUEST['action'] ?? ''; // 匹配永久删除的动作(单个删除或批量删除) if ($current_action === 'delete' || $current_action === 'deletepost') { // 禁止对应的权限 foreach ($caps as $cap) { $allcaps[$cap] = false; } } } } return $allcaps; }
方法二:通过删除前钩子直接拦截
使用before_delete_post钩子,仅在永久删除回收站文章时触发拦截,完全不影响移入回收站和恢复操作:
add_action('before_delete_post', 'prevent_permanent_trash_deletion'); function prevent_permanent_trash_deletion($post_id) { $post = get_post($post_id); // 若文章处于回收站状态,阻止永久删除 if ($post && $post->post_status === 'trash') { // 自定义提示信息,也可替换为跳转回回收站列表的代码 wp_die('您无法永久删除回收站中的文章。'); // 无提示跳转写法: // wp_redirect(admin_url('edit.php?post_status=trash')); // exit; } }
两种方法对比
- 方法一贴合WordPress权限体系,不会弹出错误页面,仅让永久删除按钮失效,体验更平滑。
- 方法二更直接,通过拦截动作明确告知用户限制,适合需要强提示的场景。
内容的提问来源于stack exchange,提问作者user232080
相关产品推荐
相关产品推荐

