Вопрос или проблема
Я использую Gravity Forms для формы регистрации и настроил скрытое поле, которое автоматически заполняется случайной строкой, сгенерированной и переданной в форму с помощью
add_filter("gform_field_value_random_number", "generate_random_number");
function generate_random_number($value){
$value = substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" ,5)), 0, 7);
}
Это используется в качестве уникального кода купона/пользователя. Это поле также отображается в их профиле пользователя.
До этого момента все хорошо. Проблема возникает в проверке базы данных, чтобы убедиться, что у пользователя уже нет этого кода купона. Сначала я хотел использовать get_user_meta, но это работает только для одного user_id за раз. Мне нужно, чтобы проверялась ВСЯ база пользователей. Поэтому я подумал использовать запрос wpdb, примерно такой:
$wpdb->get_results(
"
SELECT meta_value
FROM $wpdb->usermeta
WHERE meta_key = 'Referral'
")
Моя окончательная функция, по сути, будет следующей:
- Сгенерировать случайный номер и вернуть переменную с ним (например, $value)
- Сделать цикл while, чтобы проверить, существует ли уже $value в базе данных
- Закончить цикл, когда $value не совпадает ни с чем в базе данных.
Я не уверен, как это реализовать. Если кто-то может помочь или указать в правильном направлении, если это неправильно, я буду очень признателен! 🙂
редактировать: Извините, вот сайт: http://colorplan.ca
Я лично стараюсь избегать запросов mysql, когда могу использовать функции WordPress для достижения той же цели. Вы можете попробовать использовать get_users, Это то, что вы пытаетесь достичь:
<?php
$blogusers = get_users('meta_value=Referral');
foreach ($blogusers as $user) {
echo $user->user_email;
}
?>
Не проверено. Но это должно отобразить каждого пользователя со значением null для пользовательской меты Referral. Если это сработает, вы можете изменить echo $user->user_email;, на update_user_meta($user->id, ‘Referral’, $coupon_code);
это работает для меня
if ( metadata_exists( 'user', $user_id, $meta_key ) ) {
print_r("Существует");
} else {
print_r("Не существует");
}
Ответ или решение
Для решения вашей задачи по проверке наличия уникального кода купона (значения meta_value
) для всех пользователей в базе данных WordPress, вы действительно на правильном пути, но есть более эффективные способы минимизировать прямые запросы к базе данных.
Шаги решения задачи
-
Генерация случайного номера. Ваш исходный код для генерации случайной строки выглядит хорошо. Мы будем использовать эту функцию, чтобы создать уникальный код купона.
-
Проверка на уникальность кода. Вместо того чтобы использовать
wpdb
для выполнения SQL-запроса, вы можете использовать функциюget_users()
, что поможет избежать проблем с безопасностью и совместимостью. Использование встроенных функций WordPress является предпочтительным методом проверки данных.
Пример реализации
Вот пример, который включает в себя описанные выше шаги:
add_filter("gform_field_value_random_number", "generate_random_number");
function generate_random_number($value){
do {
$value = substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 5)), 0, 7);
} while (!is_coupon_code_unique($value));
return $value;
}
function is_coupon_code_unique($coupon_code) {
// Получаем всех пользователей с конкретным значением мета-ключа 'Referral'
$users = get_users(['meta_key' => 'Referral', 'meta_value' => $coupon_code]);
// Если массив пользователей пуст, купон уникален
return empty($users);
}
Пояснение к коду
-
Генерация случайного кода:
- В функции
generate_random_number
, мы используем циклdo-while
, чтобы продолжать генерировать новый код, пока не найдется уникальный.
- В функции
-
Проверка на уникальность:
- Функция
is_coupon_code_unique
используетget_users()
для получения всех пользователей с мета-данными, соответствующими сгенерированному коду. Если массивusers
пустой, значит, код уникален.
- Функция
Заключение
Использование get_users()
для проверки уникальности = более безопасный и оптимизированный подход по сравнению с написанием собственных SQL-запросов. Это также делает ваш код более читабельным и адаптированным к изменениям в API WordPress.
Стоит упомянуть, что вам может понадобиться учитывать дополнительные случаи, такие как повторная генерация кодов в случае назначения пользователям, а также возможность закэшировать результаты для повышения производительности, если у вас большое количество пользователей.
С этим подходом вы сможете эффективно обрабатывать уникальные купоны для каждого пользователя в вашем проекте, используя все преимущества WordPress.