我正在使用wordpress进行房地产项目,为此,我将一个主题与一个插件(realia real estate)一起用于房地产。所以我相信这不是离题。。。我的问题很简单,我有几个自定义meta\\u键,如property\\u baths(bathrooms)、property\\u beds(rooms)等。。。我想做的是在wordpress管理中的“帖子”选项卡中创建一个过滤器,一个高级搜索。我还需要此搜索是累积的,例如,如果“浴室”和“房间”都已填充,则应根据已填充的内容过滤帖子。
经过多次搜索,我找到了一种方法,通过创建一个插件来实现这一点,但我这里的代码,它只传递1个meta\\u键和你的meta\\u值,我需要它传递几个meta\\u键和它们的值。。。
到目前为止,我得到的是:
add_action( \'restrict_manage_posts\', \'wpse45436_admin_posts_filter_restrict_manage_posts\' );
function wpse45436_admin_posts_filter_restrict_manage_posts(){
$type = \'property\';
if (isset($_GET[\'post_type\'])) {
$type = $_GET[\'post_type\'];
}
//only add filter to post type you want
if (\'property\' == $type){
//change this to the list of values you want to show
//in \'label\' => \'value\' format
$values = array(
\'Banheiros\' => \'property_baths\',
\'Quartos\' => \'property_beds\'
);
$current_v = isset($_GET[\'ADMIN_FILTER_FIELD_VALUE\'])? $_GET[\'ADMIN_FILTER_FIELD_VALUE\']:\'\';
foreach ($values as $label => $value) {
printf
(
\'<input type="text" name="%s"%s placeholder="%s"></option>\',
$value,
$value == $current_v? \' value="\'.$current_v.\'"\':\'\',
$label
);
}
}
}
add_filter(\'parse_query\', \'wpse45436_posts_filter\');
function wpse45436_posts_filter( $query ){
global $pagenow;
$type = \'property\';
if (isset($_GET[\'post_type\'])) {
$type = $_GET[\'post_type\'];
}
if ( \'property\' == $type && is_admin() && $pagenow==\'edit.php\' && isset($_GET[\'property_baths\']) && $_GET[\'property_baths\'] != \'\') {
$query->query_vars[\'meta_key\'] = \'property_baths\';
$query->query_vars[\'meta_value\'] = $_GET[\'property_baths\'];
}
}
有了这个代码(插件),我只能过滤1个meta\\u键,我需要这样做,我可以使用几个“meta\\u键”及其值。
我试过循环,试过数组,但都没用。我希望有人能帮助我。。。提前感谢。。。
SO网友:Paul Zee
您可以添加多个筛选器调用,因此每个meta_key
\'可以在单独的代码中处理,执行时将累计调整查询。
也许看看pre_get_posts
筛选而不是parse_query
(尽管我建议的解决方案可能在任何一种情况下都有效)。pre_get_posts
允许您在WordPress执行当前查询之前访问该查询,并且您将限制查询从数据库中获取的帖子。
我还没有测试过这段代码:这只是针对您的代码进行的编辑,以向您展示如何实现这一点(因此请检查语法中的错误)。
你最终会得到这样的结果:
add_filter(\'pre_get_posts\', \'wpse45436_property_baths_posts_filter\');
function wpse45436_property_baths_posts_filter( $query ){
global $pagenow;
$type = \'property\';
if (isset($_GET[\'post_type\'])) {
$type = $_GET[\'post_type\'];
}
if ( \'property\' == $type && is_admin() && $pagenow==\'edit.php\' && isset($_GET[\'property_baths\']) && $_GET[\'property_baths\'] != \'\') {
$query->query_vars[\'meta_key\'] = \'property_baths\';
$query->query_vars[\'meta_value\'] = $_GET[\'property_baths\'];
}
}
add_filter(\'pre_get_posts\', \'wpse45436_property_beds_posts_filter\');
function wpse45436_property_beds_posts_filter( $query ){
global $pagenow;
$type = \'property\';
if (isset($_GET[\'post_type\'])) {
$type = $_GET[\'post_type\'];
}
if ( \'property\' == $type && is_admin() && $pagenow==\'edit.php\' && isset($_GET[\'property_beds\']) && $_GET[\'property_beds\'] != \'\') {
$query->query_vars[\'meta_key\'] = \'property_beds\';
$query->query_vars[\'meta_value\'] = $_GET[\'property_beds\'];
}
}
检查
Codex 有关
pre_get_posts
滤器