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_posts
bir 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 $_GET
ve geçerli sonrası tipi hem olduğundan emin olmak için doğrular post_type_exists()
yanı sıra olmanın movie
sonrası 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, sortby
URL 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_query
WordPress'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 orderby
ve meta_key
sorgunun içinde query_var
dizide Kodeksi belgelenen içinde orderby
iç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_type
eşit bir URL parametresiyle çağrıldı movie
ve
- Sayfa ayrıca bir
sortby
URL 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_value
ve 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_columns
bu 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_columns
için a ile kontrol edebilirsiniz print_r()
.)
Bir URL parametresi olduğunda ve olmadığında için " Sıralama kriteri: " eklemeye karar verdim :sortby
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;
}
Nihayet Kullandığımız manage_pages_custom_column
orada 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 sortby
URL 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.php
dosyadaki acemi için bir eklentiye veya daha fazlasına koyabilirsiniz .
Bu nasıl yardımcı olur.