Разрешить пользователю или роли просматривать черновики и предварительные просмотры, но не другие административные привилегии?

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

Как мне позволить конкретному пользователю или конкретной роли просматривать черновики и предварительные просмотры, но не позволять им редактировать посты или иметь какие-либо другие административные возможности? Я могу добавить пользовательскую возможность для роли, но не знаю, как разрешить им просматривать черновики и предварительные просмотры. Есть мысли?

Я нашел более простой способ. Я дал им возможности роли edit_other_posts и edit_other_pages, а затем заблокировал их доступ к административной области с помощью следующего:

add_action( 'init', 'eri_block_nonadmins_init' );
function eri_block_nonadmins_init() {
    $current_url = eri_get_current_url( true, false);
    if ( (!current_user_can( 'administrator' ) && !( defined( 'DOING_AJAX' ) && DOING_AJAX )) 
        && (is_admin() || $current_url == '/cornerstone/') ) {
        wp_redirect( home_url() );
        exit;
    }
}

Конечно, я также заблокировал их доступ к нашему редактору фронтенда Cornerstone.

Если вам интересно, что делает функция eri_get_current_url():

function eri_get_current_url( $params = true, $domain = true ){
    if ($domain) {
        $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http';
        $domain = $protocol."://$_SERVER[HTTP_HOST]";
    } else {
        $domain = '';
    }

    $full_url = $domain.$_SERVER['REQUEST_URI'];

    if (!$params) {
        return strtok($full_url, '?');
    } else {
        return $full_url;
    }
}

Один из способов позволить обычно исключенной роли получить доступ к предварительным просмотрам – использовать хук posts_results в сочетании с условием is_preview. Вот пример для роли contributor.

   function contributor_preview_access( $posts ) {
    
        if (
            is_preview()
            && ! empty( $posts )
            && in_array( 'contributor', wp_get_current_user()->roles, true )
        ) {
            $posts[0]->post_status="publish";
        }
    
        return $posts;
    }
    
    add_filter( 'posts_results', 'contributor_preview_access', 10, 2 );

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

Чтобы предоставить пользователю или роли возможность просматривать черновики и предварительные версии материалов, но не позволять им редактировать посты или иметь другие административные привилегии, можно использовать гибкую систему управления правами в WordPress. Ниже я подробно опишу возможное решение этой задачи, включая использование пользовательских возможностей и фильтров.

Шаг 1. Определение пользовательских возможностей

Для начала, важно добавить кастомные возможности к роли пользователя. Вы можете создать возможность, которая позволит видеть черновики и предварительные версии, не предоставляя полных прав на редактирование. Рассмотрим пример на основе роли «contributor».

function add_custom_capabilities() {
    $role = get_role('contributor');
    if ($role) {
        // Добавляем возможности только для просмотра черновиков и предварительных версий
        $role->add_cap('read_private_posts');
        $role->add_cap('edit_others_posts');
    }
}
add_action('admin_init', 'add_custom_capabilities');

Шаг 2. Использование фильтра posts_results

Для того чтобы позволить пользователю определенной роли получить доступ к предварительным версиям, необходимо использовать фильтр posts_results. Мы проверяем, что пользователь имеет нужные права, и меняем статус поста на publish для отображения его в предварительном просмотре.

Вот пример кода на PHP:

function contributor_preview_access($posts) {
    if (
        is_preview()
        && !empty($posts)
        && in_array('contributor', wp_get_current_user()->roles, true)
    ) {
        $posts[0]->post_status = "publish";
    }

    return $posts;
}
add_filter('posts_results', 'contributor_preview_access', 10, 2);

Шаг 3. Блокировка доступа к административной панели

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

add_action('init', 'eri_block_nonadmins_init');
function eri_block_nonadmins_init() {
    $current_url = eri_get_current_url(true, false);
    if (
        (!current_user_can('administrator') && !(defined('DOING_AJAX') && DOING_AJAX))
        && (is_admin() || $current_url === '/cornerstone/')
    ) {
        wp_redirect(home_url());
        exit;
    }
}

Шаг 4. Вспомогательная функция для получения текущего URL

Не забудьте включить в ваш код вспомогательную функцию eri_get_current_url(), которая помогает получить URL текущей страницы.

function eri_get_current_url($params = true, $domain = true) {
    if ($domain) {
        $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http';
        $domain = "{$protocol}://{$_SERVER['HTTP_HOST']}";
    } else {
        $domain = '';
    }

    $full_url = $domain . $_SERVER['REQUEST_URI'];

    return $params ? $full_url : strtok($full_url, '?');
}

Заключение

Таким образом, вы можете настроить свою систему управления правами следующим образом:

  • Использовать пользовательские возможности для разрешения просмотра черновиков и предварительных версий.
  • Настроить фильтры, которые изменяют статус постов для определенных ролей.
  • Блокировать доступ в административную панель для ролей, которые не должны ее видеть.

Эти шаги помогут вам контролировать доступ пользователей и обеспечить соответствующий уровень прав, избегая ненужных административных возможностей.

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

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