Показать первые записи с непустым пользовательским полем и отсортировать все по заголовку.

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

У меня есть пользовательский тип записи под названием “продукты”. Моя цель – сделать так, чтобы мой пользовательский запрос, который я имею на главной странице, а также запрос поиска сначала показывал записи с заполненным пользовательским полем “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
    ) ); 

Любая помощь будет оценена. Спасибо!

Вы можете сортировать записи по мета-значению, посмотрите кодекс

https://codex.wordpress.org/Class_Reference/WP_Query

Попробуйте это..

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

Шаги решения

  1. Использование meta_query: Мы обернём запрос в массив meta_query, чтобы указать наши условия фильтрации.
  2. Сортировка результатов: Мы будем использовать параметр orderby, чтобы отсортировать посты по заголовку, а также воспользоваться параметром meta_key для сортировки по полю id_number, чтобы сначала отображались посты с заполненным значением.
  3. Нумерация страниц: Параметр 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'
    ),
) );

Заключение

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

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

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