it-swarm.asia

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

Özel gönderi türlerimden 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. Kendi yorumlarımda kaydettiğim posts_orderby işlevinden bahsetti, ancak artık blog gönderisini bulabiliyorum. Herhangi bir öneri? Kullanılan bir çözüm gördüm

add_action('wp', 'check_page');

Ve check_page işlevi sorguyu değiştirmek için add_filter kullandı, ancak yönetici alanında değil sadece tema dosyalarında çalışacağından eminim.

52
tooshel

Sağlanan cevapların eksikliğini tahmin edebileceğiniz gibi, çözüm tam olarak önemsiz değildir. Yaptığım, "movie" özel bir yazı tipi ve "Genre" özel alan anahtarını kabul eden kendi kendine yeten bir örnek oluşturmak.

Feragat: 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ı takmanız gerekir.

İlk kanca, "Toplu İşlemler" ve "Tarihleri ​​Göster" filtrelerinin bulunduğu liste listesinin üstündeki alanda bir HTML restrict_manage_posts göndermenizi sağlayan '<select>'. Sağlanan kod, bu ekran snippet'inde görüldüğü gibi "Sırala:" işlevselliğini üretecektir:

How to Create Sort By functionality for a Custom Post Type in the WordPress Admin
(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 (gelecekteki bir ses ( trac bilet bana ...) Yine de, işte kod. $_GET adresinden post tipini alır ve hem geçerli bir post tipi post_type_exists() hem de movie post tipi olduğundan emin olmak için doğrular (bu iki kontrol overkill'dir, ancak bunu nasıl yapmak isteyip istemediğinizi size göstermek için yaptım. yazı tipini kodlayın.) Son olarak, WordPress'te başka hiçbir şeyle çakışmadığı için sortby URL parametresini 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, WordPress'in hangi sorgunun çalıştırılması gerektiğine karar vermesinden sonra sorguyu çalıştırmadan önce, sorguyu çalıştırmadan önce çağrılan parse_query kancasını kullanmaktır. Burada, sorgunun meta_key dizisindeki orderby ve query_var değerlerini _ olan Codex / query_posts() için orderby parametresinde belgelendirir) olarak ayarlayacağız.

  1. Yönetici içerisindeyiz (is_admin()),
  2. Yönetici içindeki mesajları listeleyen sayfadayız ($pagenow=='edit.php'),
  3. Sayfa, movie değerine eşit bir post_type URL parametresiyle çağrıldı ve
  4. Sayfa ayrıca sortby URL parametresiyle çağrıldı ve 'Yok' değerinden geçilmedi

Bütün bu testler geçerse, query_vars_ (burada ) 'da gösterildiği gibi) meta_value' e ve 'Tür' için sortby değerimize ayarlayın:

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" kancaları gerekmez! 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. Bu yüzden bir manage_{$post_type}_posts_columns kancası ekleyin, bu durumda manage_movie_posts_columns. Bu kanca varsayılan sütun dizisinden geçiyor ve basitlik için onu sadece iki standart sütunla değiştirdim; bir onay kutusu (cb) ve bir posta adı (title). (Varsayılan olarak başka nelerin uygun olduğunu görmek için posts_columnsprint_r() ile inceleyebilirsiniz.)

sortby URL parametresi olduğunda ve None olmadığında "Sıralama kriteri:" eklemeye karar verdim:

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;
}

Son olarak, uygun yazı tipinde bir gönderi olduğunda ve is_admin() ve manage_pages_custom_column için muhtemelen gereksiz bir test olduğunda değeri görüntülemek için $pagenow=='edit.php' kancasını kullanırız. sortby URL parametresi olduğunda, listemizdeki bir ekrana göre sıralanan özel alan değerini çıkarı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 hiçbir yorum yapılmadı! :):

Custom Columns added for a Custom Post Type in the WordPress Admin
(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 movie için ilk "Genre" yi, yani belirli bir anahtar için birden fazla değer olması durumunda ilk meta_ değerini aldığını unutmayın. Ama sonra yine nasıl çalışacağından emin değilim!

Ve bu kodu nereye koyacağı hakkında bilgisi olmayanlar için, mevcut temanızdaki functions.php dosyasındaki acemi için bir eklentiye ya da daha muhtemel olanı ekleyebilirsiniz.

Bu nasıl yardımcı olur.

66
MikeSchinkel

WordPress 3.1'den itibaren (beta kullanıyorum) sütunlar artık başlıkları üzerinden sıralanabilir.

Aşağıdaki yazı, bunların nasıl uygulanacağını ayrıntılarıyla anlatmaktadır.

http://scribu.net/wordpress/custom-sortable-columns.html

8
Leo Plaw