Вопрос или проблема
Я пытался читать все вопросы по этой теме и настроил код под свои нужды, но не могу заставить его работать. Вот код, который у меня есть сейчас:
function my_exclude_custom_fields( $protected, $meta_key, $user ) {
$user = wp_get_current_user();
if ( in_array( 'udlejer', (array) $user->roles ) ) {
if ( in_array( $meta_key, array( 'email', 'text' ) ) ) {
return true;
}
}
return $protected;
}
add_filter( 'is_protected_meta', 'my_exclude_custom_fields', 10, 2 );
Это не вносит никаких изменений. Хотя я вошел под другой ролью, отличной от udlejer
, я все равно могу видеть эти пользовательские поля на фронтальной части.
Пользовательские поля находятся на странице продукта, созданной с помощью WooCommerce. Нужно ли мне тогда добавить больше кода? Надеюсь, вы сможете помочь!
Вы можете использовать функцию current_user_can()
для проверки роли текущего пользователя. Я также рекомендую сделать пользовательское поле защищенным по умолчанию и разрешить доступ только соответствующим пользователям.
В теории что-то вроде этого должно сработать:
function my_exclude_custom_fields( $protected, $meta_key) {
if ( in_array( $meta_key, array( 'email', 'text' ) ) ) {
if ( current_user_can( 'udlejer' ) ) {
// ключ метаданных не защищен для роли пользователя 'udlejer'
return false;
} else {
// сделать ключи метаданных защищенными по умолчанию
return true;
}
}
return $protected;
}
add_filter( 'is_protected_meta', 'my_exclude_custom_fields', 10, 2 );
Ответ или решение
Чтобы скрыть пользовательские поля на странице продукта WooCommerce в зависимости от роли пользователя, необходимо правильно использовать фильтры и функции WordPress. Я дам вам подробное объяснение, как это сделать, а также оптимизированный код, который вы можете использовать.
Разбор Проблемы
Вы уже настроили код, но, к сожалению, он не работает так, как предполагалось. Вам нужно сделать несколько изменений и учесть дополнительные аспекты, чтобы скрыть указанные пользовательские поля (email
, text
) в зависимости от роли пользователя.
Рекомендации
-
Используйте
current_user_can()
: Эта функция позволяет проверять права пользователя, что может быть более эффективным способом определения ролей. -
Проверяйте метаполя: Убедитесь, что метаполя, которые вы хотите скрыть, действительно защищены от просмотра, если пользователь не имеет соответствующих прав.
Оптимизированный Код
Вот обновленный пример кода, который поможет вам достичь поставленной цели:
function my_exclude_custom_fields( $protected, $meta_key ) {
// Проверяем, существует ли текущий пользователь
if ( !is_user_logged_in() ) {
return true; // Защищаем метаполя для незарегистрированных пользователей
}
// Получаем текущего пользователя
$user = wp_get_current_user();
// Проверяем, к какой роли принадлежит пользователь
if ( in_array( 'udlejer', (array) $user->roles ) ) {
// Если это пользователь с ролью 'udlejer', разрешаем доступ к метаполям
return false;
} else {
// Защищаем метаполя по умолчанию
if ( in_array( $meta_key, array( 'email', 'text' ) ) ) {
return true; // Защищаем метаполя 'email' и 'text'
}
}
return $protected; // Возвращаем оригинальное значение, если метаполе не в списке
}
add_filter( 'is_protected_meta', 'my_exclude_custom_fields', 10, 2 );
Пояснение к Коду
- Проверка на вход в систему: Мы добавили проверку
is_user_logged_in()
, чтобы предотвратить доступ неавторизованных пользователей к метаполям. - Получение текущего пользователя: Используйте
wp_get_current_user()
, чтобы получить объект текущего пользователя и его роли. - Условие для роли
udlejer
: Если текущий пользователь имеет рольudlejer
, код возвращаетfalse
, что позволяет этому пользователю видеть метаполя. - Защита метаполей: Для всех других ролей, если метаполе
meta_key
входит в списокarray( 'email', 'text' )
, оно защищается и возвращаетtrue
.
Заключение
Этот код обеспечит эффективное скрытие указанных пользовательских полей для всех ролей, кроме udlejer
. Убедитесь, что вы добавили этот код в файл functions.php
вашей темы или в ваш собственный плагин. После внесения изменений проверьте приложение на предмет того, что пользовательские поля скрыты для пользователей с другими ролями.
Если у вас возникнут трудности или дополнительные вопросы, не стесняйтесь задавать их!