Продвинутый WP_Query с meta_query и orderby

4 февр. 2016 г., 23:03:25
Просмотры: 30.9K
Голосов: 2

Интересует, может ли кто-нибудь помочь с этим немного сложным запросом с использованием 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'

0
Все ответы на вопрос 2
2

Вам действительно стоит прочитать документацию по 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.

5 февр. 2016 г. 06:36:14
Комментарии

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

Pieter Goosen Pieter Goosen
5 февр. 2016 г. 08:46:44

Да, я прочитал все это, но не смог полностью понять, чтобы правильно все упорядочить. Я разобрался с помощью помощи из другого источника, используя следующее..

user4630 user4630
5 февр. 2016 г. 11:52:48
1
$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'   => '=', // Оператор сравнения
                    ),
                ),
            );
5 февр. 2016 г. 11:53:32
Комментарии

Пожалуйста, не выкладывайте код в качестве ответа без объяснений, спасибо. Однако этот код выглядит почти так же, как ответ от @PieterGoosen, за исключением порядка. Обратите внимание, что параметр compare по умолчанию имеет значение =

birgire birgire
5 февр. 2016 г. 11:59:02