• Здравствуйте,

    Помогите сделать двойную сортировку по двум параметрам — meta_value_num и title.

    На данный момент при использовании кода:

    $args = array(
    		'posts_per_page' => 500,
    		'orderby' => 'meta_value_num title',
    		'meta_key' => '_ss_views',
    		'order' => 'DESC',
    		'ignore_sticky_posts' => 1
    	);

    Данные сортируются сначала title по алфовиту в обратном порядке (от я до а — DESC), а затем по количеству _ss_views (с меньшего к большему — ASC).

    Нужно сделать наоборот, чтобы сортировалось сначала по _ss_views от большего к меньшему, а затем по title в алфовитном порядке от А до Я.

    Помогите пожалуйста.

Просмотр 3 ответов — с 1 по 3 (всего 3)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Вижу, задачу в багтрекере вы уже нашли 🙂

    Можно воспользоваться фильтром posts_orderby:

    $args = array(
    	'posts_per_page'      => 500,
    	'orderby'             => 'meta_value_num',
    	'meta_key'            => '_ss_views',
    	'order'               => 'DESC',
    	'ignore_sticky_posts' => 1,
    );
    
    function sort_by_post_title( $orderby ) {
    	global $wpdb;
    
    	return $orderby .= ", {$wpdb->posts}.post_title ASC";
    }
    
    add_filter( 'posts_orderby', 'sort_by_post_title' );
    
    $query = new WP_Query( $args );
    
    remove_filter( 'posts_orderby', 'sort_by_post_title' );

    А вот если это таксономи категория, и там нету $args, но есть:

    <?php
    while(have_posts()): the_post();
    if(has_post_thumbnail()):
    ?>

    Куда вставлять код: ??

    И по моему после ‘ignore_sticky_posts’ => 1, запятая не должна стоять.
    Заранее спасибо.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    А вот если это таксономи категория, и там нету $args

    Тогда менять нужно основной запрос.

    Можно добавить подобный фрагмент в functions.php активной темы:

    function sort_by_post_title( $orderby ) {
    	global $wpdb;
    
    	remove_filter( 'posts_orderby', __FUNCTION__ );
    
    	return $orderby .= ", {$wpdb->posts}.post_title ASC";
    }
    
    function filter_taxonomy_query( $query ) {
    	if ( is_admin() || ! $query->is_main_query() || ! $query->is_tax() ) {
    		return;
    	}
    
    	add_filter( 'posts_orderby', 'sort_by_post_title' );
    
    	$args = array(
    		'posts_per_page'      => 500,
    		'orderby'             => 'meta_value_num',
    		'meta_key'            => '_ss_views',
    		'order'               => 'DESC',
    		'ignore_sticky_posts' => 1,
    	);
    
    	foreach ( $args as $query_var => $value ) {
    		$query->set( $query_var, $value );
    	}
    }
    add_action( 'pre_get_posts', 'filter_taxonomy_query' );

    И по моему после ‘ignore_sticky_posts’ => 1, запятая не должна стоять.

    Запятая после последнего элемента массива в PHP не является ошибкой. Наоборот, она помогает избежать ошибки, когда впоследствии добавляется новый элемент, а запятую добавить забывают.

Просмотр 3 ответов — с 1 по 3 (всего 3)

Тема «Двойная сортировка (meta_value_num и title)» закрыта для новых ответов.