Cara mengurutkan area admin jenis posting khusus WordPress berdasarkan bidang khusus

52

Saat mengedit salah satu jenis posting khusus saya, saya ingin dapat mencantumkan semua entri berdasarkan bidang khusus alih-alih tanggal diterbitkan (yang, untuk jenis posting khusus mungkin tidak relevan). Saya mendapat petunjuk dari komentar sebuah posting blog tentang jenis posting kustom dan penulis mengatakan itu mungkin dan bahkan dia membuatnya sehingga Anda dapat mengklik nama kolom untuk jenis kustom. Dia menyebutkan posts_orderbyfungsi yang saya catat dalam komentar saya sendiri tetapi sekarang saya dapat menemukan posting blog lagi. Ada saran? Saya melihat satu solusi yang digunakan

add_action('wp', 'check_page');

Dan check_pagefungsi yang digunakan add_filteruntuk mengubah kueri tapi saya cukup yakin itu hanya akan berfungsi di file tema, bukan di area admin.

tooshel
sumber
1
Di sini jawaban lain yang berguna, untuk mengurutkan posting dengan .... <br/> wordpress.stackexchange.com/questions/66455/…
T.Todua

Jawaban:

66

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:

Cara Membuat fungsi Urut Berdasar untuk Jenis Posting Kustom di Admin WordPress
(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 $_GETdan memvalidasi untuk memastikan itu adalah jenis posting yang valid post_type_exists()serta menjadi moviejenis posting (kedua cek itu berlebihan tetapi saya melakukannya untuk menunjukkan kepada Anda bagaimana jika Anda tidak ingin kesulitan) kode jenis posting.) Terakhir saya menggunakan sortbyparameter 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_queryhook yang dipanggil setelah WordPress memutuskan pertanyaan apa yang harus dijalankan tetapi sebelum menjalankan query. Di sini kita bisa mengatur nilai orderbydan meta_keydalam query_vararray kueri yang didokumentasikan dalam Codex pada orderbyparameter untuk query_posts(). Kami menguji untuk memastikan bahwa:

  1. Kami berada di admin ( is_admin()),
  2. Kami berada di halaman yang mencantumkan posting di admin ( $pagenow=='edit.php'),
  3. Halaman telah dipanggil dengan post_typeparameter URL sama dengan movie, dan
  4. Halaman ini juga telah dipanggil dengan sortbyparameter URL dan tidak diberi nilai ' Tidak Ada '

Jika semua tes lulus, kami kemudian menetapkan query_vars(seperti yang didokumentasikan di sini ) meta_valuedan sortbynilai 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_columnskail, 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_columnsdengan print_r()untuk melihat apa lagi yang tersedia secara default.)

Saya memutuskan untuk menambahkan " Diurutkan Menurut: " ketika ada sortbyparameter 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_columnpengait 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 sortbyparameter 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! :):

Kolom Kustom ditambahkan untuk Jenis Posting Kustom di Admin WordPress
(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.phpfile di tema Anda saat ini.

Bagaimana ini membantu.

MikeSchinkel
sumber
2
+1, hanya untuk upaya. Tetapi akan lebih baik lagi jika lingkarannya digambar tangan :-)
Jan Fabry
Adakah yang tahu cara menghapus filter SHOW ALL DATES sepenuhnya sehingga hanya filter khusus saya yang ditampilkan untuk jenis posting tertentu?
RailsTweeter
@RailsTweeter Gunakan teknik yang saya tunjukkan di sini di mana dua kait yang mengurung generasi HTML 'months_dropdown_results'dan 'restrict_manage_posts'. Upvote PS selalu dihargai. :)
MikeSchinkel
@ MikeSinkink, sekarang ada WP API, apakah ini akan memperbarui kode Anda?
samjco
@ Samjco Tidak yakin. Sayangnya saya tidak punya waktu untuk merevisi ini saat ini.
MikeSchinkel
-1

Inilah solusi sederhana:

/* --------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" );

Cukup ganti JENIS POST ANDA dan 'your_custom_field'

jake
sumber