Как отображать контент для конкретного пользователя?
У меня есть сайт, который отображает контент только для зарегистрированных пользователей. Большая часть контента доступна всем пользователям, но некоторые материалы являются уникальными для каждого (т.е. у всех есть эта страница, но каждый видит только свой контент, который никто другой не может увидеть). Есть идеи, как я могу ограничить (и отображать) определенный контент для конкретного пользователя?

Я написал нечто подобное некоторое время назад и помню, что хотел загрузить это в репозиторий плагинов, но так и не нашел времени. По сути, он добавляет метабокс на экран редактирования записи или страницы, позволяя пользователю выбирать конкретных пользователей по имени или ролям, а затем проверяет с помощью фильтра the_content
. Итак, вот он:
Обновление:
Плагин только что был одобрен и добавлен в репозиторий WordPress, так что вы можете скачать его Контент для определенных пользователей оттуда или из вашей админ-панели, а также я немного написал о нем здесь.
<?php
/*
Plugin Name: Контент для определенных пользователей
Plugin URI: http://ru.bainternet.info
Description: Этот плагин позволяет вам выбирать конкретных пользователей по имени или роли, которые могут видеть содержимое определенной записи или страницы.
Version: 0.1
Author: Bainternet
Author URI: http://ru.bainternet.info
*/
/* Добавляем кастомный метабокс */
add_action('add_meta_boxes', 'User_specific_content_box');
/* Добавляем бокс в основную колонку на экранах редактирования записей */
function User_specific_content_box() {
add_meta_box('User_specific_content', __( 'Блок контента для пользователей'),'User_specific_content_box_inner','post');
add_meta_box('User_specific_content', __( 'Блок контента для пользователей'),'User_specific_content_box_inner','page');
}
/* Выводим содержимое метабокса */
function User_specific_content_box_inner() {
global $post,$wp_roles;
$savedroles = get_post_meta($post->ID, 'U_S_C_roles',true);
//var_dump($savedroles);
$savedusers = get_post_meta($post->ID, 'U_S_C_users',true);
//var_dump($savedusers);
// Используем nonce для проверки
wp_nonce_field( plugin_basename(__FILE__), 'User_specific_content_box_inner' );
echo __('Выберите пользователей, которым будет показан этот контент');
echo '<h4>'.__('По роли пользователя:').'</h4>';
if ( !isset( $wp_roles ) )
$wp_roles = new WP_Roles();
foreach ( $wp_roles->role_names as $role => $name ) {
echo '<input type="checkbox" name="U_S_C_roles[]" value="'.$name.'"';
if (in_array($name,$savedroles)){
echo ' checked';
}
echo '>'.$name.' ';
}
echo '<h4>'.__('По имени пользователя:').'</h4>';
$blogusers = get_users('blog_id=1&orderby=nicename');
$usercount = 0;
foreach ($blogusers as $user) {
echo '<input type="checkbox" name="U_S_C_users[]" value="'.$user->ID.'"';
if (in_array($user->ID,$savedusers)){
echo ' checked';
}
echo '>'.$user->display_name.' ';
$usercount = $usercount + 1;
if ($usercount > 5){
echo '<br/>';
$usercount = 0;
}
}
echo '<h4>'.__('Сообщение о блокировке контента:').'</h4>';
echo '<textarea rows="3" cols="70" name="U_S_C_message" id="U_S_C_message">'.get_post_meta($post->ID, 'U_S_C_message',true).'</textarea><br/>'.__('Это сообщение будет показано всем, кто не входит в список выше.');
}
/* Сохраняем данные метабокса */
add_action('save_post', 'User_specific_content_box_inner_save');
/* При сохранении записи сохраняем наши кастомные данные */
function User_specific_content_box_inner_save( $post_id ) {
global $post;
// Проверяем, что запрос пришел с нашего экрана и с правильной авторизацией,
// так как save_post может вызываться в других случаях
if ( !wp_verify_nonce( $_POST['User_specific_content_box_inner'], plugin_basename(__FILE__) ) )
return $post_id;
// Проверяем, не является ли это автосохранением.
// Если это так, наша форма не была отправлена, поэтому ничего не делаем
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
return $post_id;
// OK, проверка пройдена: сохраняем данные
$savedroles = get_post_meta($post_id, 'U_S_C_roles',true);
$savedusers = get_post_meta($post_id, 'U_S_C_users',true);
if (isset($_POST['U_S_C_roles']) && !empty($_POST['U_S_C_roles'] )){
foreach ($_POST['U_S_C_roles'] as $role){
$new_roles[] = $role;
}
update_post_meta($post_id, 'U_S_C_roles', $new_roles);
}else{
if (count($savedroles) > 0){
delete_post_meta($post_id, 'U_S_C_roles');
}
}
if (isset($_POST['U_S_C_users']) && !empty($_POST['U_S_C_users'])){
foreach ($_POST['U_S_C_users'] as $u){
$new_users[] = $u;
}
update_post_meta($post_id, 'U_S_C_users', $new_users);
}else{
if (count($savedusers) > 0){
delete_post_meta($post_id, 'U_S_C_users');
}
}
if (isset($_POST['U_S_C_message'])){
update_post_meta($post_id,'U_S_C_message', $_POST['U_S_C_message']);
}
}
add_filter('the_content','User_specific_content_filter');
function User_specific_content_filter($content){
global $post,$current_user;
$savedroles = get_post_meta($post->ID, 'U_S_C_roles',true);
$run_check = 0;
$savedusers = get_post_meta($post->ID, 'U_S_C_users',true);
if (!count($savedusers) > 0 && !count($savedroles) > 0 )
return $content;
if (isset($savedroles) && !empty($savedroles)){
foreach ($savedroles as $role){
if (current_user_can($role)) {
return $content;
exit;
}
}
// Проверка по ролям не пройдена
$run_check = 1;
}
if (isset($savedusers) && !empty($savedusers)){
get_currentuserinfo();
if (in_array($current_user->ID,$savedusers)){
return $content;
}
// Обе проверки не пройдены
return get_post_meta($post->ID, 'U_S_C_message',true);
}
return $content;
}
?>

Предположим, что этот контент является стандартным циклом записей:
$current_user = wp_get_current_user();
if(get_the_author_meta('ID') === $current_user->ID):
// показать контент
endif;
Я думаю, это работает только внутри цикла.
Если вам нужно использовать это вне цикла, просто запросите записи по $current_user->ID
:
$query = new WP_Query('author' => $current_user->ID);

единственная проблема здесь в том, что установка 'разрешений' для каждой записи не очень интуитивно понятна для владельца сайта

тогда попробуйте плагин "Members": http://justintadlock.com/archives/2009/09/17/members-wordpress-plugin он гораздо более удобен для пользователя...

я думал об этом плагине, только видел, что его давно не обновляли. есть идеи, работает ли он еще?

В дополнение к тому, что написал One Trick Pony, если владельцу сайта нужна возможность ограничивать доступ к контенту для каждого пользователя, можно разработать небольшой пользовательский метабокс, который будет отображаться внутри каждой записи и содержать флажки с пользователями сайта. Затем в базе данных будут сохраняться необходимые post_meta с информацией о пользователях, имеющих разрешение на доступ к контенту, и можно будет реализовать соответствующее условие.
Если вам нужен другой способ контроля контента, лучше предоставить более конкретные детали о том, как это должно работать и какие требования есть, чтобы было проще подобрать подходящие решения...
Удачи :)

1-й подход:
- Один из способов — создать отдельную страницу для каждого студента и защитить её паролем. Этот пароль можно передать студенту.
- Вы можете разрешить комментарии к этой Странице/Записи, чтобы студенты могли оставлять свои вопросы и получать ответы.
2-й подход:
- Вы можете использовать плагин WP Private Content Plus (https://wordpress.org/plugins/wp-private-content-plus/), чтобы сделать каждую страницу/запись видимой только для определённых пользователей.
- Вы можете создать любое меню пользователя в админке.
Вы также можете комбинировать 2-й подход с 1-м для дополнительной безопасности, хотя это и необязательно.
