Почему важно разграничивать владельцев страниц в WordPress
В стандартном WordPress нет возможности назначать владельцев конкретных страниц с разными правами и ограничениями. Обычно все страницы принадлежат администратору или редактору, но когда сайт растёт и появляются авторы, редакторы с разными задачами, важно грамотно распределять права на редактирование и управление контентом.
Это особенно актуально для сайтов с большим количеством авторов, агентств, образовательных и корпоративных порталов, где каждый владелец страницы должен иметь доступ только к своему разделу.
Реализация такой системы улучшает безопасность, упрощает управление сайтом и снижает риск случайного удаления или изменения чужого контента.
Как настроить владельцев страниц с разными ролями: обзор решений
Для реализации разграничения владельцев страниц можно использовать несколько подходов:
- Использование плагинов для управления ролями и доступом;
- Добавление пользовательских полей и логики в коде темы или плагина;
- Создание кастомных ролей и capability с помощью кода.
Рассмотрим популярные плагины и примеры кода для каждой задачи.
Плагины для управления владельцами страниц
1. User Role Editor — мощный плагин для создания и редактирования ролей и прав пользователей. Позволяет гибко настраивать доступ к страницам и типам записей.
2. PublishPress Permissions — позволяет устанавливать права доступа на уровне отдельных страниц, категорий и таксономий, включая назначение владельцев и редакторов.
3. Advanced Access Manager — детальный контроль доступа с возможностью назначать владельцев к контенту и ограничивать редактирование.
Эти плагины отлично подойдут для большинства сайтов, где нужно быстро и без кода настроить владельцев страниц с разными ролями.
Пример добавления поля владельца страницы и фильтрации доступа через код
Если нужен более тонкий контроль, можно добавить метаполе для выбора владельца страницы и ограничить доступ к редактированию через хук map_meta_cap.
Добавим метабокс для выбора владельца:
add_action('add_meta_boxes', 'wpsource_add_owner_metabox');
function wpsource_add_owner_metabox() {
add_meta_box('wpsource_owner', 'Владелец страницы', 'wpsource_owner_metabox_callback', 'page', 'side');
}
function wpsource_owner_metabox_callback($post) {
$users = get_users(['role__in' => ['author', 'editor', 'administrator']]);
$owner = get_post_meta($post->ID, '_wpsource_owner', true);
echo '<select name="wpsource_owner" style="width:100%">';
echo '<option value="">Не назначен</option>';
foreach ($users as $user) {
$selected = selected($owner, $user->ID, false);
echo "<option value=\"{$user->ID}\" $selected>{$user->display_name}</option>";
}
echo '</select>';
wp_nonce_field('wpsource_owner_save', 'wpsource_owner_nonce');
}Сохраним выбранного владельца при сохранении страницы:
add_action('save_post_page', 'wpsource_save_owner_meta');
function wpsource_save_owner_meta($post_id) {
if (!isset($_POST['wpsource_owner_nonce']) || !wp_verify_nonce($_POST['wpsource_owner_nonce'], 'wpsource_owner_save')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['wpsource_owner'])) {
update_post_meta($post_id, '_wpsource_owner', intval($_POST['wpsource_owner']));
}
}Теперь ограничим редактирование страниц только владельцам или администраторам:
add_filter('map_meta_cap', 'wpsource_restrict_page_edit', 10, 4);
function wpsource_restrict_page_edit($caps, $cap, $user_id, $args) {
if ($cap === 'edit_page' && !empty($args[0])) {
$post_id = $args[0];
$owner_id = get_post_meta($post_id, '_wpsource_owner', true);
if ($owner_id && $owner_id != $user_id) {
$user = get_userdata($user_id);
if (!in_array('administrator', $user->roles)) {
$caps[] = 'do_not_allow';
}
}
}
return $caps;
}Как отображать владельцев страниц в административной таблице
Чтобы удобно видеть владельцев страниц в списке страниц в админке, добавим новый столбец:
add_filter('manage_pages_columns', 'wpsource_add_owner_column');
function wpsource_add_owner_column($columns) {
$columns['wpsource_owner'] = 'Владелец';
return $columns;
}
add_action('manage_pages_custom_column', 'wpsource_show_owner_column', 10, 2);
function wpsource_show_owner_column($column, $post_id) {
if ($column === 'wpsource_owner') {
$owner_id = get_post_meta($post_id, '_wpsource_owner', true);
if ($owner_id) {
$user = get_userdata($owner_id);
echo esc_html($user ? $user->display_name : 'Не назначен');
} else {
echo 'Не назначен';
}
}
}Это позволит сразу видеть ответственных за каждую страницу и быстрее ориентироваться в контенте.
Рекомендации по использованию и расширению
Если сайт растет, имеет смысл автоматизировать назначение владельцев через интеграции, например, с плагином Expert Review для отзывов, где можно назначать редакторов по продуктам.
Для сложных проектов рекомендую рассмотреть PublishPress Permissions — он позволяет создать детальные правила доступа, включая владельцев страниц, категории и типы записей.
Для разработчиков полезно создавать собственные capability с префиксом wpsource_ и интегрировать их в административную логику, что повысит безопасность и гибкость управления.