Заказ по DESC, ASC на заказ WP_Query

8

Мне нужно сделать многоуровневое упорядочение в запросе. Проблема заключается в упорядочении одного значения DESC, а другого ASC, как в SQL. Следующий SQL, кажется, дает мне то, что я хочу, когда я запускаю его в терминале:

SELECT DISTINCT * FROM wp_posts 
INNER JOIN wp_postmeta 
ON wp_posts.ID = wp_postmeta.post_id 
WHERE wp_posts.post_type = 'post' 
AND wp_postmeta.meta_key = 'pb_issue_featured'
AND wp_posts.post_status = 'publish' 
ORDER BY wp_postmeta.meta_value DESC, wp_posts.menu_order ASC;

Это pb_issue_featuredлогическое значение. Конечный результат, который мне нужен, - это запрос для отображения постов, которые имеют мета-значение 1 для этого поля вверху, а затем все остальные ниже. Затем назначается порядок второго уровня menu_order(я использую плагин порядка типов постов).

Проблема в том, что мое логическое значение должно быть упорядочено по убыванию (от 1 до 0), но menu_order противоположен. То, что заказывается первым с помощью плагина, имеет порядок меню 1. Таким образом, использование встроенного порядка в WP_Query не работает. У кого-нибудь есть предложения? Я посмотрел на фильтр posts_orderby, но не смог его взять. Я не был уверен, где это должно быть применено или как я могу устранить неполадки. Это просто не изменило порядок, как у меня было.

Спасибо за помощь! Я опубликую фактический WP_Query, если он уместен, но я хотел, чтобы это было как можно короче.

Аргументы запроса:

$args = array(
        'post_type' => 'post',
        'meta_key' => 'pb_issue_featured',
        'orderby'   => 'meta_value',
        'order' => 'DESC',
        'post_status' => 'publish',
        'posts_per_page' => $posts,
        'paged' => $paged,
        'meta_query' => array(
            array(
                'key' => 'headline',
                'value' => 1,
                'compare' => '!=' 
                )
            )
        );
$q = new WP_Query($args);
Иан
источник
Хорошо, вы должны опубликовать WP_Query, чтобы увидеть, правильно ли он сформирован.
Марин Bînzari
Вот оно, во всей красе. В настоящее время я ничего не упорядочиваю, кроме этого логического мета-значения b / c, это был единственный способ заставить этот уровень или сортировку работать. Сайт также использует заголовки постов, которые имеют приоритет над «избранными» постами. Таким образом , я исключаю их в этом запросе
Иэн

Ответы:

20

Попробуй это:

$args = array(
        'post_type' => 'post',
        'meta_key' => 'pb_issue_featured',
        'orderby'   => 'meta_value',
        'order' => 'DESC',
        'posts_per_page' => $posts,
        'paged' => $paged,
        'paged' => 1,
        'meta_query' => array(
            array(
                'key' => 'headline',
                'value' => 1,
                'compare' => '!=' 
                )
            )
        );

add_filter( 'posts_orderby', 'filter_query' );
$q = new WP_Query($args);
remove_filter( 'posts_orderby', 'filter_query' );

function filter_query( $query ) {
    $query .= ', wp_posts.menu_order ASC';
    return $query;
}
Марин Бинзари
источник
Как босс Спартакус. Спасибо за краткий и точный ответ. Это работает как шарм
Иэн
1
Вы также можете использовать массив в порядке
следования