Пользовательский SQL-запрос для wp_users с добавлением wp_usermeta

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

Я пытаюсь выполнить запрос списка идентификаторов пользователей в 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 результатов, что, вероятно, связано с особенностями вашего набора данных или ошибкой в логике запроса.

Применение:
Давайте рассмотрим несколько важных моментов, которые могут помочь исправить ваш запрос:

  1. Проверьте наличие записей: Убедитесь, что для каждого из указанных ID существует запись в таблице wp_usermeta с meta_key = 'is_registered'. Если хотя бы для одного пользователя она отсутствует, то соответствующий ID не будет включен в результаты запроса.

  2. Использование 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"
  3. Проверьте коррелированные данные: Убедитесь, что метаданные пользователей действительно хранят значения "Yes" с учетом регистра — в некоторых базах данных, если значения отличаются регистром, например, "yes" и "Yes", они будут считаться разными (binary collation).

  4. Тестирование поэтапно: Дайте запросу, выборочным образом, возможность извлекать данные: сначала получите все мета-данные у одного конкретного ID и убедитесь, что вы видите meta_key и meta_value, которые вы пытаетесь использовать.

  5. Отладка и логирование: Вставьте временные SELECT в процессе разработки, чтобы видеть промежуточные результаты и корректируйте запрос соответственно.

Если после всех этих проверок проблема сохраняется, стоит дополнительно рассмотреть возможность возникновения ошибок на уровне кодировки базы данных или наличии практических ограничений в самом WordPress.

Это позволит вам более полноценно понимать, почему текущий SQL-запрос не дает ожидаемых результатов и что именно можно поправить. Обратите внимание на то, что WordPress иногда может использовать кэширование результатов, что может вводить в заблуждение при тестировании SQL напрямую. Для исключения влияния кэширования, убедитесь, что вы тестируете в условиях, где оно отключено, или используйте SQL_NO_CACHE в запросах.

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

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