我使用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认证的帖子,但显示在已认证的帖子之后?
非常感谢您的帮助。:)
最合适的回答,由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中修复!