Kolom Kustom yang Dapat Diurutkan di Panel Pengguna (users.php)?

8

Saya menggunakan plugin Register Plus Redux untuk menambah formulir pendaftaran dengan bidang metadata khusus. Bidang-bidang ini ditampilkan di bagian bawah setiap halaman detail catatan pengguna dan dapat diambil dengan get_the_author_meta.

Selain itu, saya dapat membuat kolom di panel Pengguna (tampilan daftar) dan membuat kolom ini dapat diurutkan. Masalahnya adalah, ketika saya mengklik judul kolom khusus, nilai orderby = di URL tampaknya diabaikan. Dengan kata lain, tampaknya permintaan yang menghasilkan tampilan daftar pengguna tidak termasuk data meta khusus (misalnya mungkin memerlukan pernyataan bergabung jika metadata tidak di tempat biasa untuk data pengguna?). Rasanya seperti saya telah melewatkan satu langkah.

Ini kode saya untuk membuat kolom khusus:

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

Dan ini kode saya untuk membuat kolom-kolom ini dapat disortir:

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

Adakah gagasan bagaimana saya dapat memperbarui kueri yang menghasilkan daftar pengguna sehingga mencakup pengurutan berdasarkan bidang khusus saya? Atau, jika bukan itu masalahnya, bagaimana cara membuat judul kolom khusus mengurutkan daftar pengguna saat diklik?

Terima kasih.

FredHead
sumber
Lihat blog tekina.info/… untuk penjelasan terperinci
Aniket Singh

Jawaban:

6

Jawaban pertama saya benar-benar keluar dari tanda dan saya benar-benar menulis ulang ...

Tetapi berkat petunjuk Milo, saya menemukan solusinya di sini:
http://wordpress.mcdspot.com/2011/05/24/search-admin-user-list-on-first-and-last-names/

Setelah mengadaptasinya, ini berfungsi untuk saya dengan 'facebook' dan '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
sumber
1

Saya tidak yakin itu mungkin, mungkin dengan memodifikasi kueri via pre_user_query. inilah fungsi cepat dan kotor untuk melihat isinya:

add_action('pre_user_query', 'my_user_query');
function my_user_query($userquery){
    print_r($userquery);
    die();
}
Milo
sumber
Output pre_user_query adalah: WP_User_Query Object ([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] => [termasuk] => Array ( ) [mengecualikan] => Array () [pencarian] => [orderby] => Perusahaan [order] => ASC [offset] => 0 [angka] => 20 [count_total] => 1 [bidang] => all_with_meta [siapa] =>)). Bagaimana saya mengubah kueri ini, misalnya bergabung ke tabel db?
FredHead
@FredHead, Jika Anda akan memposting banyak kode Anda dapat mempertimbangkan menggunakan pastebin, snipplr, atau yang serupa.
Jeremy Jared
@FredHead - jujur, saya tidak tahu. Saya bisa mencoba meretasnya nanti, atau mudah-mudahan beberapa pengguna yang lebih berpengalaman dapat menjelaskannya.
Milo
Maaf, mencoba merespons tetapi menerima pesan kesalahan terkait komentar yang tidak dapat dipahami di Chrome, Firefox yang mencegah pengiriman pada hari Jumat.
FredHead
Mari kita coba ini lagi: Milo, jawaban Anda setidaknya membuat saya di stadion baseball, terima kasih. Sekarang saya perlu mengerti jika / bagaimana mengadaptasi userquery. Mungkin seseorang dapat membantu saya memahami bagian dari masalah itu? Jeremy, saya menemukan antarmuka komentar ini sulit digunakan (tekan tombol Enter = kirim komentar) atau saya akan memindahkan kode output di tempat lain. Maaf.
FredHead
1

Cara paling sederhana untuk melakukannya menurut saya:

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

Jika nilai meta Anda tidak terisi penuh (memiliki nol), jawaban luar biasa @ brasofilo akan menghasilkan daftar pengguna yang menghilangkan pengguna dengan nilai meta_values ​​yang hilang.

Cara mengatasinya mudah. Lakukan saja KIRI BERGABUNG :

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

Saya dapat mencapai pemilahan pengguna kolom khusus menggunakan kode dan kait yang telah Anda posting, kecuali saya tidak menggunakan filter 'permintaan', dan saya juga tidak memerlukan fungsi 'orderby' tambahan. Wordpress dengan benar mengurutkan data dalam kolom khusus dalam kasus saya dengan nilai numerik yang saya kembalikan di callback tindakan 'manage_users_custom_column'.

ricosrealm
sumber
Keren. Bisakah Anda memposting kode yang diperbarui untuk saya / semua orang? Terima kasih!
FredHead