Проверка, существует ли meta_value для любого пользователя

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

Я использую 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'
        ")

Моя окончательная функция, по сути, будет следующей:

  1. Сгенерировать случайный номер и вернуть переменную с ним (например, $value)
  2. Сделать цикл while, чтобы проверить, существует ли уже $value в базе данных
  3. Закончить цикл, когда $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, вы действительно на правильном пути, но есть более эффективные способы минимизировать прямые запросы к базе данных.

Шаги решения задачи

  1. Генерация случайного номера. Ваш исходный код для генерации случайной строки выглядит хорошо. Мы будем использовать эту функцию, чтобы создать уникальный код купона.

  2. Проверка на уникальность кода. Вместо того чтобы использовать 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);
}

Пояснение к коду

  1. Генерация случайного кода:

    • В функции generate_random_number, мы используем цикл do-while, чтобы продолжать генерировать новый код, пока не найдется уникальный.
  2. Проверка на уникальность:

    • Функция is_coupon_code_unique использует get_users() для получения всех пользователей с мета-данными, соответствующими сгенерированному коду. Если массив users пустой, значит, код уникален.

Заключение

Использование get_users() для проверки уникальности = более безопасный и оптимизированный подход по сравнению с написанием собственных SQL-запросов. Это также делает ваш код более читабельным и адаптированным к изменениям в API WordPress.

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

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

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

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