Продвинутый WP_Query с meta_query и orderby
Интересует, может ли кто-нибудь помочь с этим немного сложным запросом с использованием ACF.
У меня есть следующий код, который должен отображать:
Страницы,
Новостные статьи,
Статьи "О нас" и
Статьи "Участие".
Показывать: только 4.
Отображать только если: ACF/Meta Key 'home_page' имеет значение 'yes'
И
Сортировать по числовому значению ACF/Meta Key 'home_order', т.е. 1,2,3 первый, второй, третий и т.д.
$args = array(
// Типы записей
'post_type' => array( 'page', 'news-articles', 'about-articles','involved-articles' ),
'showposts' => 4,
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'home_page',
'value' => 'yes',
'compare' => 'IN',
),
array(
'orderby' => 'meta_value_num',
'meta_key' => 'home_order',
),
),
);
Думаю, что-то идет не так с параметрами 'compare' и 'relation'

Вам действительно стоит прочитать документацию по meta_query
Вот что допустимо в meta_query
:
key (строка) - Ключ произвольного поля.
value (строка|массив) - Значение произвольного поля. Может быть массивом только если compare равен
'IN'
,'NOT IN'
,'BETWEEN'
или'NOT BETWEEN'
. Вам не нужно указывать значение при использовании сравнений'EXISTS'
или'NOT EXISTS'
в WordPress 3.9 и выше.(Примечание: Из-за бага #23268, значение обязательно для сравнений
NOT EXISTS
для корректной работы до версии 3.9. Вы должны указать любую строку для параметра value. Пустая строка илиNULL
НЕ сработают. Однако, любая другая строка подойдет и НЕ появится в вашем SQL при использованииNOT EXISTS
. Нужна подсказка? Как насчет 'bug #23268'.)compare (строка) - Оператор сравнения. Допустимые значения:
'='
,'!='
,'>'
,'>='
,'<'
,'<='
,'LIKE'
,'NOT LIKE'
,'IN'
,'NOT IN'
,'BETWEEN'
,'NOT BETWEEN'
,'EXISTS'
и'NOT EXISTS'
. Значение по умолчанию:'='
.type (строка) - Тип произвольного поля. Допустимые значения:
'NUMERIC'
,'BINARY'
,'CHAR'
,'DATE'
,'DATETIME'
,'DECIMAL'
,'SIGNED'
,'TIME'
,'UNSIGNED'
. Значение по умолчанию:'CHAR'
.
Ваша сортировка должна происходить вне meta_query
. Вы можете попробовать следующее:
$args = [
'post_type' => ['page', 'news-articles', 'about-articles', 'involved-articles'],
'posts_per_page' => 4,
'meta_key' => 'home_order',
'orderby' => 'meta_value_num',
'meta_query' => [
[
'key' => 'home_page',
'value' => 'yes',
]
],
];
Дополнительные примечания:
Начиная с PHP 5.4 вы можете использовать сокращенный синтаксис массивов, т.е. использовать
[]
вместоarray()
. Если вы все еще используете версию ниже PHP 5.6, вам стоит серьезно задуматься об обновлении.showposts
устарел в пользуposts_per_page
, поэтому лучше использоватьposts_per_page
.

@birgire спасибо, да, это была ошибка быстрого копирования и вставки ;-)

$args = array(
'posts_per_page' => 4, // Количество записей на странице
'post_type' => array( 'page', 'news-articles', 'about-gorilla','involved' ), // Типы записей
'orderby' => 'meta_value_num', // Сортировка по числовому метаполю
'meta_key' => 'home_order', // Метаполе для сортировки
'order' => 'ASC', // Порядок сортировки (по возрастанию)
'meta_query' => array( // Дополнительные условия для метаполей
array(
'key' => 'home_page', // Ключ метаполя
'value' => 'yes', // Значение метаполя
'compare' => '=', // Оператор сравнения
),
),
);
