Sağlanan cevapların eksikliğini tahmin edebileceğiniz gibi, çözüm tam olarak önemsiz değildir. Yaptığım şey, " movie" özel yazı tipini ve " Tür " özel alan anahtarını varsayan, kendi kendine yeten bir örnek oluşturmak .
Yasal Uyarı : Bu WP3.0 ile çalışır, ancak önceki sürümlerle çalışacağından emin olamıyorum.
Temel olarak çalışmasını sağlamak için iki (2) kancayı ve daha açık ve kullanışlı hale getirmek için iki (2) kancayı bağlamanız gerekir.
İlk kanca, " Toplu İşlemler " ve " Tarihleri Göster " öğelerinin filtrelendiği gönderi listesinin üstündeki alanda restrict_manage_postsbir HTML yayınlamanızı sağlayan ' ' dır . Sağlanan kod , bu ekran snippet'inde görüldüğü gibi " Sırala: " işlevselliğini üretecektir :<select>

(kaynak: mikeschinkel.com )
Kod, doğrudan SQL kullanır, çünkü bir yazı türüne ilişkin tüm meta_key'lerin listesini sağlamak için bir WordPress API işlevi yoktur ( bana gelecekteki trac biletine benziyor ...) Her neyse, işte kod. Ondan sonrası tipini alıyor unutmayın $_GETve geçerli sonrası tipi hem olduğundan emin olmak için doğrular post_type_exists()yanı sıra olmanın moviesonrası tip (bu iki çekler tarafından olduğu düşünülen ama bırakmadığınızdan etmek istemiyorsanız nasıl göstermek için yaptım yazı tipini kodlayın.) Son olarak, sortbyURL parametresini WordPress'teki başka hiçbir şeyle çakışmadığı için kullanıyorum:
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);
}
}
}
İkinci gerekli adım, parse_queryWordPress'in hangi sorgunun çalıştırılması gerektiğine karar vermesinden sonra sorguyu çalıştırmadan önce çağrılan kancayı kullanmaktır . Burada değerlerini ayarlamak için olsun orderbyve meta_keysorgunun içinde query_vardizide Kodeksi belgelenen içinde orderbyiçin parametre query_posts(). Şunlardan emin olmak için test ediyoruz:
- Yöneticideyiz (
is_admin()),
- Yönetici (
$pagenow=='edit.php'), içinde mesajları listeleyen sayfasındayız ,
- Sayfa, ile
post_typeeşit bir URL parametresiyle çağrıldı movieve
- Sayfa ayrıca bir
sortbyURL parametresiyle çağrılmıştır ve ' Yok ' değerinden geçilmemiştir.
Tüm bu testler başarılı olursa o zaman set query_vars(belgelendiği gibi burada ) için meta_valueve bizim sortby'değeri Türe ':
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'];
}
}
Ve yapmanız gereken tek şey bu; " posts_order" veya " wp" kancaya gerek yok! Tabii ki aslında daha fazlasını yapmanız gerekiyor; sayfanıza gönderileri listeleyen bazı sütunlar eklemeniz gerekir, böylece gerçekte sıraladığınız değerleri görebilirsiniz, aksi takdirde kullanıcılar kafanız karışır. Öyleyse manage_{$post_type}_posts_columnsbu durumda bir kanca ekleyin manage_movie_posts_columns. Bu kanca varsayılan sütun dizisinden geçiyor ve basitlik için onu iki standart sütunla değiştirdim; bir onay kutusu ( cb) ve bir posta adı ( title). ( Varsayılan olarak başka ne kullanılabilir olduğunu görmek posts_columnsiçin a ile kontrol edebilirsiniz print_r().)
Bir URL parametresi olduğunda ve olmadığında için " Sıralama kriteri: " eklemeye karar verdim :sortbyNone
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;
}
Nihayet Kullandığımız manage_pages_custom_columnorada uygun sonrası türde bir yazı olduğunu ve muhtemelen gereksiz için test ile zaman aslında değeri görüntülemek için kanca is_admin()ve $pagenow=='edit.php'. Bir sortbyURL parametresi olduğunda, listemizdeki bir ekrana göre sıralanan özel alan değerini çıkartırız. İşte göründüğü gibi (unutmayın, bu test verileridir, bu yüzden film sınıflandırmaları hakkında yerfıstığı galerisinden yorum yok! :):

(kaynak: mikeschinkel.com )
Ve işte kod:
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;
}
}
}
Bunun yalnızca a için ilk " Tür " movieü, yani belirli bir anahtar için birden fazla değer olması durumunda ilk meta_değerini seçtiğini unutmayın. Ama sonra yine nasıl çalışacağından emin değilim!
Ve bu kodu nereye koyacağınızı bilmeyenler için, mevcut temanızdaki functions.phpdosyadaki acemi için bir eklentiye veya daha fazlasına koyabilirsiniz .
Bu nasıl yardımcı olur.