MUで実行している、私はオープンソース/公的に無料で利用可能なプラグインを書いています。ユーザーが自分の好みに合わせて管理ページを簡単に設定できるようにadd_screen_option()
を使用したので、私はたくさんのユーザーメタデータを残しています。現在、ページ自体はmanage_options
機能を持つユーザーに制限されているため、リストテーブルのper page
値を調整したときにこのメタエントリを取得したのはそれらだけです。
プラグインを削除することを選択した場合にプラグインがクリーンな状態を維持できるようにするために、ユーザーデータをループ処理してメタエントリを削除する非アクティブ化とアンインストールフックコールバックを追加しました。これで、すべてのユーザーを単純にループし、メタ値を確認することなどができましたが、これは多くのユーザーがいるサイトではほとんど失敗せず、タイムアウトになります(メタテーブルはJOIN
ed)。
簡単に言うと、MUのインストールにはuser
とusermeta
テーブルがあります。そして私が見ることができるものから、実際には保存された機能ではなく、ロール名があります - 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' ) );
これは私が当初考えていたよりも実際にははるかに簡単でした。メタ値に対して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 );
}