Вопрос или проблема
Я пытаюсь выбрать записи, у которых значение пользовательского поля соответствует условиям поиска, но в результате я всегда получаю все записи.
Для регистрации пользовательского поля для моего типа поста я использую следующий код:
register_post_meta(
'my_post_type',
'my_data',
array(
'show_in_rest' => true,
'single' => true,
'type' => 'integer',
)
)
Чтобы запросить посты:
const data = useSelect((select) => {
const metaQuery = [
{
key: 'my_data',
value: [50, 100],
compare: 'BETWEEN',
type: 'NUMERIC'
}
];
return select(coreDataStore).getEntityRecords('postType', 'my_post_type', { meta_query: metaQuery });
});
но я всегда получаю все записи с моими пользовательскими постами и ноль ошибок или предупреждений. Поле метаданных представлено в результатах. Сгенерированный запрос к серверу содержит часть meta_query, но она закодирована в URL. Вероятно, это причина, по которой meta_query игнорируется.
Что я пропустил?
Ответ или решение
Чтобы решить проблему, с которой вы столкнулись при выборе записей на основе кастомного поля в WordPress с помощью @wordpress/data
, важно учитывать несколько ключевых аспектов, касающихся регистрации кастомных полей и формирования запросов. Давайте разберем вашу ситуацию шаг за шагом.
Регистрация кастомного поля
Вы правильно используете функцию register_post_meta
, чтобы зарегистрировать кастомное поле для вашего типа записи. Однако стоит обратить внимание на несколько моментов:
-
Параметры функции: Убедитесь, что вы используете правильные значения для параметров при регистрации вашего мета-поля. Например,
type
должен соответствовать типу данных, который вы собираетесь хранить. В вашем случае этоinteger
. Убедитесь, что данные, которые вы записываете в это поле, действительно являются целыми числами. -
Проверка доступности в REST API: Убедитесь, что поле отображается в REST API, что вы уже сделали, установив
show_in_rest
вtrue
. Это необходимо для того, чтобы у вас была возможность использовать это поле в запросах.
Формирование запроса
Теперь перейдем к тому, как вы формируете запрос с помощью useSelect
. Вы указали, что ваш запрос всегда возвращает все записи. Основная проблема, скорее всего, связана с тем, как вы формируете массив запроса meta_query
.
В вашем коде:
const metaQuery = [
{
key: 'my_data',
value: [50, 100],
compare: 'BETWEEN',
type: 'NUMERIC'
}
];
Возможные проблемы:
-
Структура
meta_query
: В WordPress для выполнения запросов на основе нескольких значений обычно используется массив с объектами. В вашем случае запросBETWEEN
не поддерживается напрямую через массивvalue
— вы должны использовать определенные значения дляmeta_query
. Попробуйте изменить структуру так:const metaQuery = { meta_key: 'my_data', meta_value: [50, 100], compare: 'BETWEEN' };
-
URL-кодировка: Если запрос не исполняется должным образом и сервер игнорирует
meta_query
, это может быть связано с неверным форматом передаваемых данных. Убедитесь, что вы правильно формируете запрос и он генерируется корректно перед отправкой к серверу.
Отладка
-
Логирование: Добавьте логирование на клиентской стороне, чтобы увидеть, что именно отправляется на сервер. Вы можете использовать
console.log
для проверки структуры объекта запроса. -
Проверка API: Используйте инструменты разработчика, чтобы посмотреть на запросы к REST API. Убедитесь, что
meta_query
действительно передается на сервер и соответствует ожидаемому формату. -
Проверка серверного кода: Если у вас есть доступ к коду, который обрабатывает этот запрос на сервере, убедитесь, что у вас нет переопределения
meta_query
, которое может повлиять на вывод.
Заключение
Чтобы добиться правильного фильтрации записей по кастомному полю в WordPress, убедитесь, что вы корректно зарегистрировали метаполе и правильно сформировали запрос. Внимательно проверьте структуру данных, отправляемых на сервер, и используйте инструменты отладки для выявления возможных проблем. Следуя вышеприведенным рекомендациям, вы сможете наладить работу с кастомными полями и получать выборки записей, соответствующие вашим критериям.