You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 15:27:45