我正在自定义帖子类型“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\'];
}
}
}
最合适的回答,由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 ...
}
}