首先对具有元值的帖子进行排序,然后对其余帖子进行排序

时间:2015-04-25 作者:Shoebox

我使用pre\\u get\\u posts钩子自定义我对自定义post类型存档的查询。

此自定义帖子类型的某些帖子具有元键mp\\U micropub\\U认证,元值为1,其他帖子没有此元键集。

我使用以下代码,

function micropubs_filter_posts( $query ) {
    if ( !is_admin() && $query->is_post_type_archive( \'micropubs\' ) && $query->is_main_query() ) {
        $query->set( \'posts_per_page\', 5 );
        $accredited = filter_input( INPUT_GET, \'orderby\', FILTER_SANITIZE_STRING ); 
        if ( empty( $accredited ) )
            return;
        if ( $accredited === \'accredited\' ) {
            $query->set( \'meta_key\', \'mp_micropub_accredited\' );
            $query->set( \'orderby\', \'meta_value_num\' );
        }
    }
}
add_action( \'pre_get_posts\', \'micropubs_filter_posts\' );
因此,当我在浏览器中定位到此地址时,它只显示设置了元键的帖子,而不显示其他帖子。

http://localhost/site/post-type-archive/?orderby=accredited
如何可能包括所有其他没有mp\\U micropub\\U认证的帖子,但显示在已认证的帖子之后?

非常感谢您的帮助。:)

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

我建议您在使用1更新元数据时使用0更新rest。我的意思是在所有帖子中都用1或0设置关键字,以避免复杂的查询。

你仍然可以用一个简单的脚本来完成。它将检查密钥是否不存在,然后用0更新它。因此,您当前的代码将很有魅力。

OR

您可以使用compare 具有NOT EXISTS

$meta_query = array(
    \'relation\' => \'OR\',
    array(
        \'key\' => \'mp_micropub_accredited\',
        \'value\' => 1
    ),
    array(
        \'key\' => \'mp_micropub_accredited\',
        \'compare\' => \'NOT EXISTS\'
    )
);
$query->set( \'meta_query\', $meta_query );
$query->set( \'orderby\', \'meta_value_num\' );
Note: 此解决方案仅适用于WP>=3.9的情况NOT EXISTS 仅适用于3.5及更高版本,并且NOT EXISTS 已在3.9中修复!

结束

相关推荐