web-dev-qa-db-fra.com

Interroger les utilisateurs par fonctionnalité - désinstaller/désactiver le rappel

La situation

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.

The "per page" Screen Option

La tâche

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 JOINed).

L'idée (jusqu'à présent)

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…

  • superadmin
  • inscrit sur plusieurs sites
  • enregistré sur plusieurs sites avec des rôles différents
  • enregistré sur plusieurs sites avec le même rôle, mais le rôle a des capacités différentes sur des sites différents
  • ...?

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 );

MODIFIER

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' ) );
1
kaiser

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 );
}
1
kaiser