Làm cách nào để lọc danh sách bài đăng (trong danh sách bài đăng trên bảng điều khiển WP) bằng cách sử dụng trường tùy chỉnh (chức năng tìm kiếm)?


37

Mặc dù thực tế tôi đã googled rất nhiều, tôi đã không tìm thấy câu trả lời cho một câu hỏi rất đơn giản:

Tôi có một số bài đăng với trường tùy chỉnh (ví dụ: nhà cung cấp tên). Tôi muốn có thể tìm kiếm và lọc các bài đăng của mình theo trường tùy chỉnh này. Nói cách khác, trong danh sách bài đăng của quản trị viên, tôi muốn có một hộp tìm kiếm (được đặt tên là "Tên nhà cung cấp") nơi tôi có thể nhập một giá trị (ví dụ: "IBM") và sau đó, nhấp vào nút tìm kiếm sẽ cung cấp gửi lại cho tôi tất cả các bài đăng có trường tùy chỉnh có tên "nhà cung cấp" và, nếu vậy, giá trị của trường tùy chỉnh sẽ là "IBM".

Tôi có thể làm cái này như thế nào ?

Câu trả lời:


44

Tôi đã mã hóa một plugin chỉ cho điều đó và không bao giờ có xung quanh để xuất bản nó:

nhập mô tả hình ảnh ở đây

Sử dụng:

Trong danh sách thả xuống, bạn có một danh sách tất cả các trường tùy chỉnh, vì vậy chỉ cần chọn trường bạn muốn lọc và nhấp vào bộ lọc. nếu bạn muốn lọc theo một giá trị cụ thể của trường tùy chỉnh, sau đó chọn tên của trường, nhập giá trị bạn muốn và nhấp vào bộ lọc.

<?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
}

7
Tại sao không sử dụng chức năng trợ giúp cho hộp lựa chọn của bạn? I E. thay thế $field[0] == $current? ' selected="selected"':'', bằng selected( $field[0] == $current, true, false ),... :)
t31os

Câu trả lời này không còn hiệu quả nữa.
Kir Mazur

Có cách nào để làm cho nó hoạt động trong các phiên bản mới nhất của WordPress không?
nakkeru
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.