我用高级自定义字段添加的元值自定义帖子类型。我想按此meta和post\\u日期使用get方法对帖子进行排序。
我编写了一些代码,但它的工作方式很奇怪——它并没有增加按meta对帖子进行排序的机会,只是生成了任何按meta排序的“orderby”。所以,当我在浏览器中编写类似www.mysite的内容时。com/存档/?orderby=post\\u date它仍然只按meta排序。
function my_pre_get_posts( $query ) {
// do not modify queries in the admin
if( is_admin() ) {
return $query;
}
// only modify queries for \'text\' post type
if( isset($query->query_vars[\'post_type\']) && $query->query_vars[\'post_type\'] == \'text\' ) {
// allow the url to alter the query
if( isset($_GET[\'orderby\']) ) {
$query->set(\'orderby\', \'meta_value_num\');
$query->set(\'meta_key\', \'text_date\');
$query->set(\'order\', \'DESC\');
}
}
// return
return $query;
}
add_action(\'pre_get_posts\', \'my_pre_get_posts\');
最合适的回答,由SO网友:Emil 整理而成
您实际上没有使用$_GET[\'orderby\']
-任何地方都有价值。您在代码中所做的是按text_date
-元值,始终。如果您想在默认情况下按日期订购,以及何时订购$_GET[\'orderby\']
设置为默认orderby值,或者如果$_GET[\'orderby_meta\']
如果设置了,则按顺序执行,您需要执行以下操作:
if (isset($_GET[\'orderby\']){
$query->set(\'orderby\', sanitize_key($_GET[\'orderby\']);
$query->set(\'order\', \'DESC\');
} else if (isset($_GET[\'orderby_meta\']){
$query->set(\'orderby\', \'meta_value_num\');
$query->set(\'meta_key\', \'text_date\');
$query->set(\'order\', \'DESC\');
}