web-dev-qa-db-ja.com

加入者以外のユーザーロールを削除しない

私のブログの管理では、それが単純な加入者でない限り、私は誰でも(管理者を含む)どんなユーザーも削除しないようにしたいです。

基本的に、管理の "users"セクションで、私は "delete"オプションを購読者の下でのみ見ることができ、管理者、編集者、作者または寄稿者の下では見えないようにしたいです。

どのように私は自分のfunctions.phpファイル(私はプラグインに興味がない)でそれを行うことができますか?

私は "remove_cap( 'delete_users')"関数を試しましたが、私はどのユーザも削除されないようにしたいのですが、サブスクライバでは削除したくないので、スコープが大きすぎます。

ご協力ありがとうございました。

3
Baylock

/wp-admin/users.phpのユーザーリストの削除ボタンを意味する場合、そのボタンはWP_Users_List_Tableクラス 現在(256行目) によって作成されます。もう少し下を見れば - 数行 - あなたはuser_row_actionsと呼ばれるフィルタを見るでしょう。あなたは '削除'リンクを隠すためにそれを使うことができます。

add_filter(
  'user_row_actions',
  function($actions, $user_object) {
    if (1 >= count($user_object->roles) && 'subscriber' !== $user_object->roles[0]) {
      unset($actions['delete']);
    }
    return $actions;
  },
  1,2
);

最低限のテストですが、論理は正しいと思います。購読者には「削除」リンクが表示されますが、それ以外のロールを持つユーザーには「購読者」 および を持つユーザーは含まれません奇妙な設定。

あなたが注意深く見て、そしていたずら心を持っているならば、あなたはまだあなたがURLのユーザーIDを操作することによってあなたが望むどんなユーザーでも削除できることに気づくでしょう。よく見る:

/wp-admin/users.php?action=delete&user=9&_wpnonce=8059e669c1

上のフィルタはリンクを隠すだけです。削除画面へのアクセスを妨げることはありません。そのためには、さらにコードが必要になります。

add_action(
  'load-users.php',
  function() {
    if (isset($_GET['action']) && 'delete' === $_GET['action']) {
      if (isset($_GET['user'])) {
        $user_object = get_userdata($_GET['user']);
        if (1 >= count($user_object->roles) && 'subscriber' !== $user_object->roles[0]) {
          wp_die('This user cannot be deleted');
        }
      }
    }
  }
);

それでも、賢いユーザーであるで正しいPOSTの値をプッシュしてユーザーを削除することができるため、ユーザーを削除する直前に最終的なフェイルセーフを設定することもできます。

add_action(
  'delete_user', 
  function($id) {
    $user_object = get_userdata($id);
    if (1 >= count($user_object->roles) && 'subscriber' !== $user_object->roles[0]) {
      wp_die('This user cannot be deleted');
    }
  }
);

注:このコードはMUプラグインファイルでテストされています。おそらくfunctions.phpからうまくいくはずだと思いますが、必ずそれを検証してください。また、実際には、私はおそらくそれが再利用できるようにその論理のいくつかを抽出しようとします。これらのコールバックは繰り返し危険に近いです。

5
s_ha_dum

S_ha_dumでは、いくつかの変更を加えても動作するようにしました。

"count"は関数を台無しにしているようですが、これのように、それは魅力のように働きました:

function test($actions, $user_object) 
{
    if ( 'subscriber' !== $user_object->roles[0]) {unset($actions['delete']);}
    return $actions;
}
add_filter('user_row_actions','test',1,2);

どうもありがとうございました。

1
Baylock

はい私達は続くことによってそれを達成することができます。

add_filter( 'user_row_actions', 'custom_action_function', 1, 2 );
function custom_action_function($actions, $user_object) {
    if ( 1 >= count( $user_object->roles ) && 'subscriber' !== $user_object->roles[0] ) {
      unset( $actions['delete'] );
    }
    return $actions;
}
0
webtechie