Tambahkan menu filter ke daftar admin posting (tipe khusus) untuk memfilter posting berdasarkan nilai bidang khusus

45

Jawaban ini sangat dekat dengan apa yang ingin saya lakukan, tetapi saya ingin menentukan bidang khusus dan menampilkan menu pilih dari nilai-nilai yang tersedia. Terima kasih!

adam5280
sumber
1
@soulseekah tidak sah untuk menanyakan arah sebelum mencoba barang?
frnhr

Jawaban:

73

Mudah dilakukan, pertama buat dropdown hanya dengan nilai meta yang Anda inginkan dan kemudian tangkap POST_TYPEkiriman filter, cukup ubah ke nama jenis posting Anda dan META_KEYke nama kunci meta Anda:

<?php
/*
Plugin Name: Admin Filter BY Custom Fields
Plugin URI: http://en.bainternet.info
Description: answer to http://wordpress.stackexchange.com/q/45436/2487
Version: 1.0
Author: Bainternet
Author URI: http://en.bainternet.info
*/

add_action( 'restrict_manage_posts', 'wpse45436_admin_posts_filter_restrict_manage_posts' );
/**
 * First create the dropdown
 * make sure to change POST_TYPE to the name of your custom post type
 * 
 * @author Ohad Raz
 * 
 * @return void
 */
function wpse45436_admin_posts_filter_restrict_manage_posts(){
    $type = 'post';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }

    //only add filter to post type you want
    if ('POST_TYPE' == $type){
        //change this to the list of values you want to show
        //in 'label' => 'value' format
        $values = array(
            'label' => 'value', 
            'label1' => 'value1',
            'label2' => 'value2',
        );
        ?>
        <select name="ADMIN_FILTER_FIELD_VALUE">
        <option value=""><?php _e('Filter By ', 'wose45436'); ?></option>
        <?php
            $current_v = isset($_GET['ADMIN_FILTER_FIELD_VALUE'])? $_GET['ADMIN_FILTER_FIELD_VALUE']:'';
            foreach ($values as $label => $value) {
                printf
                    (
                        '<option value="%s"%s>%s</option>',
                        $value,
                        $value == $current_v? ' selected="selected"':'',
                        $label
                    );
                }
        ?>
        </select>
        <?php
    }
}


add_filter( 'parse_query', 'wpse45436_posts_filter' );
/**
 * if submitted filter by post meta
 * 
 * make sure to change META_KEY to the actual meta key
 * and POST_TYPE to the name of your custom post type
 * @author Ohad Raz
 * @param  (wp_query object) $query
 * 
 * @return Void
 */
function wpse45436_posts_filter( $query ){
    global $pagenow;
    $type = 'post';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 'POST_TYPE' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['ADMIN_FILTER_FIELD_VALUE']) && $_GET['ADMIN_FILTER_FIELD_VALUE'] != '') {
        $query->query_vars['meta_key'] = 'META_KEY';
        $query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_VALUE'];
    }
}
Bainternet
sumber
Luar biasa! Saya mengalami kesulitan untuk menampilkan ini pada halaman jenis posting custtom saya (type = contestentry). Bisakah Anda memeriksa kode functions.php saya? Apakah ini diambil dari plugin yang ada? pastebin.com/BJMua8nq
adam5280
Anda tidak mengubah di POST_TYPEsini, coba ini: pastebin.com/tabUfh3Y
Bainternet
Bekerja! Terima kasih @Bainternet! $ Type = 'post'; pada saluran 65 harus diubah juga. Terima kasih lagi!
adam5280
:) Satu-satunya yang Anda tidak perlu ubah, itu ada untuk default, tapi tidak apa-apa juga.
Bainternet
2
Jawaban ini berhasil di WordPress 4.9.5! Ini menua dengan sangat baik, terima kasih!
Davey
2

Jika Anda menggunakan kueri lain di dalam, restrict_manage_postspastikan Anda menambahkan && $query->is_main_query()pernyataan parse_query if Anda, jika tidak, filter parse_query akan mengganggu kueri kedua itu.

if ( 'POST_TYPE' == $type
      && is_admin()
      && $pagenow=='edit.php'
      && isset($_GET['ADMIN_FILTER_FIELD_VALUE'])
      && $_GET['ADMIN_FILTER_FIELD_VALUE'] != ''
      && $query->is_main_query()
) {
      $query->query_vars['meta_key'] = 'META_KEY';
      $query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_VALUE'];
}
Ellis Benus Pengembang Web
sumber
0

Jika Anda harus menambahkan banyak bidang, Anda harus menambah kueri

$query->query_vars['meta_query'][] = array(
    'key'     => 'KEY',
    'value'   => $_GET['FIELD'],
    'compare' => 'LIKE'
);
Aaron Nusselbaum
sumber