Почему get_users() не работает в админ-панели?

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

Я не могу понять, почему get_users() работает на фронтенде, но не на административной панели. Я уверен, что это работало в какой-то момент.

Мой код:

function add_new_user_menu_item() {

    remove_submenu_page('users.php', 'user-new.php');
    $submenu_title = __( 'Добавить нового', 'myplugin' );

    add_submenu_page(
        'users.php',
        __( 'Добавить пользователя', 'myplugin' ),
        $submenu_title,
        'create_users',
        'new-user',
        'manage_new_user_submit'
    );
} add_action( 'admin_menu', 'add_new_user_menu_item' );

function manage_new_user_submit() {

    if ( isset( $_POST ) && isset( $_POST['action'] ) ) {

        if ( $_POST['action'] == 'newuser' && wp_verify_nonce( $_POST['_wpnonce_add-user'], 'add-user' ) ) {

            session_start();
            $errors = array();

            $is_registered = get_users( array(
                'meta_key'      => 'my_meta_key', 
                'meta_value'    => sanitize_text_field($_POST['my_meta_value']),
                'fields'        => array( 'id', 'user_email' ),
                'role'          => 'customer',
            ));

            // $is_registered возвращает массив()
            error_log("Register: " . json_encode($is_registered));
        }

        ....
    }
}

Он возвращает пустой массив. Если я запускаю функцию get_users() на фронтенде в действии template_redirect, я получаю пользователя корректно.

Может быть, это проблема с разрешениями? Нет, верно? Он работает на фронтенде. Я вызываю это слишком рано? Не думаю.

Редактировать:
Добавлены детали

Возможно, user.php еще не загружен. get_users() является оболочкой для WP_User_Query, который определяется в wp-includes/user.php. Хуки указывают, что template_redirect идет после wp, после регистрации пользователей.

Возможно, вы можете попробовать условно подключить ‘template_redirect’ на фронтенде и ‘user_admin_menu’ на бэкенде.

if (is_admin()){
   add_action('user_admin_menu','manage_new_user_submit');
} else {
   add_action('template_redirect','manage_new_user_submit');
}

Также, возможно, стоит убрать завершающую запятую в команде get_users(). Это иногда может приводить к null.

Ответ или решение

Рассмотрим проблему, при которой функция get_users() работает на фронтенде, но не функционирует в административной панели. Для начала, давайте разберем контекст и возможные причины возникновения этой ошибки.

Теория

Функция get_users() — это оболочка для класса WP_User_Query, который используется в WordPress для получения списка пользователей на основе заданных критериев. Он определяется в файле wp-includes/user.php. Для корректного выполнения функции необходимо, чтобы этот файл был загружен, а также чтобы было установлено правильное окружение для взаимодействия с базой данных пользователей.

Возможные причины, по которым get_users() не работает в админ-панели, могут включать:

  1. Загруженность зависимостей: Возможно, что необходимые файлы или функции не загружены на момент вызова get_users() в административной панели.
  2. Проблемы с хукамы: Как уже было упомянуто в комментарии, template_redirect — это хук, который срабатывает позже в процессе загрузки страницы, на котором гарантированно доступны многие функции WordPress. В админ-панели вы можете использовать другие хуки, такие как user_admin_menu, который подходит для вызова функции после того, как необходимые компоненты загружены.
  3. Разрешения: Несмотря на то, что вы исключили разрешения как возможную причину, иногда бывает полезно проверить, имеет ли текущий пользователь достаточные права для выполнения определенных операций.
  4. Ошибка в коде: Наличие ошибок в самом коде также может привести к тому, что возвращаемое значение будет пустым. Это может быть связано, например, с неправильной передачей параметров в get_users().

Пример

В вашем коде функция manage_new_user_submit обрабатывает отправку формы и использует get_users() для проверки существующих пользователей с определенным мета-значением. Однако, если эта функция подключена неправильно или в неправильный момент, результат может оказаться недействительным. Давайте рассмотрим улучшенный подход.

Применение

  1. Подключение квадрата функций: Для админ-панели лучше использовать хук user_admin_menu, чтобы убедиться в загрузке всех необходимых компонентов.

  2. Использование правильных хуков:

    • Для фронтенда: оставайтесь с template_redirect.
    • Для админ-панели: используйте user_admin_menu.
  3. Обновление обработчика хуков:

    if (is_admin()) {
        add_action('admin_menu', 'add_new_user_menu_item');
        add_action('user_admin_menu', 'manage_new_user_submit');
    } else {
        add_action('template_redirect', 'manage_new_user_submit');
    }
  4. Проверка на ошибки и параметры:
    Убедитесь, что в get_users() нет лишних запятых или других синтаксических помех. Например, ваш запрос с параметрами должен быть:

    $is_registered = get_users(array(
        'meta_key'   => 'my_meta_key',
        'meta_value' => sanitize_text_field($_POST['my_meta_value']),
        'fields'     => array('id', 'user_email'),
        'role'       => 'customer',
    ));
  5. Логирование и отладка:

    • Убедитесь, что журналы не просто записывают вызовы, но и ошибки. Вы можете расширить логирование, добавив больше ключевой информации для понимания причины ошибки.
    • Если возможно, временно увеличьте уровень логирования PHP, чтобы получить более информативные сообщения об ошибках.

Данное решение должно помочь вам понять и устранить проблему с пустым массивом при использовании get_users() в административной панели. Убедитесь, что вы правильно подключаете и используете хуки, а также проведите тщательную проверку кода на наличие ошибок и соответствие передаваемых параметров требованиям функций WordPress.

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

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