Как отображать контент для конкретного пользователя?

11 апр. 2011 г., 00:17:04
Просмотры: 13.7K
Голосов: 3

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

1
Комментарии

какое у вас было решение? я ищу что-то похожее. В моем случае за защищенным сайтом проверенный пользователь должен использовать многостраничную форму, которая собирает всю необходимую информацию, и после того как все данные собраны, информация отправляется администратору

alex alex
9 сент. 2014 г. 07:50:11
Все ответы на вопрос 4
3

Я написал нечто подобное некоторое время назад и помню, что хотел загрузить это в репозиторий плагинов, но так и не нашел времени. По сути, он добавляет метабокс на экран редактирования записи или страницы, позволяя пользователю выбирать конкретных пользователей по имени или ролям, а затем проверяет с помощью фильтра 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;
}
?>
11 апр. 2011 г. 04:47:55
Комментарии

Это именно то, что я искал! Просто хотел выразить огромную благодарность, чувак!

Cris Cris
30 дек. 2011 г. 12:47:42

@Bainternet Пользователь только что заявил, что твой плагин больше не работает :)

kaiser kaiser
3 янв. 2015 г. 01:02:28

@kaiser что я могу сказать??

Bainternet Bainternet
7 янв. 2015 г. 09:30:45
4

Предположим, что этот контент является стандартным циклом записей:

$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);
11 апр. 2011 г. 00:42:12
Комментарии

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

hannit cohen hannit cohen
11 апр. 2011 г. 00:46:29

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

onetrickpony onetrickpony
11 апр. 2011 г. 00:48:52

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

hannit cohen hannit cohen
11 апр. 2011 г. 01:34:06

при включенном wp_debug выводит несколько уведомлений, но работает. Я использую его для управления ролями и правами

onetrickpony onetrickpony
11 апр. 2011 г. 03:14:25
0

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

Если вам нужен другой способ контроля контента, лучше предоставить более конкретные детали о том, как это должно работать и какие требования есть, чтобы было проще подобрать подходящие решения...

Удачи :)

11 апр. 2011 г. 01:31:09
0

1-й подход:

  1. Один из способов — создать отдельную страницу для каждого студента и защитить её паролем. Этот пароль можно передать студенту.
  2. Вы можете разрешить комментарии к этой Странице/Записи, чтобы студенты могли оставлять свои вопросы и получать ответы.

2-й подход:

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

Вы также можете комбинировать 2-й подход с 1-м для дополнительной безопасности, хотя это и необязательно.

30 июн. 2016 г. 08:42:40