Wordpress wp_query group by custom field

时间:2013-11-13 09:18:34

标签: wordpress group-by custom-post-type custom-fields

我必须创建一个搜索表单,我必须按自定义帖子类型的状态填充选择。他们中的一些人具有相同的状态,然后我想分组以获得一个干净的状态选择列表..我已经这样做了:

<?php
    function  query_group_by_filter($groupby){
        global $wpdb;
        return $wpdb->postmeta.".meta_key = 'state'";
    }
?>
<?php add_filter('posts_groupby', 'query_group_by_filter'); ?>
<?php $states = new WP_Query(array('post_type' => 'observatoire')); ?>
<?php remove_filter('posts_groupby', 'query_group_by_filter'); ?>
<select id="" class="" name="siege_pays" >
     <option value=""></option>
<?php
while ( $states->have_posts() ) : $states->the_post();
echo "<option value=".get_field_object('state').">".get_field_object('state')."</option>"; 
endwhile;
?>
</select>

结果查询不起作用..请帮助:)

'SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  WHERE 1=1  AND wp_posts.post_type = 'observatoire' AND ((wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') OR wp_posts.post_status = 'private') GROUP BY wp_postmeta.meta_key = 'siege_pays' ORDER BY wp_posts.post_date DESC LIMIT 0, 10'

2 个答案:

答案 0 :(得分:3)

我必须对Chirag Patels Code做一些改进才能让它发挥作用:

<?php
    function  query_group_by_filter($groupby){
       global $wpdb;

       return $wpdb->postmeta . '.meta_value ';
    }
?>
<?php add_filter('posts_groupby', 'query_group_by_filter'); ?>
<?php $states = new WP_Query(array(
    'post_type' => 'observatoire',
    'post_status' => 'publish',
    'posts_per_page' => -1,
    'meta_key' => 'state'
)); 
?>
<?php remove_filter('posts_groupby', 'query_group_by_filter'); ?>
<select id="" class="" name="siege_pays" >
     <option value=""></option>
<?php
while ( $states->have_posts() ) : $states->the_post();
echo "<option value=".reset(get_post_custom_values('state')).">".reset(get_post_custom_values('state'))."</option>"; 
endwhile;
?>
</select>

答案 1 :(得分:0)

您可以尝试以下代码:

<?php
    function  query_group_by_filter($groupby){
       global $wpdb;

       return $wpdb->postmeta . '.meta_key = "state"';
    }
?>
<?php add_filter('posts_groupby', 'query_group_by_filter'); ?>
<?php $states = new WP_Query(array(
    'post_type' => 'observatoire',
    'post_status' => 'publish',
    'posts_per_page' => -1,
    'meta_key' => 'state'
)); 
?>
<?php remove_filter('posts_groupby', 'query_group_by_filter'); ?>
<select id="" class="" name="siege_pays" >
     <option value=""></option>
<?php
while ( $states->have_posts() ) : $states->the_post();
echo "<option value=".get_field_object('state').">".get_field_object('state')."</option>"; 
endwhile;
?>
</select>

查询看起来像:

SELECT wp_posts.*
FROM wp_posts INNER JOIN wp_postmeta 
  ON (wp_posts.ID = wp_postmeta.post_id)
WHERE wp_posts.post_type = 'observatoire'
  AND (wp_posts.post_status = 'publish')
  AND (wp_postmeta.meta_key = 'state' )
GROUP BY wp_postmeta.meta_key = "state"
ORDER BY wp_posts.post_date DESC