Bagaimana cara memfilter daftar posting (dalam daftar posting dashboard WP) menggunakan bidang khusus (fungsi pencarian)?

37

Terlepas dari kenyataan bahwa saya sering mencari di Google, saya belum menemukan jawaban untuk pertanyaan yang sangat sederhana:

Saya memiliki beberapa posting dengan bidang khusus (mis. Supplier_name). Saya ingin dapat mencari dan memfilter posting saya sesuai dengan bidang khusus ini. Dengan kata lain, dalam daftar posting admin, saya ingin memiliki kotak pencarian (bernama "Nama pemasok") di mana saya dapat mengetikkan nilai (mis. "IBM") dan kemudian, klik tombol pencarian yang akan memberikan saya kembalikan semua pos yang memiliki bidang khusus bernama "supplier_name" dan, jika demikian, nilai bidang khusus tersebut adalah "IBM".

Bagaimana saya bisa melakukan ini?

jean04
sumber

Jawaban:

44

Saya memberi kode plugin hanya untuk itu dan tidak pernah sempat mempublikasikannya:

masukkan deskripsi gambar di sini

Pemakaian:

Di dropdown Anda memiliki daftar semua bidang khusus, jadi pilih saja bidang yang ingin Anda filter dan klik filter. jika Anda ingin memfilter ke nilai spesifik bidang khusus lalu pilih nama bidang itu, masukkan nilai yang Anda inginkan dan klik filter.

<?php
/*
Plugin Name: Admin Filter BY Custom Fields
Plugin URI: http://en.bainternet.info
Description: Filter posts or pages in admin by custom fields (post meta)
Version: 1.0
Author: Bainternet
Author URI: http://en.bainternet.info
*/



add_filter( 'parse_query', 'ba_admin_posts_filter' );
add_action( 'restrict_manage_posts', 'ba_admin_posts_filter_restrict_manage_posts' );

function ba_admin_posts_filter( $query )
{
    global $pagenow;
    if ( is_admin() && $pagenow=='edit.php' && isset($_GET['ADMIN_FILTER_FIELD_NAME']) && $_GET['ADMIN_FILTER_FIELD_NAME'] != '') {
        $query->query_vars['meta_key'] = $_GET['ADMIN_FILTER_FIELD_NAME'];
    if (isset($_GET['ADMIN_FILTER_FIELD_VALUE']) && $_GET['ADMIN_FILTER_FIELD_VALUE'] != '')
        $query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_VALUE'];
    }
}

function ba_admin_posts_filter_restrict_manage_posts()
{
    global $wpdb;
    $sql = 'SELECT DISTINCT meta_key FROM '.$wpdb->postmeta.' ORDER BY 1';
    $fields = $wpdb->get_results($sql, ARRAY_N);
?>
<select name="ADMIN_FILTER_FIELD_NAME">
<option value=""><?php _e('Filter By Custom Fields', 'baapf'); ?></option>
<?php
    $current = isset($_GET['ADMIN_FILTER_FIELD_NAME'])? $_GET['ADMIN_FILTER_FIELD_NAME']:'';
    $current_v = isset($_GET['ADMIN_FILTER_FIELD_VALUE'])? $_GET['ADMIN_FILTER_FIELD_VALUE']:'';
    foreach ($fields as $field) {
        if (substr($field[0],0,1) != "_"){
        printf
            (
                '<option value="%s"%s>%s</option>',
                $field[0],
                $field[0] == $current? ' selected="selected"':'',
                $field[0]
            );
        }
    }
?>
</select> <?php _e('Value:', 'baapf'); ?><input type="TEXT" name="ADMIN_FILTER_FIELD_VALUE" value="<?php echo $current_v; ?>" />
<?php
}
Bainternet
sumber
7
Mengapa tidak menggunakan fungsi helper untuk kotak pilihan Anda? yaitu. ganti $field[0] == $current? ' selected="selected"':'', dengan selected( $field[0] == $current, true, false ),... :)
t31os
jawaban ini tidak berfungsi lagi.
Kir Mazur
Apakah ada cara untuk membuatnya berfungsi di WordPress versi terbaru?
nakkeru