- Вопрос или проблема
- 1. Скрыть содержимое
- 2. Перенаправить страницу
- Ответ или решение
- Шаг 1: Создание пользовательского типа записи (CPT)
- Шаг 2: Поддержка метаданных постов
- Шаг 3: Ограничение доступа к постам
- Вариант 1: Скрыть контент поста
- Вариант 2: Перенаправление на другую страницу
- Шаг 4: Настройка прав доступа
- Заключение
Вопрос или проблема
1 – У меня есть CPT с 10 записями.
2 – У меня 10 пользователей
Вопрос: Как я могу назначить одну запись из моего CPT уникальному пользователю?
-> Каждый пользователь должен видеть только свою назначенную запись
(Каждая запись будет назначена администратором сайта)
Спасибо
Как упомянул Гаэль, в WordPress нет встроенной функциональности для этого, но это не слишком сложно реализовать.
update_post_meta( $post_id, 'post_subscriber', $user_id );
Сначала я бы создал мета-данные записи, которые идентифицируют пользователя, который должен иметь доступ. Вы, вероятно, захотите настроить это с помощью Мета-боксов на индивидуальных страницах или с использованием Settings API. Если у вас есть несколько пользователей, которым нужно иметь доступ к одной и той же странице, вы можете настроить это как пользовательские мета-данные, что немного изменит приведенный ниже код.
Поскольку мы делаем так, что 1 пользователь получает доступ к 1 странице, мета-данные записи должны работать нормально.
Далее, вам нужно определить, хотите ли вы скрыть содержимое страницы или притвориться, что страница вообще не существует. Выберите один из этих двух вариантов, не оба.
1. Скрыть содержимое
Мы отфильтруем содержимое страницы, оставив все остальное доступным (например, заголовок, изображение записи и т.д. Вы можете заменить содержимое сообщением, информирующим посетителя о том, что ему не разрешено видеть это содержимое, “Нет!” Хорошая практика – включить форму входа вместе с вашим сообщением на случай, если пользователь просто забыл войти заранее.
function my_filter_content( $content ) {
global $post;
if ( empty( $post ) || ! is_page() ) {
return $content;
}
$post_subscriber_id = get_post_meta( $post->ID, 'post_subscriber', true );
if ( ! $post_subscriber_id ) {
return $content;
}
$user = wp_get_current_user();
if ( $user->ID === $post_subscriber_id || user_can( $user->ID, 'administrator' ) ) {
return $content;
} else {
// Сообщение о том, что доступ ограничен.
return 'Нет!';
}
}
add_filter( 'the_content', 'my_filter_content', 11 );
2. Перенаправить страницу
Вместо того чтобы позволять любому видеть содержание для неавторизованных пользователей или публичных, это действие перенаправляет неавторизованных пользователей на совершенно отдельную страницу, где им сообщают, что они попытались случайно получить доступ к чему-либо. Обычно полезно включить форму входа на этой странице, если у пользователя есть доступ, но он забыл войти.
function my_page_template_redirect() {
// Условия для целевой проверки правильного типа содержимого.
if ( is_page() ) {
global $post;
$post_subscriber_id = get_post_meta( $post->ID, 'post_subscriber', true );
// Теперь мы знаем, что эта страница имеет ограниченное содержание.
if ( $post_subscriber_id ) {
// Проверяем, что пользователь вошел в систему.
if ( is_user_logged_in() ) {
$user = wp_get_current_user();
// Проверяем, что пользователю разрешен доступ.
if ( $user->ID === $post_subscriber_id || user_can( $user->ID, 'administrator' ) ) {
return;
}
}
// Перенаправляем пользователя на страницу, объясняющую, почему он не может видеть содержимое.
wp_safe_redirect( home_url( '/access-denied/' ) );
die;
}
}
}
add_action( 'template_redirect', 'my_page_template_redirect' );
Я хочу, чтобы администратор назначал запись пользователю. С этим каждый пользователь может читать только свою назначенную запись.
Это не функциональность WP.
Вам нужно будет использовать или создать плагин для достижения этого.
Я решил проблему следующим образом:
- Сначала вы должны добавить ‘author’ в ваш register_post_type, например
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'author' ),
-
Затем вы можете назначить индивидуальную запись пользователю через кнопку быстрого редактирования под Автором
-
добавьте следующее к вашему register_post_type:
'capabilities' => array(
// Мета возможности.
'edit_post' => 'edit_staff',
'read_post' => 'read_staff',
'delete_post' => 'delete_staff',
// Примитивные возможности, используемые вне map_meta_cap():
'edit_posts' => 'edit_staffs',
'edit_others_posts' => 'edit_others_staff',
'delete_posts' => 'delete_staffs',
'publish_posts' => 'publish_staff',
'read_private_posts' => 'read_private_staff',
// Примитивные возможности, используемые внутри map_meta_cap():
'read' => 'read_staff',
'delete_private_posts' => 'delete_private_staff',
'delete_published_posts' => 'delete_published_staff',
'delete_others_posts' => 'delete_others_staff',
'edit_private_posts' => 'edit_private_staff',
'edit_published_posts' => 'edit_published_staff'
),
'map_meta_cap' => true
- Используйте плагин, такой как https://wordpress.org/plugins/members/, чтобы ограничить доступ к этим записям, проверяя указанные выше “возможности”
В зависимости от того, что вы проверяете, пользователь сможет видеть только свои записи
Ответ или решение
Чтобы назначить пост из пользовательского типа записи (CPT) конкретному пользователю и ограничить доступ к этому посту только для назначенного пользователя, необходимо выполнить несколько шагов в WordPress. Ниже представлено подробное руководство, которое поможет вам реализовать эту задачу.
Шаг 1: Создание пользовательского типа записи (CPT)
Сначала убедитесь, что у вас создан пользовательский тип записи. При регистрации CPT добавьте поддержку автора, чтобы администратор мог назначать посты определенным пользователям:
function create_custom_post_type() {
register_post_type('my_custom_post', array(
'labels' => array(/* ваши метки для CPT */),
'public' => true,
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'author'),
'capabilities' => array(
'edit_post' => 'edit_staff',
'read_post' => 'read_staff',
'delete_post' => 'delete_staff',
'edit_posts' => 'edit_staffs',
'edit_others_posts' => 'edit_others_staff',
'delete_posts' => 'delete_staffs',
'publish_posts' => 'publish_staff',
'read_private_posts' => 'read_private_staff',
'read' => 'read_staff',
'map_meta_cap' => true,
)
));
}
add_action('init', 'create_custom_post_type');
Шаг 2: Поддержка метаданных постов
Для того чтобы назначить конкретному посту конкретного пользователя, используйте метаданные постов. Это можно сделать с помощью функции update_post_meta
. Например:
update_post_meta($post_id, 'assigned_user', $user_id);
Где $post_id
— это ID поста, а $user_id
— ID пользователя, которому будет назначен пост.
Шаг 3: Ограничение доступа к постам
Теперь необходимо ограничить доступ к постам на основе метаданных. Для этого можно использовать фильтрацию контента или перенаправления в зависимости от того, какое поведение вы хотите реализовать.
Вариант 1: Скрыть контент поста
Используйте следующий код, чтобы скрыть содержание поста для пользователей, не имеющих доступа:
function restrict_post_content($content) {
global $post;
// Получаем ID назначенного пользователя
$assigned_user_id = get_post_meta($post->ID, 'assigned_user', true);
// Проверяем, имеет ли текущий пользователь доступ
if (!is_user_logged_in() || $assigned_user_id != get_current_user_id()) {
return 'У вас нет доступа к этому контенту.';
}
return $content; // Пользователь имеет доступ, возвращаем оригинальный контент
}
add_filter('the_content', 'restrict_post_content');
Вариант 2: Перенаправление на другую страницу
Если вы хотите перенаправить пользователей, не имеющих доступа, используйте следующий код:
function redirect_unauthorized_users() {
if (is_singular('my_custom_post')) {
global $post;
$assigned_user_id = get_post_meta($post->ID, 'assigned_user', true);
if (!is_user_logged_in() || $assigned_user_id != get_current_user_id()) {
wp_safe_redirect(home_url('/access-denied/'));
exit;
}
}
}
add_action('template_redirect', 'redirect_unauthorized_users');
Шаг 4: Настройка прав доступа
Используйте плагин, такой как Members, для управления правами пользователей и настройки их доступа к созданным вами способностям. В этом плагине можно легко настраивать роли и разрешения, что упростит задачу контроля доступа.
Заключение
Следуя предложенным шагам, вы сможете назначить пост из CPT конкретному пользователю и ограничить доступ к нему для остальных. Это не только улучшит управляемость контентом, но и повысит уровень безопасности вашей платформы. Убедитесь, что вы протестировали все изменения в безопасной среде, прежде чем внедрять их на живом сайте.