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.