带有自定义字段的GROUP BY的WP_QUERY

时间:2019-05-13 作者:Marcos

我需要在帖子中使用group by和一个自定义字段“eventMonth”,该字段的值为“April-2019”-“June-2019”。。

(我从未将wp\\u查询与meta\\u查询数据一起使用过,所以…)。我在类别字段函数中有下一个查询和代码

query_group_by_filter($groupby){
    global $wpdb;
    return $wpdb->postmeta . ".meta_value=\'eventMonth\'";
 }:

$query = array(
    "category_name"=>"events",
    "posts_per_page"=>-1,
    "order"=>"ASC",
    "meta_query"=>array(
        \'relation\'=>"OR",
        array(
            \'key\'=>"eventMonth",
            \'compare\'=> "="
        )
    ),
    \'meta_key\'=>"eventMonth"
);

add_filter( \'posts_groupby\', \'query_group_by_filter\' );
如果我进行循环,当我有四篇带有这个自定义字段的帖子时,我只能看到一个结果。

我怎样才能做到这一点?

谢谢你的帮助!

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

(修改后的答案)

因此,在通过评论进行讨论之后,您真正需要的是一个定制ORDER BY 子句,它在WordPress post查询中(WP_Query), 您可以通过posts_orderby filter 就像您可以设置自定义GROUP BY 第条通过posts_groupby filter.

我需要的订单是2019年6月| 2019年5月| 2019年4月| 2019年4月

如果元的值eventMonth 始终采用以下格式:{month name} - {4-digit year} 例如June - 2019 —请注意不应为“–”的破折号/宣传或任何其他特殊字符ORDER BY 子句可以按照上面指定的顺序对帖子进行排序:(假定WordPress表前缀为wp_ 本例按降序排序)

ORDER BY STR_TO_DATE( REPLACE( wp_postmeta.meta_value, \'-\', \'1,\' ), \'%M %e, %Y\' ) DESC
PHP代码:

修改ORDER BY 条款:

add_filter( \'posts_orderby\', \'query_order_by_filter\', 10, 2 );
function query_order_by_filter( $orderby, $query ) {
    // Modify only if and when applicable.
    if ( \'eventMonth_date\' === $query->get( \'orderby\' ) ) {
        global $wpdb;
        $order = $query->get( \'order\' );
        return "STR_TO_DATE( REPLACE( $wpdb->postmeta.meta_value, \'-\', \'1,\' ), \'%M %e, %Y\' ) $order";
    }

    return $orderby;
}
WP_Query 查询,设置orderby 参数到eventMonth_date:

$args = array(
    \'meta_key\' => \'eventMonth\',
    \'orderby\'  => \'eventMonth_date\',
    \'order\'    => \'DESC\',
    // ... other args.
);
$query = new WP_Query( $args );
PS:如果您使用get_posts() 而不是new WP_Query(), 确保设置suppress_filtersfalse.

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post