Я модифікував вбудований WP пошук за допомогою pre_get_posts
фільтра, дозволяючи користувачеві сортувати публікації (включаючи купу спеціальних типів публікацій) за різними полями.
Проблема, яка у мене є, полягає в тому, що коли я скажу WP сортувати за мета-значенням, вона виключить усі повідомлення, у яких не встановлено мета-значення. Це призводить до зміни кількості результатів, якщо ви змінюєте сортування з "Показник" на "Дата", оскільки для "Постів" не встановлено "Ціна", а "Елементи".
Це не те, що я хочу, тому я хотів би знати, чи існує спосіб включення ВСІХ дописів - навіть тих, у яких відсутня метазначення, на яке я сортую - і ставити те, що не має значення, останнє.
Я знаю, як сортувати по декількох полях, але це не допомагає.
Спасибі
Здається, я не єдиний із цим питанням: Спосіб включення дописів з & без певного meta_key в аргументи для 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
ключа, і жодна з публікацій, у яких він є. IE проблема тепер обернена.
Якщо я також додаю код-замовлення, я отримую 0 результатів.
Редагувати: ... через три роки ... : PI знову випустив цю проблему. Я спробував усі відповіді, і жодна робота не отримала. Не впевнений, чому деякі люди, здається, думають, що працюють, але принаймні для мене вони не працюють.
Рішення, в якому я закінчився, - це використання 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
, наскільки я можу сказати, це працює.