Colonne personalizzate ordinabili nel pannello utente (users.php)?


8

Sto usando il plug-in Register Plus Redux per aumentare un modulo di registrazione con campi di metadati personalizzati. Questi campi vengono visualizzati nella parte inferiore di ogni pagina dei dettagli del record utente e possono essere recuperati con get_the_author_meta.

Inoltre, sono in grado di creare colonne nel pannello Utente (la visualizzazione elenco) e di rendere ordinabili queste colonne. Il problema è che, quando faccio clic sull'intestazione della colonna personalizzata, il valore orderby = nell'URL sembra essere ignorato. Detto in altro modo, sembra che la query che genera la visualizzazione elenco degli utenti non includa i metadati personalizzati (ad esempio, forse richiede un'istruzione join se i metadati non sono nella solita posizione per i dati utente?). Mi sembra di aver perso un passo.

Ecco il mio codice per creare le colonne personalizzate:

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

Ed ecco il mio codice per rendere ordinabili queste colonne:

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

Qualche idea su come posso aggiornare la query che genera l'elenco di utenti in modo che includa l'ordinamento per i miei campi personalizzati? Oppure, se non è questo il problema, come fare in modo che le intestazioni di colonna personalizzate ordinino l'elenco degli utenti quando si fa clic?

Grazie.


Vedi il blog tekina.info/… per una spiegazione dettagliata
Aniket Singh,

Risposte:


6

La mia prima risposta era completamente off-mark e la sto riscrivendo completamente ...

Ma grazie al suggerimento di Milo, ho trovato la soluzione qui:
http://wordpress.mcdspot.com/2011/05/24/search-admin-user-list-on-first-and-last-names/

Dopo averlo adattato, questo funziona per me con "facebook" e "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'];
   }
}

1

Non sono sicuro che sia possibile, forse modificando la query tramite pre_user_query. ecco una funzione veloce e sporca per visualizzarne il contenuto:

add_action('pre_user_query', 'my_user_query');
function my_user_query($userquery){
    print_r($userquery);
    die();
}

L'output pre_user_query è: oggetto WP_User_Query ([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] => ORDINA 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 [who] =>)). Come posso modificare questa query, ad es. Unirmi a una tabella db?
FredHead,

@FredHead, se hai intenzione di pubblicare molto codice potresti prendere in considerazione l'utilizzo di pastebin, snipplr o qualcosa di simile.
Jeremy Jared,

@FredHead - onestamente, non lo so. Potrei provare a smanettarlo in seguito, o spero che alcuni utenti più esperti possano far luce su di esso.
Milo,

Spiacenti, ho cercato di rispondere ma ho ricevuto messaggi di errore relativi ai commenti imperscrutabili in Chrome, Firefox che hanno impedito l'invio il giovedì / venerdì.
FredHead,

Proviamo di nuovo: Milo, la tua risposta mi porta almeno nel campo di baseball, grazie. Ora ho bisogno di capire se / come adattare la query utente. Forse qualcuno può aiutarmi a capire quella parte del problema? Jeremy, trovo questa interfaccia di commento difficile da usare (premere il tasto Invio = invia commento) o avrei spostato il codice di output altrove. Scusate.
FredHead,

1

Il modo più semplice per farlo secondo me:

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

1

Se i tuoi meta valori non sono completamente popolati (ha valori null), la risposta eccellente di @ brasofilo produrrà un elenco di utenti che omette gli utenti con valori di meta_valori mancanti.

La correzione è comunque semplice. Basta unire a sinistra :

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


-1

Sono stato in grado di ottenere l'ordinamento utente di una colonna personalizzata utilizzando il codice e gli hook che hai pubblicato, tranne per il fatto che non ho utilizzato il filtro "richiesta", né ho bisogno di una funzione aggiuntiva "ordine". Wordpress ordina correttamente i dati nella colonna personalizzata nel mio caso in base al valore numerico che restituisco nel callback dell'azione "manage_users_custom_column".


Freddo. Potresti pubblicare il codice aggiornato per me / tutti? Grazie!
FredHead,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.