WordPress order posts by 2 custom fields at once

家住魔仙堡 提交于 2020-05-17 08:49:17

问题


I want to order the posts by 2 custom fields in the same call. How is this possible?

This next code order successfully, but only by only 1 NUMBER custom field (not STRING):

add_action('pre_get_posts', function ($q) {
    if (
        !is_admin() // Target only front end queries
        && $q->is_main_query() // Target the main query only
        && ($q->is_search() || $q->is_post_type_archive('data-base'))
    ) {
        $q->set('meta_key', 'custom_field_1');
        $q->set('order',    'DESC');
        $q->set('orderby',  'meta_value');
    }
});

Update 1:

Currently @Mohammed Yassine CHABLI's first answer works, but it doesn't sort by number, but by String. That means that "81" will come before "9", which is not good. Any solution for that?


Resources that might help:

a more powerful order by in WordPress 4.0

Add meta_type in custom sorting using woocommerce


回答1:


Try this one :

configure the meta query :

$meta_query = array(
    'relation' => 'AND',
    'clause1' => array(
        'key'     => 'first key of your meta',
        'compare' => 'EXISTS',
    ),
    'clause2' => array(
        'key'     => 'second key of your meta',
        'compare' => 'EXISTS',
    ));

$q->set('meta_query', $meta_query);


$q->set('orderby',array( 
   'clause1'  => 'DESC', 
   'clause2'  => 'ASC' 
      )  
);

In case you want to sort in the same direction :

$q->set('orderby' =>'clause1 clause2',
        'order'   =>'ASC'
);



回答2:


You need the WP way of providing an expression in the ORDER BY;

ORDER BY 0 + meta_key

That is, do something to meta_key to convert it into a numeric value.



来源:https://stackoverflow.com/questions/61708882/wordpress-order-posts-by-2-custom-fields-at-once

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!