Colonnes personnalisables triables dans le panneau de l'utilisateur (users.php)?

8

J'utilise le plugin Register Plus Redux pour augmenter un formulaire d'inscription avec des champs de métadonnées personnalisés. Ces champs s'affichent au bas de chaque page de détail d'enregistrement utilisateur et ils peuvent être récupérés avec get_the_author_meta.

De plus, je peux créer des colonnes dans le panneau Utilisateur (la vue liste) et rendre ces colonnes triables. Le problème est que, lorsque je clique sur l'en-tête de colonne personnalisé, la valeur orderby = dans l'URL semble être ignorée. Autrement dit, il semble que la requête qui génère la vue de liste des utilisateurs n'inclut pas les métadonnées personnalisées (par exemple, elle nécessite peut-être une instruction de jointure si les métadonnées ne se trouvent pas à l'emplacement habituel pour les données utilisateur?). J'ai l'impression d'avoir raté une étape.

Voici mon code pour créer les colonnes personnalisées:

//add columns to User panel list page
function add_user_columns( $defaults ) {
     $defaults['company'] = __('Company', 'user-column');
     $defaults['title'] = __('Title', 'user-column');
     return $defaults;
}
function add_custom_user_columns($value, $column_name, $id) {
      if( $column_name == 'company' ) {
        return get_the_author_meta( 'company_name', $id );
      }
      if( $column_name == 'title' ) {
        return get_the_author_meta( 'titlefunction', $id );
      }
}
add_action('manage_users_custom_column', 'add_custom_user_columns', 15, 3);
add_filter('manage_users_columns', 'add_user_columns', 15, 1);`

Et voici mon code pour rendre ces colonnes triables:

function user_sortable_columns( $columns ) {
    $columns['company'] = 'Company';
    return $columns;
}
add_filter( 'manage_users_sortable_columns', 'user_sortable_columns' );

function user_column_orderby( $vars ) {
    if ( isset( $vars['orderby'] ) && 'company' == $vars['orderby'] ) {
        $vars = array_merge( $vars, array(
            'meta_key' => 'company',
            'orderby' => 'meta_value',
            'order'     => 'asc'
        ) );
    }
    return $vars;
}
add_filter( 'request', 'user_column_orderby' );`

Avez-vous des idées sur la façon de mettre à jour la requête qui génère la liste des utilisateurs afin qu'elle inclue le tri par mes champs personnalisés? Ou, si ce n'est pas le problème, comment faire pour que les en-têtes de colonne personnalisés trient la liste des utilisateurs lorsque vous cliquez dessus?

Je vous remercie.

FredHead
la source
Voir le blog tekina.info/… pour des explications détaillées
Aniket Singh

Réponses:

6

Ma première réponse était complètement fausse et je la réécris complètement ...

Mais grâce à l'indice de Milo, j'ai trouvé la solution ici:
http://wordpress.mcdspot.com/2011/05/24/search-admin-user-list-on-first-and-last-names/

Après l'avoir adapté, cela fonctionne pour moi avec 'facebook' et 'twitter' author_meta.

add_action('pre_user_query','wpse_27518_pre_user_query');
function wpse_27518_pre_user_query($user_search) {
    global $wpdb,$current_screen;

    if ( 'users' != $current_screen->id ) 
        return;

    $vars = $user_search->query_vars;

    if('facebook' == $vars['orderby']) 
    {
        $user_search->query_from .= " INNER JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key='facebook')"; 
        $user_search->query_orderby = ' ORDER BY UPPER(m1.meta_value) '. $vars['order'];
    } 

    elseif ('twitter' == $vars['orderby']) 
    {
        $user_search->query_from .= " INNER JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key='twitter')"; 
        $user_search->query_orderby = ' ORDER BY UPPER(m1.meta_value) '. $vars['order'];
   }
}
brasofilo
la source
1

Je ne suis pas sûr que ce soit possible, peut-être en modifiant la requête via pre_user_query. voici une fonction rapide et sale pour afficher son contenu:

add_action('pre_user_query', 'my_user_query');
function my_user_query($userquery){
    print_r($userquery);
    die();
}
Milo
la source
La sortie pre_user_query est: WP_User_Query Object ([results] => [total_users] => 0 [query_fields] => SQL_CALC_FOUND_ROWS wp_users.ID [query_from] => FROM wp_users [query_where] => WHERE 1 = 1 [query_orderby] => ORDER BY user_login ASC [query_limit] => LIMIT 20 [query_vars] => Array ([blog_id] => 1 [role] => [meta_key] => [meta_value] => [meta_compare] => [include] => Array ( ) [exclude] => Array () [search] => [orderby] => Company [order] => ASC [offset] => 0 [number] => 20 [count_total] => 1 [fields] => all_with_meta [qui] =>)). Comment pourrais-je modifier cette requête, par exemple rejoindre une table db?
FredHead
@FredHead, si vous allez publier beaucoup de code, vous pourriez envisager d'utiliser pastebin, snipplr ou quelque chose de similaire.
Jeremy Jared
@FredHead - honnêtement, je ne sais pas. Je pourrais essayer de le pirater plus tard, ou j'espère que certains utilisateurs plus expérimentés pourront l'éclairer.
Milo
Désolé, j'essayais de répondre, mais je recevais des messages d'erreur impénétrables liés à Chrome, Firefox qui empêchaient la soumission le jeudi / vendredi.
FredHead
Essayons encore une fois: Milo, votre réponse me met au moins dans le stade, merci. Maintenant, je dois comprendre si / comment adapter la requête utilisateur. Peut-être que quelqu'un peut m'aider à comprendre cette partie du problème? Jeremy, je trouve cette interface de commentaire difficile à utiliser (appuyez sur la touche Entrée = soumettre un commentaire) ou j'aurais déplacé le code de sortie ailleurs. Désolé.
FredHead
1

La façon la plus simple de le faire à mon avis:

<?php

/**
 * Sorting logic for custom columns on WP user table
 */
add_action('pre_user_query', function(WP_User_Query $query) {
  global $wpdb, $current_screen;

  // Bail if viewing anything other than user list in WP Admin
  if ( 'users' != $current_screen->id ) {
    return;
  }

  if ( 'company' === $query->query_vars['orderby'] ) {
    $query->orderby = 'meta_value';
    $query->meta_key = 'company_name';
  }

  else if ( 'title' === $query->query_vars['orderby'] ) {
    $query->orderby = 'meta_value';
    $query->meta_key = 'titlefunction';
  }

}, 10, 1);
Ahrengot
la source
1

Si vos méta-valeurs ne sont pas entièrement renseignées (a des valeurs nulles), l'excellente réponse de @ brasofilo produira une liste d'utilisateurs qui omet les utilisateurs avec des valeurs de méta-valeurs manquantes.

La correction est cependant facile. Faites juste un joint gauche :

add_action('pre_user_query','wpse_27518_pre_user_query');
function wpse_27518_pre_user_query($user_search) {
    global $wpdb,$current_screen;

    if ( 'users' != $current_screen->id ) 
        return;

    $vars = $user_search->query_vars;

    if('facebook' == $vars['orderby']) 
    {
        $user_search->query_from .= " LEFT JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key='facebook')"; 
        $user_search->query_orderby = ' ORDER BY UPPER(m1.meta_value) '. $vars['order'];
    } 

    elseif ('twitter' == $vars['orderby']) 
    {
        $user_search->query_from .= " LEFT JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key='twitter')"; 
        $user_search->query_orderby = ' ORDER BY UPPER(m1.meta_value) '. $vars['order'];
   }
}

$user_search->query_from .= " LEFT JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key='facebook')";

David Roth
la source
-1

J'ai pu effectuer le tri par l'utilisateur d'une colonne personnalisée en utilisant le code et les hooks que vous avez publiés, sauf que je n'ai pas utilisé le filtre «demande», ni besoin d'une fonction supplémentaire «orderby». Wordpress trie correctement les données de la colonne personnalisée dans mon cas en fonction de la valeur numérique que je renvoie dans le rappel d'action 'manage_users_custom_column'.

ricosrealm
la source
Cool. Pourriez-vous publier le code mis à jour pour moi / tout le monde? Je vous remercie!
FredHead