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

Я использую плагин 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' );`

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

Спасибо.

7 голосов | спросил FredHead 2 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 02 Sep 2011 06:14:27 +0400 2011, 06:14:27

4 ответа


5

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

Но благодаря намеку Мило, я нашел решение здесь:
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 16 Maypm12 2012, 22:39:20
1

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

add_action('pre_user_query', 'my_user_query');
function my_user_query($userquery){
    print_r($userquery);
    die();
}
ответил Milo 2 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 02 Sep 2011 09:56:46 +0400 2011, 09:56:46
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 21 FebruaryEurope/MoscowbTue, 21 Feb 2017 22:21:42 +0300000000pmTue, 21 Feb 2017 22:21:42 +030017 2017, 22:21:42
-1

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

ответил ricosrealm 16 32011vEurope/Moscow11bEurope/MoscowWed, 16 Nov 2011 05:35:41 +0400 2011, 05:35:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132