Скрыть пользовательские поля в зависимости от роли пользователя

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

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

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) в зависимости от роли пользователя.

Рекомендации

  1. Используйте current_user_can(): Эта функция позволяет проверять права пользователя, что может быть более эффективным способом определения ролей.

  2. Проверяйте метаполя: Убедитесь, что метаполя, которые вы хотите скрыть, действительно защищены от просмотра, если пользователь не имеет соответствующих прав.

Оптимизированный Код

Вот обновленный пример кода, который поможет вам достичь поставленной цели:

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 вашей темы или в ваш собственный плагин. После внесения изменений проверьте приложение на предмет того, что пользовательские поля скрыты для пользователей с другими ролями.

Если у вас возникнут трудности или дополнительные вопросы, не стесняйтесь задавать их!

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

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