Thêm menu bộ lọc vào danh sách quản trị viên của bài đăng (thuộc loại tùy chỉnh) để lọc bài đăng theo giá trị trường tùy chỉnh


45

Câu trả lời này rất gần với những gì tôi đang tìm kiếm, nhưng thay vào đó tôi muốn chỉ định một trường tùy chỉnh cụ thể và hiển thị một menu chọn các giá trị có sẵn của nó. Cảm ơn!


1
@soulseekah không hợp pháp để hỏi đường trước khi thử đồ?
frnhr

Câu trả lời:


73

Cách thực hiện đơn giản, trước tiên hãy tạo danh sách thả xuống chỉ với các giá trị meta bạn muốn và sau đó bắt gửi trình lọc, chỉ cần thay đổi POST_TYPEtên của loại bài đăng của bạn và META_KEYtên của khóa meta của bạn:

<?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'];
    }
}

Xuất sắc! Tôi gặp sự cố khi điều này xuất hiện trên trang bài đăng loại mã xác thực của tôi (loại = cuộc thi). Bạn có thể kiểm tra mã Hàm.php của tôi không? Đây có phải được lấy từ một plugin hiện có? pastebin.com/BJMua8nq
adam5280

Bạn đã không thay đổi POST_TYPEở đây hãy thử điều này: pastebin.com/tabUfh3Y
BaiNET

Làm! Cảm ơn @Bai Internet! $ Type = 'bài'; trên dòng 65 cũng phải được thay đổi. Cảm ơn một lần nữa!
adam5280

:) Người duy nhất bạn không cần thay đổi, đó là mặc định, nhưng điều đó cũng ổn.
Bai Internet

2
Câu trả lời này hoạt động một điều trị trên WordPress 4.9.5! Đó là tuổi rất độc đáo, cảm ơn bạn!
Davey

2

Nếu bạn đang sử dụng một truy vấn khác bên trong, restrict_manage_postshãy đảm bảo bạn thêm && $query->is_main_query()vào câu lệnh parse_query if của mình, nếu không bộ lọc parse_query sẽ can thiệp vào truy vấn thứ hai đó.

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

0

Nếu bạn phải thêm nhiều trường, bạn phải thêm vào truy vấn

$query->query_vars['meta_query'][] = array(
    'key'     => 'KEY',
    'value'   => $_GET['FIELD'],
    'compare' => 'LIKE'
);
Licensed under cc by-sa 3.0 with attribution required.