web-dev-qa-db-ja.com

現在のユーザー(管理者)以外のユーザーリストから管理者を隠す

このコードはとてもうまくいきます!問題は、このコードも現在のユーザー(管理者の場合)を隠すことです。だから私がやろうとしているのは現在のユーザーを除くすべての管理者を隠すことです。

私はこれが "$ user_ID"で動作するようにSQLを編集するのに助けが必要

function isa_pre_user_query($user_search) {
  $user = wp_get_current_user();
  //if (!current_user_can('administrator')) { // Is Not Administrator - Remove Administrator
    global $wpdb;
    $user_ID = get_current_user_id();
    $user_search->query_where = 
        str_replace('WHERE 1=1', 
            "WHERE 1=1 AND {$wpdb->users}.ID IN (
                 SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta 
                    WHERE {$wpdb->usermeta}.meta_key = '{$wpdb->prefix}capabilities'
                    AND {$wpdb->usermeta}.meta_value NOT LIKE '%administrator%')", 
            $user_search->query_where
        );
  //}
}
add_action('pre_user_query','isa_pre_user_query');
1
need-help

WordPress VIP開発のベストプラクティス からの引用:

データベースはツールボックスではありません。データベース側で多くの作業を実行できるかもしれませんが、データベースクエリを単純に保ち、必要な計算とロジックをPHPで実行することで、コードのスケールが大幅に向上します。

ただし、そのユーザーに管理者権限がある場合は、管理者以外のすべてのユーザーを取得してから現在のユーザーを結果に追加することをお勧めします。

あなたは簡単にこれをより高いレベルのWordPress機能を使って達成することができます:

    <?php
    /* get all non-admin users */
    $args = array( 
        'meta_key'     => 'wp_capabilities', 
        'meta_value'   => 'Administrator', /* you better check for a capability, not a role */
        'meta_compare' => 'NOT LIKE'
    );
    $user_query = new WP_User_Query( $args );

    /* if current user is admin, get its user object */
    $current_admin_user = current_user_can( 'activate_plugins' ) ? wp_get_current_user() : null;

    /* merge non-admin users with current admin-user */
    $results = $user_query->get_results();
    $results[] = $current_admin_user;

    /* update the user query */
    $user_query->__set( 'results', $results );
    $user_query->__set( 'total_users', count( $results ));

    /* do whatever you want */
    print_r($user_query);
1
Jan Beck