Поддержка Проблемы и решения не работает сортировка в pre_get_posts

  • Решено redmonkey73

    (@redmonkey73)


    add_filter( 'pre_get_posts' , 'my_change_order' );
    function my_change_order( $query ) {
    	if($query->is_main_query() && !is_admin()) {
    if (is_archive()) {
    			$queried_object = get_queried_object();
    			$term_id = get_queried_object()->term_id;
    			if (isset($term_id)) {
    			    $check_option=get_option('cp-sort-term-id-'.$term_id);
    				if ($check_option=='true') {
    					$query->set( 'orderby' , 'meta_value_num' );
    					$query->set( 'meta_key', 'cp-term-id-'.$term_id);
    					$query->set( 'order', 'ASC');
    					$query->set( 'posts_per_page', -1);
    
    				}
    			}
    		}
    	}
    	return $query;
    }

    никак не хочет сортировать записи по произвольному полю

Просмотр 5 ответов — с 1 по 5 (всего 5)
  • У меня упрощенный вариант работает

    add_filter( 'pre_get_posts' , 'my_change_order' );
    function my_change_order( $query ) {
        if($query->is_main_query() && !is_admin()) {
    	$query->set( 'orderby' , 'meta_value_num' );
    	$query->set( 'meta_key', 'sort');
    	$query->set( 'order', 'ASC');
        }
    }

    Видимо, «неконтакт» где-то в условиях, получается false на каком-то этапе 🙂

    Автор redmonkey73

    (@redmonkey73)

    вывел wp_query получил вот что
    [request] => SELECT wp_posts.* FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (1) ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') AND (wp_postmeta.meta_key = 'cp-term-id-1' ) GROUP BY wp_posts.ID ORDER BY wp_posts.menu_order ASC

    Воспроизвести сложно вашу ситуацию, нет полных исходников, но такой код работает для архивов категорий:

    add_filter( 'pre_get_posts' , 'my_change_order' );
    function my_change_order( $query ) {
        if ( $query->is_main_query() && !is_admin() ) {
    	$cat = (get_query_var('cat')) ? get_query_var('cat') : 0;
    	if ( $cat ) {
    		$query->set( 'orderby' , 'meta_value_num' );
    		$query->set( 'meta_key', 'sort');
    		$query->set( 'order', 'ASC');
    		$query->set( 'posts_per_page', -1 ); //??
            }
        }
    }

    1. Основное отличие в том, что у вас есть еще выбор опции из некой настройки и её проверка
    if ($check_option=='true') { //Почему сравнение со строкой?
    и то, что вы работаете с term_id.
    2. И действительно ли существуют ключи, типа cp-term-id-??

    Автор redmonkey73

    (@redmonkey73)

    1. потому что в опции строка ‘true’
    2. да конечно существуют первым делом проверил)

    Автор redmonkey73

    (@redmonkey73)

    дело в том что именно order не срабатывает, т.к. если например меняю ‘posts_per_page’ на 1 то выводится 1 запись

Просмотр 5 ответов — с 1 по 5 (всего 5)
  • Тема «не работает сортировка в pre_get_posts» закрыта для новых ответов.