Сортировать сообщения по пользовательским полям с пустыми значениями

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

Я пытаюсь вывести несколько записей, сортируя их по значению пользовательского поля (“space-comments”). Это работает очень хорошо, однако, когда пользовательское поле пустое, цикл не получает эту запись.

Есть идеи, как это исправить? Спасибо 🙂

            $args = array( 
                'post_type' => 'spaces',
                'post_per_page' => '500',
                'meta_key' => 'space-comments',                 
                'orderby' => 'meta_value_num',                  
                'order' => 'DESC',
                'author__in' => $tradicionalIds,
                    'meta_query' => array(
                        'relation' => 'AND',                            

                        array(
                            'key' => 'space-city',
                            'value' => $search,
                            'compare' => 'LIKE'
                       ),
                        array(
                            'key' => 'space-comments',
                            'compare' => 'EXISTS',                              
                        ),          

                    )
                );



            $query = new WP_query($args);

Я нашел другую запись на stackexchange, которая, кажется, отвечает на ваш вопрос:

Сортировка по необязательному мета-ключу?

Чтобы сортировать записи по значениям пользовательских полей, включая записи с пустыми значениями пользовательских полей, вам нужно изменить параметр meta_query. Вместо использования ‘compare' => 'EXISTS' вам следует использовать 'compare' => 'EXISTS' для записей, которые имеют значение для пользовательского поля, и другой массив meta_query с 'compare' => 'NOT EXISTS' для записей с пустыми значениями.

$args = array( 
    'post_type' => 'spaces',
    'posts_per_page' => 500, // Должно быть 'posts_per_page', а не 'post_per_page'
    'meta_key' => 'space-comments',                 
    'orderby' => 'meta_value_num',                  
    'order' => 'DESC',
    'author__in' => $tradicionalIds,
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'space-city',
            'value' => $search,
            'compare' => 'LIKE'
        ),
        array(
            'relation' => 'OR',
            array(
                'key' => 'space-comments',
                'compare' => 'EXISTS'
            ),
            array(
                'key' => 'space-comments',
                'compare' => 'NOT EXISTS',
                'value' => ''
            )
        )
    )
);

$query = new WP_Query($args);

Пожалуйста, измените ваш запрос, чтобы он возвращал записи с непустыми значениями пользовательского поля для space-comments, а также записи с пустыми значениями для space-comments.

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

Чтобы отсортировать записи по пользовательскому полю, включая записи с пустыми значениями, необходимо внести изменения в параметры запроса meta_query в вашем коде. Давайте разберем ваш первоначальный код и представим усовершенствованную версию, которая будет учитывать записи, у которых пользовательское поле space-comments либо существует, либо оставлено пустым.

Проблема

В вашем оригинальном запросе:

$args = array( 
    'post_type' => 'spaces',
    'post_per_page' => '500',
    'meta_key' => 'space-comments',                 
    'orderby' => 'meta_value_num',                  
    'order' => 'DESC',
    'author__in' => $tradicionalIds,
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'space-city',
            'value' => $search,
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'space-comments',
            'compare' => 'EXISTS',                              
        )
    )
);

Как вы сами заметили, данный запрос не учитывает записи с пустыми значениями пользовательского поля space-comments, так как в условии meta_query используются только записи, у которых это поле существует.

Решение

Чтобы исправить это, вы можете использовать логическую связь OR внутри meta_query, чтобы выбрать записи как с существующими значениями, так и с отсутствующими (пустыми). Кроме того, обратите внимание, что параметр post_per_page должен быть исправлен на posts_per_page для корректной работы. Вот как это будет выглядеть:

$args = array( 
    'post_type' => 'spaces',
    'posts_per_page' => 500, // исправлено на 'posts_per_page'
    'meta_key' => 'space-comments',                 
    'orderby' => 'meta_value_num',                  
    'order' => 'DESC',
    'author__in' => $tradicionalIds,
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'space-city',
            'value' => $search,
            'compare' => 'LIKE'
        ),
        array(
            'relation' => 'OR', // устанавливаем связь OR
            array(
                'key' => 'space-comments',
                'compare' => 'EXISTS' // выбираем записи с непустым полем
            ),
            array(
                'key' => 'space-comments',
                'compare' => 'NOT EXISTS' // выбираем записи с отсутствующим полем
            )
        )
    )
);

$query = new WP_Query($args);

Объяснение

В этом решении мы создали два условия в массиве meta_query:

  1. Существует: Это условие будет обрабатывать записи, у которых поле space-comments определено (может содержать число или строку).

  2. Не существует: Это условие обрабатывает записи, где поле space-comments не задано.

Таким образом, ваш запрос теперь будет возвращать не только записи с заполненными пользовательскими полями, но и те, у которых поле space-comments отсутствует, что и требуется в вашем случае.

Заключение

Данные изменения позволят вам более гибко управлять выборкой записей в WordPress, учитывая записи как с заполненными, так и с пустыми пользовательскими полями. Убедитесь, что все параметры конфигурации запроса правильно настроены для вашего конкретного случая использования.

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

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