WordPress özel yazı türünün yönetici alanı özel bir alana göre nasıl sıralanır


52

Özel gönderi tiplerimden birini düzenlerken, tüm girişleri yayımlandıkları tarih yerine özel bir alana göre listeleyebiliyorum (bu, özel bir gönderi türü için muhtemelen alakalı değildir). Bir blog yazısının özel yazı türleri hakkındaki yorumlarından bir ipucu aldım ve yazar bunun mümkün olduğunu ve özel bir sıralama için sütun adlarına tıklayabilmenizi sağladığını söyledi. posts_orderbyKendi yorumlarımda kaydettiğim fonksiyondan bahsetti ama artık blog yazısını bulabiliyorum. Baska öneri? Kullanılan bir çözüm gördüm

add_action('wp', 'check_page');

Ve sorguyu değiştirmek için check_pagekullanılan işlev add_filter, ancak yönetici alanında değil, yalnızca tema dosyalarında çalışacağından eminim.


1
İşte gönderileri sıralamak için başka bir yararlı cevap .... <br/> wordpress.stackexchange.com/questions/66455/…
T.Todua

Yanıtlar:


66

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>

WordPress Yöneticisi'nde Özel Bir Yazı Tipi için Sıralamaya Göre İşlevsellik Nasıl Oluşturulur
(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:

  1. Yöneticideyiz ( is_admin()),
  2. Yönetici ( $pagenow=='edit.php'), içinde mesajları listeleyen sayfasındayız ,
  3. Sayfa, ile post_typeeşit bir URL parametresiyle çağrıldı movieve
  4. 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! :):

WordPress Yöneticisi'nde Özel Yazı Türü için eklenen Özel Sütunlar
(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.


2
+1, sadece çaba için. Ancak daireler elle çizilmiş olsaydı daha da iyi olurdu :-)
Jan Fabry

Belirli bir gönderi türünde yalnızca özel filtrelerimin gösterilmesi için SHOW ALL DATES filtresini tamamen nasıl kaldıracağınız hakkında bir fikriniz var mı?
RailsTweeter

@RailsTweeter Burada HTML neslini destekleyen iki kancanın nerede olduğunu gösterdiğim tekniği kullanın 'months_dropdown_results've 'restrict_manage_posts'. PS Olumlu oylar her zaman takdir edilir. :)
MikeSchinkel

@MikeSchinkel, şimdi bir WP API'si var, bu kodunuzu biraz güncelleyecek mi?
samjco

@ samjco Emin değil. Maalesef şu anda bunu düzeltecek zamanım yok.
MikeSchinkel


-1

İşte basit bir çözüm:

/* --------Sortable Events on Dashboard - show start date, time, venue--------- */

/*-------------------------------------------------------------------------------
    Custom Columns
-------------------------------------------------------------------------------*/

function my_*YOUR POST TYPE*_columns($columns)
{
    $columns = array(
        'cb'        => '<input type="checkbox" />',
        'title'     => 'Title',
        'your_custom_field'     => 'Custom Field Name',          
        'date'      =>  'Date',
    );
    return $columns;
}

function my_custom_columns($column)
{
    global $post;
    if($column == 'your_custom_field')
    {
        if(get_post_meta($post->ID, 'your_custom_field', true);)
        {
            echo get_post_meta($post->ID, 'your_custom_field', true);
        }
    }

}

add_action("manage_posts_custom_column", "my_custom_columns");
add_filter("manage_edit-*YOUR POST TYPE*_columns", "my_events_columns");

/*-------------------------------------------------------------------------------
    Sortable Columns
-------------------------------------------------------------------------------*/

function my_column_register_sortable( $columns )
{
    $columns['your_custom_field'] = 'your_custom_field';
    return $columns;
}

add_filter("manage_edit-*YOUR POST TYPE*_sortable_columns", "my_column_register_sortable" );

POST TİPİNİZİ ve 'your_custom_field'ı değiştirin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.