虽然您描述的查询在SQL中并非不可能,但它不会非常有效,因为查询必须计算表中与这些键匹配的每一行,然后根据计算结果进行排序。
正如@Shazzad所建议的那样,您最好保存第四个值并对其进行排序。比如:
function gen_sort_meta_wpse_133851($pid) {
var_dump($pid);
$release[] = get_post_meta($pid,\'release_f\',true);
$release[] = get_post_meta($pid,\'release_uk\',true);
$release[] = get_post_meta($pid,\'release_us\',true);
$sort = max($release);
$release_sort = get_post_meta($pid,\'_release_sort\',true);
update_post_meta($pid,\'_release_sort\',$sort,$release_sort);
}
add_action(\'save_post\',\'gen_sort_meta_wpse_133851\');
然后,您应该能够使用以下内容进行排序:
function orderby_additionaldate($query) {
if (! is_admin()
&& $query->is_main_query()
&& is_category( array( 2,57,530 ) )
|| cat_is_ancestor_of(2, get_query_var(\'cat\') )
&& $query->is_main_query()
&& ! is_admin()
|| cat_is_ancestor_of(57, get_query_var(\'cat\') )
&& $query->is_main_query()
&& ! is_admin()
|| cat_is_ancestor_of(530, get_query_var(\'cat\') )
&& $query->is_main_query()
&& ! is_admin()
) {
if ( $query->query_vars ) {
$query->set( \'order\', \'DESC\' );
$query->set( \'meta_key\', \'_release_sort\' );
$query->set( \'orderby\', \'meta_value\' );
}
}
}
add_action( \'pre_get_posts\', \'orderby_additionaldate\' );
我不知道这种逻辑是否正确。一长串未细化的布尔条件是获得意外行为的好方法。