Thêm filter để lọc bài viết trong bảng quản lý admin WordPress

Trong bảng quản lý bài viết WordPress, bạn có thể tìm kiếm bài viết theo chuyên mục và ngày tháng, nhưng nếu bây giờ bạn muốn lọc bài viết theo một thuộc tính nào đó thì bạn cũng có thể thêm được bộ lọc của bạn vào chỗ này.

Thêm filter để lọc bài viết trong bảng quản lý admin WordPress

Đầu tiên, bạn sử dụng action restrict_manage_posts để thêm các thẻ HTML vào ngang hàng với các Filter có sẵn của WordPress.

function hocwp_content_captcha_restrict_manage_posts() {
    global $typenow;
    $post_types = hocwp_content_captcha_get_post_types();
    if(!in_array($typenow, $post_types)) {
        return;
    }
    ?>
    <select name="content_captcha" style="float: none;">
        <option value="-1">Filter Content captcha</option>
        <option value="1">Use content captcha</option>
        <option value="0">Not use content captcha</option>
    </select>
    <?php
}
add_action('restrict_manage_posts', 'hocwp_content_captcha_restrict_manage_posts');

Với hàm bên trên, bạn sẽ kiểm tra xem post type có hợp lệ hay không, nếu đúng post type bạn đang cần thêm Filter thì bạn tạo một thẻ select với các thông số bạn cần lọc.

function hocwp_content_captcha_parse_query($query) {
    global $pagenow, $typenow;
    if(is_admin() && 'edit.php' == $pagenow && isset($_REQUEST['filter_action'])) {
        $post_types = hocwp_content_captcha_get_post_types();
        if(!in_array($typenow, $post_types)) {
            return;
        }
        $content_captcha = isset($_REQUEST['content_captcha']) ? $_REQUEST['content_captcha'] : '';
        $meta_query = (array)$query->get('meta_query');
        if(isset($_REQUEST['content_captcha']) && 1 == $content_captcha) {
            $meta_item = array(
                'key' => 'content_captcha',
                'type' => 'numeric',
                'value' => 1,
                'compare' => '='
            );
            $meta_query[] = $meta_item;
            $query->set('meta_query', $meta_query);
        } elseif(isset($_REQUEST['content_captcha']) && 0 == $content_captcha) {
            $meta_item = array(
                'relation' => 'or',
                array(
                    'key' => 'content_captcha',
                    'type' => 'numeric',
                    'value' => 1,
                    'compare' => '!='
                ),
                array(
                    'key' => 'content_captcha',
                    'value' => '',
                    'compare' => '='
                ),
                array(
                    'key' => 'content_captcha',
                    'compare' => 'not exists'
                )
            );
            $meta_query[] = $meta_item;
            $query->set('meta_query', $meta_query);
        }
    }
}
add_action('parse_query', 'hocwp_content_captcha_parse_query');

Tiếp theo, bạn dùng action parse_query để chỉnh sửa biến $query của WordPress sao cho tương xứng với thứ bạn cần lọc. Trong hàm này bạn cũng sử dụng các hàm điều kiện để kiểm tra xem có đúng với trang edit.php trong admin hay không, và post type có phải là cái bạn đang cần lọc, và bạn kiểm tra xem bộ lọc có phải là của bạn hay không, nếu đúng thì mới tiến hành thêm thuộc tính vào biến $query.

Như vậy là bạn đã có thể tạo được một bộ lọc bài viết hoàn chỉnh trong WordPress, trong ví dụ này mình có sử dụng các hàm mình đã xây dựng sẵn trong gói hocwp do bên mình thực hiện, vì thế nên bạn cần thay đổi lại hàm cho hợp lý để không dính lỗi gọi hàm chưa được khai báo trong PHP, chúc bạn thành công.