it-swarm-id.com

Cara mengurutkan area admin jenis posting khusus WordPress berdasarkan bidang khusus

Saat mengedit salah satu jenis posting kustom saya, saya ingin dapat mencantumkan semua entri dengan bidang khusus alih-alih tanggal diterbitkan (yang, untuk jenis posting kustom 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 bisa mengklik nama kolom untuk jenis kustom. Dia menyebutkan fungsi posts_orderby 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 fungsi check_page digunakan add_filter untuk mengubah permintaan tapi saya cukup yakin itu hanya akan berfungsi di file tema, bukan di area admin.

52
tooshel

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 jenis pos kustom "movie" dan kunci bidang khusus "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.

Kait pertama adalah 'restrict_manage_posts' yang memungkinkan Anda memancarkan HTML <select> di area di atas daftar posting di mana filter "Tindakan Massal" dan "Tampilkan Tanggal". Kode yang diberikan akan menghasilkan fungsionalitas "Urutkan berdasarkan:" seperti yang terlihat dalam cuplikan layar ini:

 How to Create Sort By functionality for a Custom Post Type in the WordPress Admin 
(sumber: mikeschinkel.com )

Kode ini menggunakan SQL langsung karena tidak ada fungsi WordPress API untuk menyediakan daftar semua meta_keys untuk jenis posting (kedengarannya seperti masa depan trac tiket kepada saya ...) Bagaimanapun, inilah kodenya. Perhatikan bahwa ia mengambil jenis posting dari $_GET dan memvalidasi untuk memastikan itu adalah tipe posting yang benar post_type_exists() serta menjadi jenis posting movie (kedua pemeriksaan itu berlebihan tetapi saya melakukannya untuk menunjukkan kepada Anda bagaimana jika Anda tidak mau ke hard-code jenis posting.) Terakhir saya menggunakan parameter URL sortby 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 kait parse_query yang dipanggil setelah WordPress memutuskan satu query apa yang harus dijalankan tetapi sebelum menjalankan query. Di sini kita bisa menetapkan nilai orderby dan meta_key dalam larik query_var kueri yang didokumentasikan dalam Codex dalam parameter orderby 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 parameter URL post_type sama dengan movie, dan
  4. Halaman ini juga dipanggil dengan parameter URL sortby dan tidak diberi nilai 'None'

Jika semua tes lulus, kami kemudian menetapkan query_vars (seperti yang didokumentasikan di sini ) menjadi meta_value dan nilai sortby 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; tidak diperlukan "posts_order" atau "wp"! 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 kait manage_{$post_type}_posts_columns, 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_columns dengan print_r() untuk melihat apa lagi yang tersedia secara default.)

Saya memutuskan untuk menambahkan "Diurut Dengan:" ketika ada parameter URL sortby dan ketika itu 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 kita menggunakan kait manage_pages_custom_column 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 parameter URL sortby kami mengekstraksi nilai bidang khusus yang sedang diurutkan berdasarkan tampilan dalam daftar kami. Begini tampilannya (ingat, ini adalah data uji sehingga tidak ada komentar dari galeri kacang pada klasifikasi film! :):

 Custom Columns added for a Custom Post Type in the WordPress Admin 
(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 "Genrepertama" untuk movie, mis. 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 tempat meletakkan kode ini, Anda dapat memasukkannya ke dalam plugin atau lebih mungkin bagi pemula di file functions.php dalam tema Anda saat ini.

Bagaimana ini membantu.

66
MikeSchinkel

Pada WordPress 3.1 (Saya menggunakan beta) kolom sekarang dapat disortir melalui judul mereka.

Posting berikut merinci bagaimana mengimplementasikannya.

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

8
Leo Plaw