Мета-запрос с сортировкой по другому пользовательскому полю

Вопрос или проблема

Редактировать: Я попытаюсь подробно объяснить свою проблему.
Я работаю над портфолио-сайтом. Есть несколько пользовательских типов записей: Проекты, Публикации, Выставки, Лекции и Слайды. Главная страница состоит из следующих разделов:

  • слайдер с Слайдами
  • портфолио, состоящее из:
  • выбранных (отмеченных Клиентом) Проектов, Публикаций, Выставок и Лекций
  • и оставшихся Проектов, Публикаций, Выставок и Лекций
  • раздела наград

Теперь у меня возникла проблема с разделом портфолио. Он должен быть постраничным, чтобы использовать бесконечную прокрутку от Desandro – следующие записи загружаются после нажатия кнопки “Загрузить еще”.
Первые 10 записей – это те, что отмечены как ‘выбранные’ (1-е пользовательское поле) Клиентом в определенном порядке, определяемом 2-м пользовательским полем (от 1 до 10).
Остальные записи должны быть отсортированы по дате в порядке убывания.

Я использовал wp_query для выборки пользовательских записей и meta_query, чтобы получить эти ‘выбранные’ записи на верх и отсортировать их по возрастанию. Я пытался отсортировать оставшиеся записи по дате, но застрял.

Посмотрите на мои аргументы wp_query:

'post_type' => array( 'projekty', 'publikacje', 'wystawy', 'wyklady' ),
'post_status' => array( 'publish' ),
'meta_query' => array(
    'relation' => 'OR',
    'home_rest' => array(
        'key' => 'sticky_home',
        'compare' => 'NOT EXISTS'
        ),
    'home_sticky' => array(
        'key' => 'sticky_home',
        'compare' => 'EXISTS'
        ),
'orderby' => array(
    'home_rest' => 'DESC',
    'home_sticky' => 'ASC',
    ),
'posts_per_page' => 10, 
'paged' => get_query_var('paged'), 

Я достиг первой цели (вы можете увидеть красные блоки, представляющие ‘выбранные’ записи здесь: http://redesigned.pl/_sts/bxbstudio/strona-glowna-infinitemasonry/.

Я думал, что смогу сделать такую многократную сортировку orderby. Сначала сортировать по полю sticky_home (логическое поле), чтобы получить выбранные записи на верх; Во-вторых, сортировать их по возрастанию по полю sticky_home_order; В-третьих, сортировать записи с sticky_home, отмеченным как false, в порядке убывания по дате публикации. Как вы считаете, возможно ли все это получить в одном запросе? или, возможно, есть другой способ достичь этого?

Буду признателен за любую помощь.

Редактировать: Я не опытный программист PHP. Прочитав различные материалы на stack exchange, я думаю, что возможно использование usort может быть решением. вместе с get_posts? но с другой стороны, постраничная навигация сломается…

После некоторого времени экспериментов и поисков я смог добиться:

  • ‘выбранные’ 10 записей на верх
  • ‘оставшиеся’ записи ниже, отсортированные по убыванию даты

К сожалению, ‘выбранные’ записи находятся в порядке убывания… вот мой запрос:

$args = array(
    'post_type' => array( 'projekty', 'publikacje', 'wystawy', 'wyklady' ),
    'post_status' => array( 'publish' ),
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'sticky_home_order',
            'type' => 'numeric',
            'compare' => 'NOT EXISTS'
        ),
        array(
            'key' => 'sticky_home_order',
            'type' => 'numeric',
            'compare' => 'EXISTS'
        ),
    ),
    'orderby' => array(
        'meta_value' => 'DESC',
        'meta_value_num' => 'ASC', 
        'date' => 'DESC'
    ),
    'posts_per_page' => 20, 
    'paged' => get_query_var('paged')
);

Ответ или решение

Задача: Запрос Meta с сортировкой по другому пользовательскому полю в WordPress

Введение

Ваша задача состоит в том, чтобы создать запрос в WordPress, который извлекает кастомные посты, имея сложные условия сортировки на основе пользовательских полей. Рассмотрим, как вы можете реализовать это на практике.

Описание проблемы

Вы работаете над портфолио-сайтом, который содержит несколько типов постов: проекты, публикации, выставки, лекции и слайды. На главной странице есть раздел для портфолио, который отображает ‘выбранные’ посты, относящиеся к клиенту, и оставшиеся посты, отсортированные по дате.

Требования сортировки

  1. Выбранные посты (отмеченные как ‘sticky_home’) должны отображаться первыми и сортироваться по пользовательскому полю sticky_home_order в порядке возрастания.
  2. Оставшиеся посты должны отображаться ниже и сортироваться по дате публикации в порядке убывания.

Решение с использованием WP_Query

Для реализации этого функционала вы можете использовать следующий код:

$args = array(
    'post_type' => array('projekty', 'publikacje', 'wystawy', 'wyklady'),
    'post_status' => 'publish',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'sticky_home',
            'value' => '1', // 1 для выбранных
            'compare' => '='
        ),
        array(
            'key' => 'sticky_home',
            'value' => '0', // 0 для оставшихся
            'compare' => '='
        )
    ),
    'orderby' => array(
        'meta_value_num' => 'ASC', // сортировка по `sticky_home_order` для выбранных
        'date' => 'DESC' // сортировка по дате для оставшихся
    ),
    'posts_per_page' => 20,
    'paged' => get_query_var('paged'),
);

// Запрос
$query = new WP_Query($args);

// Начинаем цикл
if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        // Ваш код для отображения поста
    }
    wp_reset_postdata();
} else {
    // Выводим сообщение о том, что постов нет
}

Объяснение кода

  • meta_query: Мы используем relation для объединения двух условий. Первое условие выбирает те посты, которые отмечены как ‘sticky_home’, а второе — те, которые не отмечены.
  • orderby: Поскольку мы хотим сначала отсортировать ‘выбранные’ посты по sticky_home_order, мы используем meta_value_num, а затем сортируем оставшиеся посты по дате.
  • paged: Обеспечиваем поддержку постраничной навигации для бесконечной прокрутки.

Заключение

С помощью предложенного решения вы сможете извлекать и сортировать кастомные посты в соответствии с заданными пользователем критериям. Если у вас возникнут дополнительные вопросы или потребуется уточнение, не стесняйтесь задавать их.

Оцените материал
Добавить комментарий

Капча загружается...