Вопрос или проблема
Я не могу понять, почему 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()
не работает в админ-панели, могут включать:
- Загруженность зависимостей: Возможно, что необходимые файлы или функции не загружены на момент вызова
get_users()
в административной панели. - Проблемы с хукамы: Как уже было упомянуто в комментарии,
template_redirect
— это хук, который срабатывает позже в процессе загрузки страницы, на котором гарантированно доступны многие функции WordPress. В админ-панели вы можете использовать другие хуки, такие какuser_admin_menu
, который подходит для вызова функции после того, как необходимые компоненты загружены. - Разрешения: Несмотря на то, что вы исключили разрешения как возможную причину, иногда бывает полезно проверить, имеет ли текущий пользователь достаточные права для выполнения определенных операций.
- Ошибка в коде: Наличие ошибок в самом коде также может привести к тому, что возвращаемое значение будет пустым. Это может быть связано, например, с неправильной передачей параметров в
get_users()
.
Пример
В вашем коде функция manage_new_user_submit
обрабатывает отправку формы и использует get_users()
для проверки существующих пользователей с определенным мета-значением. Однако, если эта функция подключена неправильно или в неправильный момент, результат может оказаться недействительным. Давайте рассмотрим улучшенный подход.
Применение
-
Подключение квадрата функций: Для админ-панели лучше использовать хук
user_admin_menu
, чтобы убедиться в загрузке всех необходимых компонентов. -
Использование правильных хуков:
- Для фронтенда: оставайтесь с
template_redirect
. - Для админ-панели: используйте
user_admin_menu
.
- Для фронтенда: оставайтесь с
-
Обновление обработчика хуков:
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'); }
-
Проверка на ошибки и параметры:
Убедитесь, что в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', ));
-
Логирование и отладка:
- Убедитесь, что журналы не просто записывают вызовы, но и ошибки. Вы можете расширить логирование, добавив больше ключевой информации для понимания причины ошибки.
- Если возможно, временно увеличьте уровень логирования PHP, чтобы получить более информативные сообщения об ошибках.
Данное решение должно помочь вам понять и устранить проблему с пустым массивом при использовании get_users()
в административной панели. Убедитесь, что вы правильно подключаете и используете хуки, а также проведите тщательную проверку кода на наличие ошибок и соответствие передаваемых параметров требованиям функций WordPress.