Colunas personalizadas classificáveis ​​no painel do usuário (users.php)?

8

Estou usando o plug-in Register Plus Redux para aumentar um formulário de registro com campos de metadados personalizados. Esses campos são exibidos na parte inferior de cada página de detalhes do registro do usuário e podem ser recuperados com get_the_author_meta.

Além disso, sou capaz de criar colunas no painel Usuário (a exibição em lista) e tornar essas colunas classificáveis. O problema é que, quando clico no cabeçalho da coluna personalizada, o orderby = value no URL parece ser ignorado. Em outras palavras, parece que a consulta que gera a exibição de lista de usuários não inclui os metadados personalizados (por exemplo, talvez exija uma declaração de junção se os metadados não estiverem no local habitual para os dados do usuário?). Parece que perdi um passo.

Aqui está o meu código para criar as colunas personalizadas:

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

E aqui está o meu código para tornar essas colunas classificáveis:

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

Alguma idéia de como posso atualizar a consulta que gera a lista de usuários para incluir a classificação por meus campos personalizados? Ou, se esse não é o problema, como fazer com que os títulos das colunas personalizadas classifiquem a lista de usuários quando clicados?

Obrigado.

FredHead
fonte
Veja o blog tekina.info/... para explicação detalhada
Aniket Singh

Respostas:

6

Minha primeira resposta foi completamente errada e estou reescrevendo completamente ...

Mas, graças à dica de Milo, encontrei a solução aqui:
http://wordpress.mcdspot.com/2011/05/24/search-admin-user-list-on-first-and-last-names/

Depois de adaptá-lo, isso funciona para mim com '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'];
   }
}
brasofilo
fonte
1

Não sei se é possível, talvez modificando a consulta via pre_user_query. aqui está uma função rápida e suja para visualizar seu conteúdo:

add_action('pre_user_query', 'my_user_query');
function my_user_query($userquery){
    print_r($userquery);
    die();
}
Milo
fonte
A saída pre_user_query é: Objeto 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] => 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 [quem] =>)). Como eu modificaria essa consulta, por exemplo, ingressar em uma tabela db?
FredHead 2/09
@FredHead, Se você quiser publicar um monte de código, considere usar pastebin, snipplr ou algo semelhante.
Jeremy Jared
@FredHead - honestamente, eu não sei. Eu poderia tentar resolver isso mais tarde, ou espero que alguns usuários mais experientes possam lançar alguma luz sobre ele.
Milo
Desculpe, tentando responder, mas estava recebendo mensagens de erro inescrutáveis ​​relacionadas a comentários no Chrome, Firefox que impediam o envio em quinta / sexta.
precisa saber é o seguinte
Vamos tentar novamente: Milo, sua resposta pelo menos me coloca no campo, obrigado. Agora eu preciso entender se / como adaptar a consulta do usuário. Talvez alguém possa me ajudar a entender essa parte do problema? Jeremy, acho essa interface de comentário difícil de usar (pressione a tecla Enter = enviar comentário) ou eu teria movido o código de saída para outro lugar. Desculpa.
precisa saber é o seguinte
1

Maneira mais simples de fazer isso na minha opinião:

<?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
fonte
1

Se seus meta-valores não forem totalmente preenchidos (possui nulos), a excelente resposta do @ brasofilo produzirá uma lista de usuários que omite os usuários com valores meta_values ​​ausentes.

A correção é fácil no entanto. Basta fazer uma junção esquerda :

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
fonte
-1

Consegui obter a classificação do usuário de uma coluna personalizada usando o código e os ganchos que você postou, exceto que eu não usei o filtro 'request' nem precisei de uma função extra 'orderby'. O Wordpress classifica corretamente os dados na coluna personalizada no meu caso, pelo valor numérico que retorno no retorno de chamada da ação 'manage_users_custom_column'.

ricosrealm
fonte
Legal. Você poderia postar o código atualizado para mim / todos? Obrigado!
FredHead