Вопрос или проблема
Редактировать: Я попытаюсь подробно объяснить свою проблему.
Я работаю над портфолио-сайтом. Есть несколько пользовательских типов записей: Проекты, Публикации, Выставки, Лекции и Слайды. Главная страница состоит из следующих разделов:
- слайдер с Слайдами
- портфолио, состоящее из:
- выбранных (отмеченных Клиентом) Проектов, Публикаций, Выставок и Лекций
- и оставшихся Проектов, Публикаций, Выставок и Лекций
- раздела наград
Теперь у меня возникла проблема с разделом портфолио. Он должен быть постраничным, чтобы использовать бесконечную прокрутку от 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, который извлекает кастомные посты, имея сложные условия сортировки на основе пользовательских полей. Рассмотрим, как вы можете реализовать это на практике.
Описание проблемы
Вы работаете над портфолио-сайтом, который содержит несколько типов постов: проекты, публикации, выставки, лекции и слайды. На главной странице есть раздел для портфолио, который отображает ‘выбранные’ посты, относящиеся к клиенту, и оставшиеся посты, отсортированные по дате.
Требования сортировки
- Выбранные посты (отмеченные как ‘sticky_home’) должны отображаться первыми и сортироваться по пользовательскому полю
sticky_home_order
в порядке возрастания. - Оставшиеся посты должны отображаться ниже и сортироваться по дате публикации в порядке убывания.
Решение с использованием 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: Обеспечиваем поддержку постраничной навигации для бесконечной прокрутки.
Заключение
С помощью предложенного решения вы сможете извлекать и сортировать кастомные посты в соответствии с заданными пользователем критериям. Если у вас возникнут дополнительные вопросы или потребуется уточнение, не стесняйтесь задавать их.