Сортируемые пользовательские столбцы в панели пользователя (users.php)?

8

Я использую плагин Register Plus Redux для дополнения формы регистрации настраиваемыми полями метаданных. Эти поля отображаются внизу каждой страницы сведений о записи пользователя, и их можно получить с помощью get_the_author_meta.

Кроме того, я могу создать столбцы на панели «Пользователь» (представление списка) и сделать эти столбцы сортируемыми. Проблема в том, что, когда я нажимаю на заголовок пользовательского столбца, значение orderby = в URL-адресе кажется игнорируемым. Другими словами, кажется, что запрос, который генерирует представление списка пользователей, не включает настраиваемые метаданные (например, возможно, он требует оператора соединения, если метаданные не находятся в обычном месте для пользовательских данных?). Такое ощущение, что я пропустил шаг.

Вот мой код для создания пользовательских столбцов:

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

И вот мой код для сортировки этих столбцов:

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

Любые идеи, как я могу обновить запрос, который генерирует список пользователей, чтобы он включал сортировку по моим настраиваемым полям? Или, если это не проблема, как сделать так, чтобы пользовательские заголовки столбцов сортировали список пользователей при нажатии?

Спасибо.

FredHead
источник
Смотрите блог tekina.info/... для детального объяснения
Аникет Singh

Ответы:

6

Мой первый ответ был совершенно неуместным, и я полностью переписываю его ...

Но благодаря подсказке Майло я нашел решение здесь:
http://wordpress.mcdspot.com/2011/05/24/search-admin-user-list-on-first-and-last-names/

После адаптации, это работает для меня с «Facebook» и «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
источник
1

Я не уверен, что это возможно, возможно, изменив запрос с помощью pre_user_query. вот быстрая и грязная функция для просмотра ее содержимого:

add_action('pre_user_query', 'my_user_query');
function my_user_query($userquery){
    print_r($userquery);
    die();
}
Milo
источник
Выходные данные pre_user_query: WP_User_Query Object ([результаты] => [total_users] => 0 [query_fields] => SQL_CALC_FOUND_ROWS wp_users.ID [query_from] => FROM wp_users [query_where] => WHERE 1 = 1 [query_order] BY user_login ASC [query_limit] => LIMIT 20 [query_vars] => Массив ([blog_id] => 1 [роль] => [meta_key] => [meta_value] => [meta_compare] => [include] => Array ( ) [exclude] => Array () [search] => [orderby] => Компания [order] => ASC [offset] => 0 [number] => 20 [count_total] => 1 [fields] => all_with_meta [кто] =>)). Как бы я изменил этот запрос, например, присоединиться к таблице БД?
FredHead
@FredHead, если вы собираетесь опубликовать много кода, вы можете подумать об использовании pastebin, snipplr или чего-то подобного.
Джереми Джаред
@FredHead - честно, я не знаю. Я мог бы попытаться разобраться с этим позже, или, надеюсь, некоторые более опытные пользователи могут пролить свет на это.
Майло
Извините, пытаюсь ответить, но получаю непостижимые сообщения об ошибках, связанных с комментариями, в Chrome, Firefox, которые не позволяют отправлять сообщения в Th / Fri.
FredHead
Давайте попробуем это снова: Майло, твой ответ, по крайней мере, приведет меня в стадион, спасибо. Теперь мне нужно понять, если / как адаптировать пользовательский запрос. Возможно, кто-то может помочь мне понять эту часть проблемы? Джереми, мне сложно использовать этот интерфейс комментариев (нажмите клавишу Enter = отправить комментарий), иначе я бы переместил код вывода в другое место. Сожалею.
FredHead
1

Самый простой способ сделать это на мой взгляд:

<?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
источник
1

Если ваши мета-значения заполнены не полностью (имеет нулевые значения), отличный ответ @ brasofilo выдаст список пользователей, в котором пропущены пользователи с отсутствующими значениями meta_values.

Однако это легко исправить. Просто сделайте левое соединение :

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

Я смог добиться пользовательской сортировки пользовательского столбца, используя опубликованный вами код и хуки, за исключением того, что я не использовал фильтр 'request' и не нуждался в дополнительной функции 'orderby'. Wordpress правильно сортирует данные в пользовательском столбце в моем случае по числовому значению, которое я возвращаю в обратном вызове действия manage_users_custom_column.

ricosrealm
источник
Круто. Не могли бы вы опубликовать обновленный код для меня / всех? Спасибо!
FredHead