У меня есть рейтинговая система, в которой пользователь может ввести настраиваемое поле «Звезды» или «Сердца», но какое бы поле они ни выбрали, им нужно ввести значение от 1 до 5. Используя wp_query, я могу успешно отсортировать по одному из этих настраиваемые поля, но я не уверен, как сортировать по обоим. Вот код, который я использую для сортировки по одному из настраиваемых полей «Звезды»:
$args=array(
'posts_per_page' => $con_review_num,
'post_type' => 'con_product_reviews',
'paged' => $paged,
'orderby' => 'meta_value',
'order' => 'DESC',
'meta_key' => 'Stars'
);
Вот что я хочу, чтобы эта функция делала (обратите внимание на последнюю строку):
$args=array(
'posts_per_page' => $con_review_num,
'post_type' => 'con_product_reviews',
'paged' => $paged,
'orderby' => 'meta_value',
'order' => 'DESC',
'meta_key' => 'Stars Hearts'
);
Есть ли другой способ сделать это?
У меня была та же проблема, и я не мог найти способ заставить это работать только с wp_query. Вместо этого я поймал фильтр posts_clauses и засунул туда свой order_by. Это также означало выполнение нескольких объединений.
По сути, вы устанавливаете функцию для захвата posts_clauses (или одного из более строгих фильтров запроса; но давайте пока просто воспользуемся этим), а затем внутри этого JOIN к таблице post_meta для нужных вам полей, а затем упорядочиваете их.
Важно настроить что-то, чтобы затем удалить фильтр запроса. Вы можете сделать это в конце функции, которая его перехватывает, но у меня это отдельно в моем плагине, так что я буду придерживаться этого. Здесь отлично работает событие ‘wp’.
}
Спасибо. Если бы я еще не изменил все значения своих настраиваемых полей, я бы выбрал этот подход.
Я понимаю, о чем вы говорите, но в идеале я бы хотел, чтобы пользователю нужно было вводить только одно настраиваемое поле для каждого сообщения, поскольку у меня так много настраиваемых полей, и я стараюсь быть с ними максимально эффективным. Мне пришлось бы изменить несколько других областей в моем коде, если бы я разделил настраиваемое поле на два настраиваемых поля, поэтому, если возможно, я хотел бы найти способ изменить логику запроса вместо пользовательского интерфейса. Однако вы правы, этот метод сработает, если я хочу пойти по этому пути.
Как насчет создания двух настраиваемых полей:
то вы можете заказать по одному пользовательскому полю:
и чтобы узнать, какой рейтинг показывать, просто используйте:
Вот как я добился этого, используя только одно настраиваемое поле. Вместо того, чтобы использовать «Звезды» или «Сердца» в качестве имени настраиваемого поля и «1», «2», «3» и т. д. в качестве значения, я использовал «Рейтинг» в качестве имени и «1 звезда», «2 звездочки», «3 звезды» и т. д. (или сердечки вместо звездочек) в качестве значения. Поскольку единица измерения — от 0 до 5 как для сердечек, так и для звезд, я могу сортировать только по одному значению пользовательского поля «Рейтинг», а затем анализировать значение для отображения. Вот мой код: