自定义帖子列表页面的筛选器

时间:2019-10-14 作者:Gary Hu

我正在自定义帖子类型“book”列表页面上添加一个过滤器,以便于搜索。我已经找到了相关的代码,除了过滤器不仅出现在“book”列表页上,而且还出现在其他列表页上,例如post列表页上,其他一切都很好。我已经检查了代码,但仍然不清楚。

<?php
add_action( \'restrict_manage_posts\', \'book_genre_filter_page\' );

function book_genre_filter_page(){
$type = \'book\';

if (\'book\' == $type){

    $values = array(
        \'Science Fiction\' => \'sf\', 
        \'Autobiography\' => \'ab\',
        \'Thriller\' => \'t\',
    );
    ?>
    <select name="genre">
    <option value=""><?php _e(\'All genres\', \'book_genre\'); ?></option>
    <?php
        $current_v = isset($_GET[\'genre\'])? $_GET[\'genre\']:\'\';
        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\', \'book_genre_filter\' );

function book_genre_filter( $query ){
global $pagenow;
$type = $query->query[\'post_type\'];
    $target = \'book\';

    if ( $type == $target ) {
        if ( $pagenow ==\'edit.php\' && isset($_GET[\'genre\']) && $_GET[\'genre\'] != \'\') {
                $query->query_vars[\'meta_key\'] = \'genre\';
                $query->query_vars[\'meta_value\'] = $_GET[\'genre\']; 
        }
    }
}

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

这个restrict_manage_posts hook将当前post类型作为回调函数的第一个参数提供给回调函数(即book_genre_filter_page() 所以应该使用它(而不是静态$type (代码中的变量),以确定当前帖子类型,或确保您的自定义筛选器仅显示在管理屏幕上,以编辑帖子类型中的帖子:

add_action( \'restrict_manage_posts\', \'book_genre_filter_page\' );
function book_genre_filter_page( $post_type ) {
    if ( \'book\' == $post_type ) {
        ... your code here ...
    }
}

相关推荐