Sous MU, j'écris un plugin open source/disponible publiquement et librement. Comme j'ai utilisé add_screen_option()
pour permettre aux utilisateurs de configurer facilement la page d'administration à leur goût, il me reste un tas de métadonnées utilisateur. Désormais, la page elle-même est limitée aux utilisateurs dotés de la fonctionnalité manage_options
. Par conséquent, seuls ceux-ci ont reçu cette méta-entrée lorsqu'ils ont ajusté la valeur per page
pour une table de liste.
Pour permettre au plug-in de laisser un état de nettoyage au cas où certains choisiraient de le supprimer, j'ai ajouté une désactivation et un rappel de désinstallation qui devrait parcourir les données de l'utilisateur et supprimer les méta-entrées. Maintenant, je pourrais simplement parcourir tous les utilisateurs, vérifier leur méta-valeur, etc., mais cela échouerait difficilement sur les sites contenant beaucoup d'utilisateurs et se terminerait dans un délai d'attente (rappelez-vous, les tables méta sont JOIN
ed).
Pour faire court, voici ce que je pensais: L'installation de MU a une table user
et une table usermeta
. Et d'après ce que je peux voir, les fonctionnalités ne sont pas vraiment sauvegardées, mais les noms de rôle: WordPress ne fait aucune différence entre les rôles et les fonctionnalités. Aussi amusant que cela puisse paraître, il semble y avoir différentes choses à considérer:
L'utilisateur peut être…
Le problème commence avec ces différentes possibilités et va plus loin, quand vous regardez si les capacités sont enregistrées dans une configuration réseau/MU:
{$wpdb->prefix}capabilities
Ou
{$wpdb->prefix}{get_current_blog_id()}_capabilities
Alors, que demanderait-on?
$query_args = array(
);
$query = new WP_User_Query( $query_args );
$users = $query->results;
if ( empty( $users ) )
return;
var_dump( $users );
Juste une première tentative de recherche de noms de rôle avec une capacité spécifique:
$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' ) );
C'était en fait beaucoup plus facile que je ne le pensais au départ - il suffit de faire un WP_User_Query
pour une méta-valeur (les méta-tableaux sont également pris en charge, comme pour les autres classes de requêtes).
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 );
}