我正在尝试将一些自定义视图/过滤器添加到管理员中自定义帖子类型的帖子列表中。然而,统计帖子数量的查询正在一次更新所有过滤器的帖子数量,前提是我使用的是其中一个自定义过滤器。
以下是我如何设置查询以获取帖子数量的方法:
add_action( \'views_edit-movies\', array($this, \'custom_views\') );
public function custom_views($views) {
//$directors is a valid array returned from seperate function, removed for clarity
foreach ($directors as $key => $value) {
$director = $value;
$query = array(
\'post_type\' => \'movies\',
\'meta_key\' => \'director\',
\'meta_value\' => $director
);
$result = new WP_Query($query);
$class = ($wp_query->query_vars[\'meta_value\'] == $director) ? \' class="current"\' : \'\';
$views["$director"] = sprintf(__(\'<a href="%s"\'. $class .\'>\' . $director . \' <span class="count">(%d)</span></a>\'),
admin_url(\'edit.php?&post_type=movies&director=\'.$director),
$result->found_posts);
}//end foreach
}
如果我在“All”、“Published”或“Trash”默认视图上,并且每个director过滤器在这些视图上都有正确数量的帖子,那么这很好用。当我点击某个董事时,所有其他董事的职位数量都与我目前的职位数量相同。
这是因为我正在基于变量在foreach循环中分配视图吗?或者因为我正在更改查询以显示包含以下代码的视图?
以下是实际显示视图的代码:
add_action( \'pre_get_posts\', array($this, \'filters\') );
public function filters($query)
{
if ( isset($_GET[\'director\']) ) {
$query->set( \'meta_key\', \'director\' );
$query->set( \'meta_value\', $_GET[\'director\'] );
}
return $query;
}
最合适的回答,由SO网友:member8888 整理而成
问题是$query->set
在filter函数中,正在更新用于统计帖子数量的主查询。可能是因为他们被呼叫的顺序。我试着冲洗并运行一个新的wp_query
但最终效果最好的是下面使用自定义查询的函数。
public function count($director)
{
$num = $this->wpdb->get_results("SELECT * FROM " . $this->wpdb->prefix . "postmeta WHERE meta_key = \'directory\' AND meta_value = \'".$director."\'");
return count($num);
}