Вопрос или проблема
Как мне позволить конкретному пользователю или конкретной роли просматривать черновики и предварительные просмотры, но не позволять им редактировать посты или иметь какие-либо другие административные возможности? Я могу добавить пользовательскую возможность для роли, но не знаю, как разрешить им просматривать черновики и предварительные просмотры. Есть мысли?
Я нашел более простой способ. Я дал им возможности роли 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, '?');
}
Заключение
Таким образом, вы можете настроить свою систему управления правами следующим образом:
- Использовать пользовательские возможности для разрешения просмотра черновиков и предварительных версий.
- Настроить фильтры, которые изменяют статус постов для определенных ролей.
- Блокировать доступ в административную панель для ролей, которые не должны ее видеть.
Эти шаги помогут вам контролировать доступ пользователей и обеспечить соответствующий уровень прав, избегая ненужных административных возможностей.