Вопрос или проблема
У меня есть форма поиска, и я пытаюсь сделать так, чтобы она могла искать как по основным полям пользователей (user_email, display_name и т.д.), так и по другому пользовательскому мета-ключу под названием “clinic”
Вот аргументы, которые у меня есть на данный момент
$args = array(
'orderby' => 'display_name',
'meta_key' => 'course',
'fields' => 'all',
'search' => $search,
'meta_query' => array(
array(
'key' => 'clinic',
'value' => $search,
'compare' => 'LIKE'
)
)
);
Также, не уверен, правильно ли я это настроил, но мне также нужно, чтобы запрос проверял, существует ли мета-ключ “course”, независимо от его значения (но это вторично и может быть удалено, если это может вызвать проблемы, меня в основном беспокоит поиск по мета-ключу clinic)
Вы устанавливаете два разных поля meta_key для проверки: 'course'
и 'clinic'
. Попробуйте сделать это с одним, так:
$args = array(
'orderby' => 'display_name',
'fields' => 'all',
'search' => $search,
'meta_query' => array(
array(
'key' => 'clinic',
'value' => $search,
'compare' => 'LIKE'
)
)
);
То, что делает ваш текущий запрос, — это возвращает пользователей, которые соответствуют параметру $search
по основным столбцам пользователей И мета-ключу “clinic”. Это ваше намерение?
Обновление 24.03.16:
Попробуйте это:
$args = array(
'orderby' => 'display_name',
'fields' => 'all',
'search' => $search,
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'course',
'value' => $search,
'compare' => 'LIKE'
),
array(
'key' => 'clinic',
'value' => $search,
'compare' => 'LIKE'
)
)
);
Ответ или решение
Когда вы сталкиваетесь с проблемой при выполнении запроса в WordPress с помощью WP_User_Query
, когда meta_key
не возвращает ожидаемые результаты, необходимо исследовать детали вашего запроса. В данном случае вы хотите производить поиск пользователей, основываясь как на стандартных полях, так и на пользовательском метаполе, названном "clinic". Давайте разберемся в этом вопросе поэтапно.
1. Структура вашего запроса
В вашем исходном коде вы указали два параметра meta_key
— на course
и на clinic
. Однако WP_User_Query
поддерживает только один meta_key
для каждого запроса, что может быть причиной, по которой вы не получаете ожидаемых результатов.
Вот правильная структура для вашего запроса:
$args = array(
'orderby' => 'display_name',
'fields' => 'all',
'search' => '*' . esc_sql($search) . '*', // Добавьте символы % для LIKE-запроса
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'course',
'value' => $search,
'compare' => 'LIKE'
),
array(
'key' => 'clinic',
'value' => $search,
'compare' => 'LIKE'
)
)
);
2. Поиск с использованием LIKE
Обратите внимание, что для поиска с использованием LIKE
необходимо обернуть искомое значение в символы %
. В этом случае вы можете использовать esc_sql
для предотвращения SQL-инъекций, добавив символы *
в начале и в конце значения поиска. Таким образом, функция search
будет искать в любом месте строки.
3. Проверка существования метаполя
Если вы также хотите убедиться, что метаполе course
существует (без учета его значения), вы можете добавить дополнительный аргумент в массив meta_query
, используя EXISTS
:
$args = array(
'orderby' => 'display_name',
'fields' => 'all',
'search' => '*' . esc_sql($search) . '*',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'course',
'compare' => 'EXISTS' // Проверка, существует ли поле
),
array(
'key' => 'clinic',
'value' => $search,
'compare' => 'LIKE'
)
)
);
4. Проверка и отладка
Если проблема остается, проверьте следующее:
- Наличие данных: Убедитесь, что метаполя действительно существуют и содержат данные, соответствующие вашему критерию поиска.
- Кэширование: Убедитесь, что вы очищаете кэш (если используется) после изменения метаданных.
- Проверка ошибок: Используйте функции отладки, например
print_r
илиvar_dump
, для проверки содержимого переменной$args
перед выполнением запроса.
Заключение
Правильная конфигурация запроса WP_User_Query
необходима для успешного поиска пользователей по метаполям. Используйте указанные рекомендации, чтобы улучшить производительность вашего поиска. Также не забывайте о безопасности вашего кода. Хорошо продуманный подход не только улучшит пользовательский опыт, но и повысит производительность вашего веб-приложения.
Если у вас есть дополнительные вопросы или вы хотите подробнее рассмотреть какую-либо из указанных тем, не стесняйтесь спрашивать!