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 $_GET
dan memvalidasi untuk memastikan itu adalah jenis posting yang valid post_type_exists()
serta menjadi movie
jenis posting (kedua cek itu berlebihan tetapi saya melakukannya untuk menunjukkan kepada Anda bagaimana jika Anda tidak ingin kesulitan) kode jenis posting.) Terakhir saya menggunakan sortby
parameter 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_query
hook yang dipanggil setelah WordPress memutuskan pertanyaan apa yang harus dijalankan tetapi sebelum menjalankan query. Di sini kita bisa mengatur nilai orderby
dan meta_key
dalam query_var
array kueri yang didokumentasikan dalam Codex pada orderby
parameter 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_type
parameter URL sama dengan movie
, dan
- Halaman ini juga telah dipanggil dengan
sortby
parameter URL dan tidak diberi nilai ' Tidak Ada '
Jika semua tes lulus, kami kemudian menetapkan query_vars
(seperti yang didokumentasikan di sini ) meta_value
dan sortby
nilai 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_columns
kail, 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_columns
dengan print_r()
untuk melihat apa lagi yang tersedia secara default.)
Saya memutuskan untuk menambahkan " Diurutkan Menurut: " ketika ada sortby
parameter 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_column
pengait 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 sortby
parameter 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.php
file di tema Anda saat ini.
Bagaimana ini membantu.