带有RAND和META_VALUE的自定义POST类型档案

时间:2015-01-24 作者:Attila

我有一个自定义的帖子类型,它有一个meta\\u键custom_meta_sponsored 具有按字母顺序排列的值。“X”表示帖子没有赞助。我想以自定义顺序显示存档页,首先以随机顺序显示。

我使用pre_get_posts 钩子,但它没有像我预期的那样工作:

function custom_loops($query) {
    if ( is_post_type_archive(\'my_post_type\') ){
        $query->set( \'posts_per_page\', 40);
        $query->set( \'meta_key\', \'custom_meta_sponsored\');
        $query->set( \'orderby\', \'meta_value rand\');
        //$query->set( \'order\', \'DESC\');
    }
    remove_action( \'pre_get_posts\', \'custom_loops\' );
}
add_action(\'pre_get_posts\', \'custom_loops\');
在结果中,赞助帖子首先显示,几乎是随机的。我指的是在randon以某种日期顺序赞助的帖子。新创建的帖子总是首先显示。我想显示赞助帖子完全随机,无论创建日期。有什么想法吗?

2 个回复
SO网友:bonger

您可以使用\'posts_orderby\' 过滤器:

function custom_loops($query) {
    if ( is_post_type_archive(\'my_post_type\') ){
        $query->set( \'posts_per_page\', 40);
        $query->set( \'meta_key\', \'custom_meta_sponsored\');
        $query->set( \'orderby\', \'custom_meta_sponsored\');
        $query->set( \'order\', \'DESC\');
        add_filter( \'posts_orderby\', function ( $orderby, $query ) {
            if ( $query->get( \'orderby\' ) != \'custom_meta_sponsored\' ) return $orderby;
            global $wpdb;
            $orderby = $wpdb->prepare(
                \'CASE WHEN \' . $wpdb->postmeta . \'.meta_value != %s THEN CONCAT(%s, RAND()) ELSE \'
                . $wpdb->posts . \'.post_date END \' . $query->get( \'order\' )
                , \'X\', \'z\'
            );
            return $orderby;
        }, 10, 2 );
    }
    remove_action( \'pre_get_posts\', \'custom_loops\' );
}
add_action(\'pre_get_posts\', \'custom_loops\');

SO网友:Attila

最后,我创建了两个循环。使用foreach 我浏览了主要的查询结果$wp_query->posts 以及重新安排职位。

非常感谢。

结束