Вопрос или проблема
У меня есть пользовательский тип записи под названием “продукты”. Моя цель – сделать так, чтобы мой пользовательский запрос, который я имею на главной странице, а также запрос поиска сначала показывал записи с заполненным пользовательским полем “id_number”, а затем другие записи, где “id_number” пустое. Все должно быть отсортировано по заголовку.
Вот мой код на данный момент только для моего пользовательского запроса. Мне также нужно это для запроса на странице поиска, но я еще не дошел до этого.
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$wp_query = new WP_Query( array(
'post_type' => 'products',
'posts_per_page' => 20,
'post_status' => 'publish',
'pagination' => true,
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'id_number',
'compare' => 'EXISTS',
),
array(
'key' => 'id_number',
'compare' => 'NOT EXISTS'
)
),
'meta_key' => 'id_number',
'orderby' => 'title',
'paged'=>$paged
) );
Любая помощь будет оценена. Спасибо!
Вы можете сортировать записи по мета-значению, посмотрите кодекс
Попробуйте это..
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$wp_query = new WP_Query( array(
'post_type' => 'products',
'posts_per_page' => 20,
'post_status' => 'publish',
'pagination' => true,
'meta_query' => array(
'relation' => 'OR',
'id_number' => array(
'key' => 'id_number',
'compare' => 'EXISTS',
),
'id2_number' => array(
'key' => 'id_number',
'compare' => 'NOT EXISTS'
)
),
'meta_key' => 'id_number',
'orderby' => 'id_number',
'paged' => $paged
) );
Ответ или решение
Для решения задачи получения постов пользовательского типа "products" с учетом значений пользовательского поля "id_number", мы можем использовать класс WP_Query
. Ваша цель состоит в том, чтобы сначала отобразить посты с ненулевыми значениями поля, а затем посты с пустыми значениями, при этом все посты должны быть отсортированы по заголовку.
Шаги решения
- Использование
meta_query
: Мы обернём запрос в массивmeta_query
, чтобы указать наши условия фильтрации. - Сортировка результатов: Мы будем использовать параметр
orderby
, чтобы отсортировать посты по заголовку, а также воспользоваться параметромmeta_key
для сортировки по полюid_number
, чтобы сначала отображались посты с заполненным значением. - Нумерация страниц: Параметр
paged
учитывает текущую страницу для постраничной навигации.
Правильный код
Вот как будет выглядеть ваш запрос:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$wp_query = new WP_Query( array(
'post_type' => 'products',
'posts_per_page' => 20,
'post_status' => 'publish',
'paged' => $paged,
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'id_number',
'value' => '', // проверяем, что id_number не пустое
'compare' => '!=', // сравнение с значением не равным пустому
),
array(
'key' => 'id_number',
'compare' => 'NOT EXISTS', // проверяем отсутствующие поля
)
),
'orderby' => array(
'id_number' => 'DESC', // сначала те, что с id_number
'title' => 'ASC' // затем по заголовку
),
) );
Пояснение:
- Используется
meta_query
с операторомOR
для поиска постов, у которых полеid_number
не пусто или отсутствует. - Для сортировки, сначала сортируем по
id_number
в порядке убывания (DESC
), чтобы в начале были посты с заданным значением, и затем по заголовку по возрастанию (ASC
). - Параметр
paged
обеспечивает поддержку постраничной навигации, что очень важно для удобства пользователей.
Поиск
Для страницы поиска, вам нужно будет использовать аналогичный запрос, но охватить и другие параметры, которые могут быть частью поиска.
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$search_query = get_search_query(); // получаем поисковый запрос
$wp_query = new WP_Query( array(
'post_type' => 'products',
'posts_per_page' => 20,
'post_status' => 'publish',
'paged' => $paged,
's' => $search_query, // добавляем поисковый запрос
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'id_number',
'value' => '',
'compare' => '!=',
),
array(
'key' => 'id_number',
'compare' => 'NOT EXISTS',
)
),
'orderby' => array(
'id_number' => 'DESC',
'title' => 'ASC'
),
) );
Заключение
С помощью этого кода вы сможете добиться желаемой функциональности как на главной странице, так и на странице результатов поиска. Важно следить за тем, чтобы пользовательский интерфейс оставался интуитивно понятным и удобным для пользователей, и при этом поддерживать производительность ваших запросов к базе данных.