web-dev-qa-db-ja.com

機能によるユーザの問い合わせ - コールバックのアンインストール/無効化

状況

MUで実行している、私はオープンソース/公的に無料で利用可能なプラグインを書いています。ユーザーが自分の好みに合わせて管理ページを簡単に設定できるようにadd_screen_option()を使用したので、私はたくさんのユーザーメタデータを残しています。現在、ページ自体はmanage_options機能を持つユーザーに制限されているため、リストテーブルのper page値を調整したときにこのメタエントリを取得したのはそれらだけです。

The "per page" Screen Option

タスク

プラグインを削除することを選択した場合にプラグインがクリーンな状態を維持できるようにするために、ユーザーデータをループ処理してメタエントリを削除する非アクティブ化とアンインストールフックコールバックを追加しました。これで、すべてのユーザーを単純にループし、メタ値を確認することなどができましたが、これは多くのユーザーがいるサイトではほとんど失敗せず、タイムアウトになります(メタテーブルはJOINed)。

アイデア(これまで)

簡単に言うと、MUのインストールにはuserusermetaテーブルがあります。そして私が見ることができるものから、実際には保存された機能ではなく、ロール名があります - WordPressはここでロールと機能の間に違いを生じません。それは楽しいです、それは私が考慮しなければならないさまざまなことがあるようです:

ユーザーは…

  • スーパーアドミン
  • 複数のサイトに登録されている
  • 役割が異なる複数のサイトに登録されている
  • 同じ役割を持つ複数のサイトに登録されているが、役割はサイトによって異なる
  • …?

問題は、これらのさまざまな可能性から始まり、機能がネットワーク/ MU設定に保存されているかどうかを見るとさらに広がります。

{$wpdb->prefix}capabilities

または

{$wpdb->prefix}{get_current_blog_id()}_capabilities

それでは、1つのクエリは何のために?

$query_args = array(
);
$query = new WP_User_Query( $query_args );
$users = $query->results;
if ( empty( $users ) )
    return;

var_dump( $users );

編集

特定の機能を持つロール名を照会する最初の試みだけです。

    $roles = new WP_Roles();
    $roles = wp_list_pluck( $roles->role_objects, 'capabilities' );
    $results = array();
    foreach ( $roles as $role => $caps )
    {
        array_key_exists( 'manage_options', $caps )
            AND $results[] = $role;
    }
    var_dump( $results );

    # Even if it's smarter then above loop, it won't work and 
    # throw an error in core files.
    $roles = array_filter( wp_list_pluck( $roles, 'manage_options' ) );
1
kaiser

これは私が当初考えていたよりも実際にははるかに簡単でした。メタ値に対してWP_User_Queryを実行するだけです(他のクエリクラスと同様に、メタ配列もサポートされています)。

public function on_deactivate()
{
    $meta_key = 'tools_page_tsi_per_page';
    $query = new WP_User_Query( array( 'meta_key' => $meta_key ) );

    if ( empty( $query->results ) )
        return;

    foreach ( wp_list_pluck( $query->results, 'ID' ) as $user_id )
        delete_user_meta( $user_id, $meta_key );
}
1
kaiser