Как запросить_позиции с помощью meta_query, чтобы упорядочить meta_key И иметь вторичную сортировку по дате?


8

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

Так что я работаю с сайтом WordPress, где у постов есть несколько пользовательских полей, относящихся к запросу, который мне нужно выполнить: «post-expired» и «my-sort-order». Когда я запускаю свои query_posts, я хочу, чтобы результаты были сообщениями, где «истек срок действия» НЕ «да» (эта часть работает в моем коде). Я также хочу, чтобы результаты сортировались по числовому значению DESC "my-sort-order" (работает также) И если есть связь с "my-sort-order", я бы хотел вторичную сортировку по дате с последними публикациями первый.

Вторичная сортировка по дате - вот где у меня проблемы.

Вот код, который я сейчас имею:

<?php               
$args = array(
    'paged' => $paged,
    'meta_query'=> array(
        array(
            'key'=>'post-expired',
            'value'=> 'yes',
            'compare' => '!='
        )
    ),
    'meta_key'=>'my-sort-order',
    'orderby'=>'meta_value_num', 
    'order'=>'DESC'
);

$args = array_merge( $args , $wp_query->query );

query_posts( $args );
?>

Используя приведенный выше код, я корректно получаю сообщения с истекшим сроком действия, и они сортируются по убыванию my-sort-order (т. Е. 100 отображается до 99 и т. Д.). Но если обе записи имеют одинаковое значение порядка сортировки, происходит некоторый тип вторичной сортировки, которую я не могу контролировать (и не могу понять, на что она в действительности сортируется).

Моей первой идеей для решения этой проблемы было добавление значений в «my-sort-order», только если я хотел установить определенный порядок сортировки для этого поста. Я подумал, что если значение для этого поля оставить пустым для остальных сообщений, они будут просто возвращены в сортировке по умолчанию к дате DESC (после сообщений с установленным порядком сортировки). Однако в действительности все сообщения, для которых не было задано значение порядка сортировки, НЕ были возвращены вообще ...

Затем я попытался добавить несколько значений в поле orderby следующим образом:

('orderby'=>'meta_value_num date')

Это полностью взорвало оба порядка сортировки, на которые я рассчитывал, и неожиданно вернуло посты. У меня сложилось впечатление, что допускается несколько значений orderby, но по какой-то причине это здесь не работает.

На данный момент я не уверен, как заставить любое из этих потенциальных решений работать. Кто-нибудь знает, как я могу 1) Сортировать сообщения сначала по полю «my-sort-order», а затем вернуть оставшиеся сообщения без значения в этом поле с сортировкой по умолчанию; или 2) Узнайте, как управлять вторым порядком сортировки, чтобы любые сообщения, имеющие привязку к «my-sort-order», были отсортированы по дате (сначала самые новые)?

Ответы:


2

Надеюсь, вы уже поняли это, но если нет, вы сможете использовать фильтр "posts_orderby" для набора в определенном порядке для вашего запроса. Я не собираюсь давать полное решение здесь, но вы можете обратиться к этому сообщению для получения дополнительной информации: http://mitcho.com/blog/how-to/external-orders-in-wordpress-queries/

РЕДАКТИРОВАТЬ:

Вот документация - в основном вы можете просто переопределить предложение ORDER BY в SQL: http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_orderby

А вот пример кода из документации:

add_filter('posts_orderby', 'edit_posts_orderby');
add_filter('posts_join_paged','edit_posts_join_paged');

function edit_posts_join_paged($join_paged_statement) {
$join_paged_statement = "LEFT JOIN wp_gdsr_data_article gdsra ON gdsra.post_id = wp_posts.ID";
return $join_paged_statement;   
}

function edit_posts_orderby($orderby_statement) {
$orderby_statement = "(gdsra.user_votes_total_sum/gdsra.user_votes_count) DESC";
return $orderby_statement;
}

Да, фильтр posts_orderby - это то, что вы ищете. Я отредактирую ответ с помощью кода по этой ссылке ...
mltsy
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.