Вопрос или проблема
Я пытаюсь вывести несколько записей, сортируя их по значению пользовательского поля (“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
:
-
Существует: Это условие будет обрабатывать записи, у которых поле
space-comments
определено (может содержать число или строку). -
Не существует: Это условие обрабатывает записи, где поле
space-comments
не задано.
Таким образом, ваш запрос теперь будет возвращать не только записи с заполненными пользовательскими полями, но и те, у которых поле space-comments
отсутствует, что и требуется в вашем случае.
Заключение
Данные изменения позволят вам более гибко управлять выборкой записей в WordPress, учитывая записи как с заполненными, так и с пустыми пользовательскими полями. Убедитесь, что все параметры конфигурации запроса правильно настроены для вашего конкретного случая использования.