Disable delete user

时间:2016-01-26 作者:Denissio Inkognito

我的网站有自定义的帖子类型“公文包”。如果用户至少有一个公文包,如何禁用删除该用户的选项?

我找到了动作/钩子delete_user, 但这似乎不适合这个问题。

2 个回复
最合适的回答,由SO网友:Sören Wrede 整理而成

单击“delete”(删除)时,将启动“delete\\u user”(删除用户)操作:https://core.trac.wordpress.org/browser/tags/4.4.1/src/wp-admin/includes/user.php#L313

之后,您可以检查用户是否至少写过一篇“公文包”帖子。

add_action(\'delete_user\', \'sw_portfolio_check\');

function sw_portfolio_check( $user_id ) {
    $result = new WP_Query(
                array(
                    \'author\'=>$user_id,
                    \'post_type\'=>\'portfolio\',
                    \'posts_per_page\'=>1,
                )
            );
    if ( count($result->posts) !== 0 ){
        wp_die("User has a portfolio and can\'t be deleted");
    }
}

SO网友:AddWeb Solution Pvt Ltd

如果您是指用户列表上的删除按钮,则要禁用删除选项/wp-admin/users.php 您可以使用user\\u row\\u actions类隐藏带有以下代码段的“delete”链接:

add_filter(
  \'user_row_actions\',
  function($actions, $user_object) {
    $result = new WP_Query(
                array(
                    \'author\'=> $user_object->ID,
                    \'post_type\'=>\'portfolio\',
                    \'posts_per_page\'=>1,
                )
            );
    if ( count($result->posts) !== 0 ){
      unset($actions[\'delete\']);
    }
    return $actions;
  },
  1,2
);
上面的代码片段只是隐藏了链接。它不会阻止访问删除屏幕。为此,我们需要更多的代码:

add_action(
  \'load-users.php\',
  function() {
    if (isset($_GET[\'user\'])) {
      $user_object = get_userdata($_GET[\'user\']);
          $result = new WP_Query(
                        array(
                            \'author\'=> $user_object->ID,
                            \'post_type\'=>\'portfolio\',
                            \'posts_per_page\'=>1,
                        )
                    );
        if( count($result->posts) !== 0 ){
        wp_die(\'This user cannot be deleted\');
        }
    }
  }  
);
希望这对你有帮助!