Cột tùy chỉnh có thể sắp xếp trong Bảng điều khiển người dùng (users.php)?


8

Tôi đang sử dụng plugin Đăng ký Redux để gia tăng mẫu đăng ký với các trường siêu dữ liệu tùy chỉnh. Các trường này hiển thị ở dưới cùng của mỗi trang chi tiết hồ sơ người dùng và chúng có thể được truy xuất bằng get_the_ Author_meta.

Ngoài ra, tôi có thể tạo các cột trong bảng Người dùng (chế độ xem danh sách) và để làm cho các cột này có thể sắp xếp được. Vấn đề là, khi tôi nhấp vào tiêu đề cột tùy chỉnh, giá trị orderby = trong URL dường như bị bỏ qua. Nói cách khác, nó xuất hiện truy vấn tạo ra chế độ xem danh sách của người dùng không bao gồm dữ liệu meta tùy chỉnh (ví dụ: có lẽ nó yêu cầu một câu lệnh nối nếu siêu dữ liệu không ở vị trí thông thường cho dữ liệu người dùng?). Cảm giác như tôi đã bỏ lỡ một bước.

Đây là mã của tôi để tạo các cột tùy chỉnh:

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

Và đây là mã của tôi để làm cho các cột này có thể sắp xếp:

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

Bất kỳ ý tưởng nào làm thế nào tôi có thể cập nhật truy vấn tạo danh sách người dùng để nó bao gồm sắp xếp theo (các) trường tùy chỉnh của tôi? Hoặc, nếu đó không phải là vấn đề, làm thế nào để tạo tiêu đề cột tùy chỉnh sắp xếp danh sách người dùng khi nhấp vào?

Cảm ơn bạn.


Xem blog tekina.info/ Lời để được giải thích chi tiết
Aniket Singh

Câu trả lời:


6

Câu trả lời đầu tiên của tôi hoàn toàn không đúng và tôi hoàn toàn viết lại ...

Nhưng nhờ gợi ý của Milo, tôi đã tìm thấy giải pháp ở đây:
http://wordpress.mcdspot.com/2011/05/24/search-admin-user-list-on-first-and-last-names/

Sau khi điều chỉnh nó, nó hoạt động với tôi với 'facebook' và '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

Tôi không chắc là có thể, có thể bằng cách sửa đổi truy vấn thông qua pre_user_query. đây là một chức năng nhanh và bẩn để xem nội dung của nó:

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

Đầu ra pre_user_query là: WP_User_Query Object ([results] => [total_users] => 0 [query_fields] => SQL_CALC_FOUND_lawS wp_users.ID [query_from] => TỪ wp_users [query_f =] BY user_login ASC [query_limit] => LIMIT 20 [query_vars] => Array ([blog_id] => 1 [vai trò] => [meta_key] => [meta_value] => [meta_compare] => [bao gồm] => Array ( ) [loại trừ] => Mảng () [tìm kiếm] => [orderby] => Công ty [đặt hàng] => ASC [offset] => 0 [số] => 20 [Count_total] => 1 [trường] => all_with_meta [ai] =>)). Làm cách nào để sửa đổi truy vấn này, ví dụ: tham gia vào bảng db?
FredHead

@FredHead, Nếu bạn định đăng nhiều mã, bạn có thể cân nhắc sử dụng pastebin, snipplr hoặc một cái gì đó tương tự.
Jeremy Jared

@FredHead - Thành thật mà nói, tôi không biết. Tôi có thể cố gắng hack xung quanh nó sau, hoặc hy vọng một số người dùng có kinh nghiệm hơn có thể làm sáng tỏ nó.
Milo

Xin lỗi, đã cố gắng phản hồi nhưng nhận được thông báo lỗi liên quan đến nhận xét khó hiểu trong Chrome, Firefox đã ngăn việc gửi vào Th / Fri.
FredHead

Hãy thử lại lần nữa: Milo, câu trả lời của bạn ít nhất là đưa tôi đến sân bóng, cảm ơn bạn. Bây giờ tôi cần hiểu nếu / làm thế nào để thích ứng với userquery. Có lẽ ai đó có thể giúp tôi hiểu rằng một phần của vấn đề? Jeremy, tôi thấy giao diện bình luận này khó sử dụng (nhấn Enter key = gửi bình luận) hoặc tôi sẽ chuyển mã đầu ra sang nơi khác. Lấy làm tiếc.
FredHead

1

Cách đơn giản nhất để làm điều đó theo ý kiến ​​của tôi:

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

Nếu các giá trị meta của bạn không được điền đầy đủ (có null), câu trả lời tuyệt vời của @ brasofilo sẽ tạo ra một danh sách người dùng bỏ qua người dùng bị thiếu giá trị meta_values.

Việc khắc phục rất dễ dàng. Chỉ cần thực hiện THAM GIA TRÁI PHIẾU :

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

Tôi đã có thể đạt được cách sắp xếp người dùng của một cột tùy chỉnh bằng cách sử dụng mã và các móc bạn đã đăng, ngoại trừ tôi không sử dụng bộ lọc 'request', tôi cũng không cần thêm chức năng 'orderby'. Wordpress sắp xếp đúng dữ liệu trong cột tùy chỉnh trong trường hợp của tôi theo giá trị số mà tôi trả về trong hàm gọi lại hành động 'Manage_users_custom_column'.


Mát mẻ. Bạn có thể gửi mã cập nhật cho tôi / mọi người không? Cảm ơn bạn!
FredHead
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.