Почему важно иметь владельца записи в WordPress и как это помогает управлять правами
В WordPress по умолчанию автор записи является её владельцем, однако зачастую требуется более гибкое управление — например, назначить другого пользователя владельцем записи без смены автора, или предоставить владельцу расширенные права редактирования и управления отдельными записями. Это особенно актуально для крупных сайтов с несколькими редакторами и сложной иерархией прав.
Добавление владельца записи помогает организовать рабочие процессы: владелец может отвечать за содержание, редактирование и публикацию конкретного контента, а администратор — за техническую часть и общие настройки.
Кроме того, разграничение прав владельцев позволяет повысить безопасность сайта, ограничив доступы и предотвращая случайное удаление или изменение чужого контента.
Как реализовать добавление владельца записи через пользовательское поле и мета-данные
Самый простой способ — добавить пользовательское поле, где будет храниться ID владельца записи. Для этого можно воспользоваться стандартным мета-полем записи.
Пример функции для сохранения владельца записи в мета-поле:
function wpwebsite_save_owner_meta($post_id) {
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (!current_user_can('edit_post', $post_id)) return;
if (isset($_POST['wpwebsite_owner_user'])) {
update_post_meta($post_id, '_wpwebsite_owner_user', intval($_POST['wpwebsite_owner_user']));
}
}
add_action('save_post', 'wpwebsite_save_owner_meta');И добавим поле на страницу редактирования записи:
function wpwebsite_add_owner_meta_box() {
add_meta_box('wpwebsite_owner_meta', 'Владелец записи', 'wpwebsite_owner_meta_box_callback', 'post', 'side');
}
add_action('add_meta_boxes', 'wpwebsite_add_owner_meta_box');
function wpwebsite_owner_meta_box_callback($post) {
$current_owner = get_post_meta($post->ID, '_wpwebsite_owner_user', true);
$users = get_users(['who' => 'authors']);
echo '<select name="wpwebsite_owner_user">';
echo '<option value="">-- Выберите владельца --</option>';
foreach ($users as $user) {
$selected = selected($current_owner, $user->ID, false);
echo "<option value=\"{$user->ID}\" $selected>{$user->display_name}</option>";
}
echo '</select>';
}Этот код создаёт выпадающий список авторов на странице редактирования записи, позволяя выбрать владельца. При сохранении запись будет связана с выбранным пользователем.
Как настроить права доступа владельца записи: ограничение редактирования и управления
Теперь важно сделать так, чтобы владелец записи имел права на её редактирование, даже если он не автор записи. Для этого можно использовать фильтр map_meta_cap и добавить проверку владельца записи.
Пример кода:
function wpwebsite_map_meta_cap($caps, $cap, $user_id, $args) {
if (in_array($cap, ['edit_post', 'delete_post', 'read_post']) && !empty($args[0])) {
$post = get_post($args[0]);
if ($post) {
$owner_id = get_post_meta($post->ID, '_wpwebsite_owner_user', true);
if ($owner_id && intval($owner_id) === intval($user_id)) {
// Владелец записи получает все права для этой записи
$caps = [];
}
}
}
return $caps;
}
add_filter('map_meta_cap', 'wpwebsite_map_meta_cap', 10, 4);Таким образом, пользователь, указанный как владелец записи, будет иметь полные права редактирования и удаления этой записи, даже если он не является её автором.
Примеры плагинов для управления владельцами записей и правами доступа
Если вы предпочитаете готовые решения, обратите внимание на следующие плагины:
- Clearfy Pro — мощный плагин для оптимизации и кастомизации WordPress, с возможностью гибко управлять ролями и правами пользователей.
- Expert Review — плагин для организации экспертных обзоров, где важна роль владельцев и кураторов контента.
- WPCommunity — плагин для создания сообществ с расширенной системой ролей и прав, включая назначение владельцев контента.
Как использовать добавление владельца записи для кастомных типов записей
Подход с пользовательским полем и фильтром map_meta_cap отлично работает не только для стандартных записей, но и для любых кастомных типов записей (CPT). Просто замените 'post' на ваш CPT в функции добавления мета-бокса:
function wpwebsite_add_owner_meta_box() {
add_meta_box('wpwebsite_owner_meta', 'Владелец записи', 'wpwebsite_owner_meta_box_callback', 'your_custom_post_type', 'side');
}
add_action('add_meta_boxes', 'wpwebsite_add_owner_meta_box');Также убедитесь, что права пользователя правильно настроены для CPT, чтобы фильтр map_meta_cap сработал корректно для операций редактирования и удаления.
Советы по безопасности и производительности
При реализации собственного механизма владельцев записей важно:
- Проверять права пользователя при сохранении мета-данных, чтобы избежать несанкционированных изменений.
- Кэшировать данные владельца записи, если сайт большой и запросы к базе частые, чтобы снизить нагрузку.
- Тестировать взаимодействие с другими плагинами, особенно с плагинами безопасности и управления ролями, чтобы избежать конфликтов.
Также рекомендуем регулярно делать бэкапы перед внедрением подобных изменений.