Я модифицировал встроенный поиск WP с помощью pre_get_posts
фильтра, позволяющего пользователю сортировать сообщения (включая несколько пользовательских типов сообщений) по разным полям.
Проблема, с которой я столкнулся, заключается в том, что когда я говорю WP сортировать по мета-значению, он исключает все посты, для которых это мета-значение не установлено. Это приводит к изменению количества результатов, если вы измените сортировку, скажем, «Цена» на «Дата», потому что для «Сообщений» не установлена «Цена», а для «Предметов».
Это не то, что я хочу, поэтому я хотел бы знать, есть ли способ включить ВСЕ посты - даже те, в которых отсутствует мета-значение, по которому я сортирую, - и поместить одно без значения last.
Я знаю, как сортировать по нескольким полям, но это не помогает.
Благодарность
Кажется, я не единственный, кто задается этим вопросом: как включить в аргументы для wp_query сообщения с мета-ключом и без него? но там нет решения.
Обновить
Я попробовал ответ, но не уверен, правильно ли я понял, вот что у меня сейчас:
<?php
function my_stuff ($qry) {
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
$qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
$qry->set('order', 'ASC DESC');
$qry->set('meta_key', 'item_price');
}
Мета-значение - это число (оно используется для хранения цены, как следует из названия)
Обновление 2
Я закомментировал материал заказа, и все, что у меня сейчас есть, это:
<?php
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
С этим кодом запрос, кажется, возвращает все сообщения, у которых нет item_price
ключа, и ни одного из сообщений, у которых его есть. То есть проблема сейчас решена.
Если я добавлю код заказа, я получу 0 результатов.
Редактировать: ... три года спустя ... : У ПИ снова возникла эта проблема. Я перепробовал все ответы, и ни один не работал. Не уверен, почему некоторые люди думают, что они работают, но они, по крайней мере, не работают для меня.
Решение, которое я выбрал, заключается в использовании save_post
фильтра - убедитесь, что все сообщения имеют настраиваемое поле, по которому я хочу отсортировать. Это немного раздражает, я должен это делать, но если вы сделаете это рано, у вас, вероятно, не будет проблем.
В этом случае я строил «счетчик просмотров» для постов и хотел, чтобы пользователи могли сортировать наиболее читаемые посты. Опять же, посты, которые никогда не просматривались (я думаю, это довольно маловероятно - но все же) исчезали при сортировке по количеству просмотров. Я добавил этот фрагмент кода, чтобы убедиться, что все сообщения имеют количество просмотров:
add_action('save_post', function ($postId) {
add_post_meta($postId, '_sleek_view_count', 0, true);
});
meta_query
и tax_query
это всегдаarray( array() )
, как они сочетают в себе несколько массивов. Второе - как уже упоминалось в моем ответе - нужно использовать meta_value_num
для чисел. С тем же успехом может потребоваться определение meta_value_num
(см. WP_Query
Запись страницы -Codex). Наконец, это не имеет смысла order
в направлении ASC
и DESC
направлении. Это невозможно. Разделитель пространства работает только для, orderby
и вы не можете сказать ему, чтобы отсортировать первое ASC
и второе DESC
. Для этого и нужен posts_clauses
фильтр.
meta_value_num
записи являются действительными числами. Слишком часто видели, что кто-то заявляет, что это число, но фактически сохраняет его в виде строки в базе данных.
ASC DESC
настолько , что он сортирует на meta_value
в ASC
и date
в DESC
, насколько я могу сказать , что это работает.