Вопрос или проблема
Я пытаюсь выполнить запрос списка идентификаторов пользователей в WordPress, используя SQL IN() с добавлением того, что у них есть значение meta_value “Yes” по meta_key “is_registered” в таблице wp_usermeta, но у меня не получается заставить это работать. Он просто возвращает 0 результатов. Если я использую только IN() с массивом ID, все работает нормально.
Вот что я использую:
SELECT DISTINCT wp_users.ID FROM wp_users LEFT JOIN wp_usermeta ON ( wp_users.ID = wp_usermeta.user_id ) WHERE wp_users.ID IN(23,643,574,617,26) AND wp_usermeta.meta_key = 'is_registered' AND wp_usermeta.meta_value="Yes"
Это должно быть SQL. Я не могу использовать WP_User_Query(), поскольку это для моего личного проекта, где я хотел бы использовать SQL.
Может ли кто-нибудь увидеть, что я делаю неправильно, так как я ломаю голову над этим, кажется, целую вечность!
Я бы просто использовал WP_User_Query
для этого:
$args = [
'meta_key' => 'is_registered',
'meta_value' => 'Yes',
'fields' => 'ID',
];
$user_query = new WP_User_Query($args);
Ответ или решение
Ваша задача связана с запросом к базе данных WordPress с использованием SQL для получения списка ID пользователей, которые имеют определенное значение в таблице метаданных пользователей (wp_usermeta
). Данная ситуация требует внимательного подхода к SQL-запросу, чтобы добиться желаемого результата.
Теория:
В WordPress информация о пользователях хранится в двух основных таблицах: wp_users
и wp_usermeta
. Таблица wp_users
содержит основные данные пользователя, такие как имя пользователя, электронная почта, пароль и пр., в то время как wp_usermeta
содержит метаданные пользователей, которые могут быть любыми пользовательскими и системными данными, такими как настройки профиля и пользовательские опции.
Основным аспектом успешного выполнения запроса является корректное использование соединений (JOIN) и условий фильтрации (WHERE). В вашей задаче, вы пытаетесь объединить таблицы wp_users
и wp_usermeta
через поле ID
пользователя, при этом отфильтровывая пользователей по определенным условиям: наличие ID в списке и наличие метаданных со значением "Yes" для ключа "is_registered".
Пример:
Ваш запрос на данный момент выглядит следующим образом:
SELECT DISTINCT wp_users.ID
FROM wp_users
LEFT JOIN wp_usermeta ON (wp_users.ID = wp_usermeta.user_id)
WHERE wp_users.ID IN(23,643,574,617,26)
AND wp_usermeta.meta_key = 'is_registered'
AND wp_usermeta.meta_value = "Yes"
На первый взгляд этот запрос выглядит корректно, но он возвращает 0 результатов, что, вероятно, связано с особенностями вашего набора данных или ошибкой в логике запроса.
Применение:
Давайте рассмотрим несколько важных моментов, которые могут помочь исправить ваш запрос:
-
Проверьте наличие записей: Убедитесь, что для каждого из указанных ID существует запись в таблице
wp_usermeta
сmeta_key = 'is_registered'
. Если хотя бы для одного пользователя она отсутствует, то соответствующий ID не будет включен в результаты запроса. -
Использование INNER JOIN вместо LEFT JOIN: В данном случае, если вы уверены, что у каждого пользователя должна быть соответствующая запись в
wp_usermeta
, вам стоит использоватьINNER JOIN
. Это соединение гарантирует, что каждый результат будет иметь связанныйmeta_key
.SELECT DISTINCT wp_users.ID FROM wp_users INNER JOIN wp_usermeta ON (wp_users.ID = wp_usermeta.user_id) WHERE wp_users.ID IN(23,643,574,617,26) AND wp_usermeta.meta_key = 'is_registered' AND wp_usermeta.meta_value = "Yes"
-
Проверьте коррелированные данные: Убедитесь, что метаданные пользователей действительно хранят значения "Yes" с учетом регистра — в некоторых базах данных, если значения отличаются регистром, например, "yes" и "Yes", они будут считаться разными (
binary collation
). -
Тестирование поэтапно: Дайте запросу, выборочным образом, возможность извлекать данные: сначала получите все мета-данные у одного конкретного ID и убедитесь, что вы видите
meta_key
иmeta_value
, которые вы пытаетесь использовать. -
Отладка и логирование: Вставьте временные
SELECT
в процессе разработки, чтобы видеть промежуточные результаты и корректируйте запрос соответственно.
Если после всех этих проверок проблема сохраняется, стоит дополнительно рассмотреть возможность возникновения ошибок на уровне кодировки базы данных или наличии практических ограничений в самом WordPress.
Это позволит вам более полноценно понимать, почему текущий SQL-запрос не дает ожидаемых результатов и что именно можно поправить. Обратите внимание на то, что WordPress иногда может использовать кэширование результатов, что может вводить в заблуждение при тестировании SQL напрямую. Для исключения влияния кэширования, убедитесь, что вы тестируете в условиях, где оно отключено, или используйте SQL_NO_CACHE
в запросах.