Вопрос или проблема
В действии user_new_form
параметр $user
возвращает строку add-new-user
.
Я использовал esc_attr( get_the_author_meta( '_typeuser', $user->ID ) );
, но получаю ошибку.
Другой вопрос по этой теме в данный момент без ответа, но я решил проблему следующим образом:
/* ПОЛЕ ПРОФИЛЯ */
add_action( 'show_user_profile', 'my_show_extra_profile_fields' );
add_action( 'edit_user_profile', 'my_show_extra_profile_fields' );
add_action( 'user_new_form', 'my_show_extra_profile_fields');
function my_show_extra_profile_fields( $user ) {
if(is_string($user) === true){
$user = new stdClass();//создать новый
$user->ID = -9999;
}
$newsletter = esc_attr( get_the_author_meta( '_newsletter', $user->ID ) );
unset($user);
}
Как мы можем решить эту проблему без создания объекта и установки $user->ID
на -9999
для нового пользователя?
используйте так:
$id = $user->ID;
И если пользователь новый, установите $id = 9999
function my_show_extra_profile_fields( $user ) {
if(is_string($user) === true){
$user = new stdClass();//создать новый
$id = -9999;
}
$newsletter = esc_attr( get_the_author_meta( '_newsletter', $id ) );
unset($user);
}
Просто проверьте, установлен ли ID участника:
function my_show_extra_profile_fields( $user ) {
$id = isset($user->ID)? $user->ID : -9999;
$newsletter = esc_attr( get_the_author_meta( '_newsletter', $id ) );
}
Ответ или решение
Решение проблемы с параметром user_new_form
в WordPress
В рамках создания новой формы пользователя в WordPress, возникает ситуация, когда параметр $user
оказывается строкой, а не объектом. В таких случаях возникает ошибка при попытке получить ID пользователя, что становится причиной затруднений для разработчика. Рассмотрим, как можно элегантно решить эту проблему, не прибегая к созданию временных объектов.
Понимание проблемы
При использовании действия user_new_form
, происходит ожидание, что переданный параметр будет объектом пользователя, что обычно подразумевает наличие свойства ID
. Однако в вашем случае, параметр оказывается строкой add-new-user
. Это приводит к тому, что попытка обращения к $user->ID
вызывает ошибку, поскольку строка не является объектом.
Эффективное решение
Для того чтобы избежать создания объекта с фейковым ID (например, -9999
), рекомендуется проверять наличие свойства ID
устройства и, если оно отсутствует, устанавливать значение по умолчанию. Следующий код позволяет эффективно реализовать эту логику:
function my_show_extra_profile_fields( $user ) {
// Проверяем, существует ли свойство ID у объекта $user.
$id = isset($user->ID) ? $user->ID : 9999; // Если нет ID, устанавливаем значение по умолчанию 9999.
// Получаем значение мета-поля.
$newsletter = esc_attr( get_the_author_meta( '_newsletter', $id ) );
// Здесь можно добавить вывод поля новостной рассылки и прочего контента.
}
Объяснение кода
-
Проверка ID: Код использует
isset()
для проверки наличия свойстваID
. Если его нет, мы устанавливаем$id = 9999
. Это позволяет избежать необходимости создавать временный объект. -
Получение мета-данных: С помощью функции
get_the_author_meta()
мы безопасно извлекаем значение мета-поля_newsletter
, используя как id существующего пользователя, так и значение по умолчанию. -
Эскейпинг:
esc_attr()
используется для предотвращения XSS-уязвимостей, что очень важно при выводе данных, полученных от пользователя.
Заключение
Такое решение позволяет избежать ненужных манипуляций с объектами и улучшает читаемость кода, а также упрощает его поддержку в будущем. Важно помнить, что правильная обработка данных, приходящих от системы, позволяет избежать множества потенциальных ошибок и упрощает разработку. Применение вышеизложенной логики в коде формы создания нового пользователя в WordPress – это надежный и безопасный способ управления данными в контексте обработки пользователя.