Seperti yang mungkin Anda bayangkan dengan kurangnya jawaban yang diberikan, solusinya tidak sepenuhnya sepele. Apa yang saya lakukan adalah membuat contoh yang cukup lengkap yang mengasumsikan tipe posting kustom " movie" dan kunci bidang kustom " Genre ".
Penafian : ini bekerja dengan WP3.0 tapi saya tidak yakin itu akan bekerja dengan versi sebelumnya.
Anda pada dasarnya perlu menghubungkan dua (2) kait untuk membuatnya berfungsi dan dua lainnya (2) untuk membuatnya jelas dan bermanfaat.
Hook pertama adalah ' restrict_manage_posts' yang memungkinkan Anda memancarkan HTML <select>di area di atas daftar posting tempat " Tindakan Massal " dan " Tampilkan Tanggal ". Kode yang diberikan akan menghasilkan fungsionalitas " Urutkan menurut: " seperti yang terlihat dalam cuplikan layar ini:

(sumber: mikeschinkel.com )
Kode menggunakan SQL langsung karena tidak ada fungsi WordPress API untuk memberikan daftar semua meta_keys untuk jenis posting (kedengarannya seperti tiket trac masa depan bagi saya ...) Bagaimanapun, ini kodenya. Perhatikan bahwa ia mengambil jenis posting dari $_GETdan memvalidasi untuk memastikan itu adalah jenis posting yang valid post_type_exists()serta menjadi moviejenis posting (kedua cek itu berlebihan tetapi saya melakukannya untuk menunjukkan kepada Anda bagaimana jika Anda tidak ingin kesulitan) kode jenis posting.) Terakhir saya menggunakan sortbyparameter URL karena tidak bertentangan dengan hal lain di WordPress:
add_action('restrict_manage_posts','restrict_manage_movie_sort_by_genre');
function restrict_manage_movie_sort_by_genre() {
if (isset($_GET['post_type'])) {
$post_type = $_GET['post_type'];
if (post_type_exists($post_type) && $post_type=='movie') {
global $wpdb;
$sql=<<<SQL
SELECT pm.meta_key FROM {$wpdb->postmeta} pm
INNER JOIN {$wpdb->posts} p ON p.ID=pm.post_id
WHERE p.post_type='movie' AND pm.meta_key='Genre'
GROUP BY pm.meta_key
ORDER BY pm.meta_key
SQL;
$results = $wpdb->get_results($sql);
$html = array();
$html[] = "<select id=\"sortby\" name=\"sortby\">";
$html[] = "<option value=\"None\">No Sort</option>";
$this_sort = $_GET['sortby'];
foreach($results as $meta_key) {
$default = ($this_sort==$meta_key->meta_key ? ' selected="selected"' : '');
$value = esc_attr($meta_key->meta_key);
$html[] = "<option value=\"{$meta_key->meta_key}\"$default>{$value}</option>";
}
$html[] = "</select>";
echo "Sort by: " . implode("\n",$html);
}
}
}
Langkah kedua yang diperlukan adalah menggunakan parse_queryhook yang dipanggil setelah WordPress memutuskan pertanyaan apa yang harus dijalankan tetapi sebelum menjalankan query. Di sini kita bisa mengatur nilai orderbydan meta_keydalam query_vararray kueri yang didokumentasikan dalam Codex pada orderbyparameter untuk query_posts(). Kami menguji untuk memastikan bahwa:
- Kami berada di admin (
is_admin()),
- Kami berada di halaman yang mencantumkan posting di admin (
$pagenow=='edit.php'),
- Halaman telah dipanggil dengan
post_typeparameter URL sama dengan movie, dan
- Halaman ini juga telah dipanggil dengan
sortbyparameter URL dan tidak diberi nilai ' Tidak Ada '
Jika semua tes lulus, kami kemudian menetapkan query_vars(seperti yang didokumentasikan di sini ) meta_valuedan sortbynilai kami untuk ' Genre ':
add_filter( 'parse_query', 'sort_movie_by_meta_value' );
function sort_movie_by_meta_value($query) {
global $pagenow;
if (is_admin() && $pagenow=='edit.php' &&
isset($_GET['post_type']) && $_GET['post_type']=='movie' &&
isset($_GET['sortby']) && $_GET['sortby'] !='None') {
$query->query_vars['orderby'] = 'meta_value';
$query->query_vars['meta_key'] = $_GET['sortby'];
}
}
Dan itu semua yang perlu Anda lakukan; " posts_order" atau " wp" kait tidak diperlukan! Tentu saja Anda benar-benar perlu melakukan lebih banyak; Anda perlu menambahkan beberapa kolom pada halaman Anda yang mencantumkan posting sehingga Anda benar-benar dapat melihat nilai-nilai yang disortir oleh jika tidak, pengguna akan menjadi sangat bingung. Jadi tambahkan manage_{$post_type}_posts_columnskail, dalam hal ini manage_movie_posts_columns. Pengait ini dilewati array default kolom dan untuk kesederhanaan saya hanya menggantinya dengan dua kolom standar; kotak centang ( cb) dan nama posting ( title). (Anda dapat memeriksa posts_columnsdengan print_r()untuk melihat apa lagi yang tersedia secara default.)
Saya memutuskan untuk menambahkan " Diurutkan Menurut: " ketika ada sortbyparameter URL dan ketika tidak None:
add_action('manage_movie_posts_columns', 'manage_movie_posts_columns');
function manage_movie_posts_columns($posts_columns) {
$posts_columns = array(
'cb' => $posts_columns['cb'],
'title' => 'Movie Name',
);
if (isset($_GET['sortby']) && $_GET['sortby'] !='None')
$posts_columns['meta_value'] = 'Sorted By';
return $posts_columns;
}
Akhirnya kami menggunakan manage_pages_custom_columnpengait untuk benar-benar menampilkan nilai ketika ada posting dari jenis posting yang sesuai dan dengan tes yang mungkin berlebihan untuk is_admin()dan $pagenow=='edit.php'. Ketika ada sortbyparameter URL, kami mengekstrak nilai bidang khusus yang sedang disortir oleh tampilan di daftar kami. Begini tampilannya (ingat, ini adalah data uji sehingga tidak ada komentar dari galeri kacang pada klasifikasi film! :):

(sumber: mikeschinkel.com )
Dan ini kodenya:
add_action('manage_pages_custom_column', 'manage_movie_pages_custom_column',10,2);
function manage_movie_pages_custom_column($column_name,$post_id) {
global $pagenow;
$post = get_post($post_id);
if ($post->post_type=='movie' && is_admin() && $pagenow=='edit.php') {
switch ($column_name) {
case 'meta_value':
if (isset($_GET['sortby']) && $_GET['sortby'] !='None') {
echo get_post_meta($post_id,$_GET['sortby'],true);
}
break;
}
}
}
Perhatikan bahwa ini hanya mengambil " Genre " pertama untuk a movie, yaitu meta_value pertama dalam kasus beberapa nilai untuk kunci yang diberikan. Tapi sekali lagi saya tidak yakin bagaimana cara kerjanya sebaliknya!
Dan bagi mereka yang tidak terbiasa dengan di mana menempatkan kode ini, Anda dapat memasukkannya ke dalam plugin atau lebih mungkin bagi pemula dalam functions.phpfile di tema Anda saat ini.
Bagaimana ini membantu.