Есть ли способ (плагин?) ограничить пользователя возможностью редактировать только одну страницу?

13 сент. 2010 г., 13:32:20
Просмотры: 17K
Голосов: 9

Мы используем WordPress как CMS и хотели бы дать пользователям возможность иметь "домашнюю страницу". В идеале их нужно ограничить от возможности испортить весь сайт.

Есть ли простой способ ограничить права пользователей на редактирование только одной страницы?

Сейчас я использую плагин Members для других задач, связанных с правами, поэтому было бы здорово, если решение могло бы дополнить его или полностью заменить.

Дополнительный плюс - автоматическое создание домашней страницы при создании нового пользователя.


ОБНОВЛЕНИЯ: Нужно уточнить, что эти страницы должны быть ограничены определенным разделом сайта (т.е. все дочерние страницы одного родителя). Также, после общения с пользователями выяснилось, что им было бы полезно создавать подстраницы, отходящие от их домашней страницы.

0
Все ответы на вопрос 8
0

Базовая установка WordPress, скорее всего, не будет соответствовать вашим требованиям. Вы можете настроить мультисайтовую инсталляцию, позволяя пользователям создавать свои собственные подсайты, либо использовать такие решения, как BuddyPress или Mingle, которые предоставляют функционал пользовательских профилей.

15 сент. 2010 г. 00:15:18
2

Извините за это, но я наткнулся на ответ на форумах WordPress.

Оказывается, Role Scoper отлично справляется с этой задачей. Автор того поста на форуме выразился лучше всего:

Чтобы разрешить пользователю редактировать одну конкретную страницу, но ничего больше:

  1. Назначьте ему роль Подписчика в WordPress
  2. Управление > Страницы > Редактирование их страницы
  3. Разверните вкладку "Редакторы" в разделе "Дополнительные параметры"
  4. Установите флажок без скобок слева от имени вашего пользователя (если будут создаваться дочерние страницы, также установите флажок со скобками {[]}, который назначает роль для всех текущих или будущих дочерних страниц)
  5. Сохраните страницу
29 янв. 2011 г. 14:18:30
Комментарии

Звучит как ручной процесс. А что, если у вас тысячи пользователей?

MikeSchinkel MikeSchinkel
29 янв. 2011 г. 22:16:12

Это безусловно так, но это самое близкое решение на данный момент. Я оставлю награду открытой вплоть до самого конца.

Tom Wright Tom Wright
30 янв. 2011 г. 13:59:26
3

Я столкнулся с такой же ситуацией, как и вы, и решил её созданием пользовательского типа записи с названием "Главная страница". Также я разработал плагин "Bainternet Posts Creation Limits" для ограничения количества создаваемых записей каждого типа для одного пользователя.

Попробуйте его: http://wordpress.org/extend/plugins/bainternet-posts-creation-limits/

29 янв. 2011 г. 13:59:20
Комментарии

Хороший простой подход. Небольшая проблема с тем, что это основано на записях - я также хочу ограничить, где находится страница.

Tom Wright Tom Wright
30 янв. 2011 г. 14:04:16

ограничить, где находится страница? Не объясните подробнее?

Bainternet Bainternet
30 янв. 2011 г. 16:05:18

Проблема здесь в том, что я хочу, чтобы все пользовательские страницы находились в одном месте. Например, mysite.com/users/bob Кроме того, я также хочу разрешить подстраницы в том же стиле: mysite.com/users/bob/mysubpage

Tom Wright Tom Wright
1 февр. 2011 г. 17:14:25
0

Плагин User Access Manager сделает это за вас, все остальные подходы слишком сложны. UAM прост в использовании: создайте группы и назначьте группу для ваших подстраниц — готово.

2 авг. 2012 г. 23:46:59
0

Я бы использовал Capability Manager или проверил роли и возможности в кодексе, чтобы сделать это.

14 сент. 2010 г. 01:18:31
0

Это решение подразумевает, что вы отключили редактирование "обычных" типов записей (post, page).

Это не так сложно, как может показаться. Ключевым моментом является логин пользователя. То же самое можно сделать с таксономиями или даже терминами.

Смотрите следующий пример (включая пример запроса):

// 1. Создаем тип записи для этого пользователя с его 
//   логином и соответствующими возможностями 
function create_user_home() {
    global $current_user;
    get_currentuserinfo();

    register_post_type(
        'home_of_'.$current_user->user_login,
        array(
            'public' => true,
            'capability_type' => $current_user->user_login,
            'capabilities' => array(
                'publish_posts' => 'publish_'.$current_user->user_login,
                'edit_posts' => 'edit_'.$current_user->user_login,
                'edit_others_posts' => 'edit_'.$current_user->user_login,
                'delete_posts' => 'delete_'.$current_user->user_login,
                'delete_others_posts' => 'delete_others_'.$current_user->user_login,
                'read_private_posts' => 'read_private_'.$current_user->user_login,
                'edit_post' => 'edit_'.$current_user->user_login,
                'delete_post' => 'delete_'.$current_user->user_login,
                'read_post' => 'read_'.$current_user->user_login,
            ),
        )
    );
}
add_action( 'init', 'create_user_home' );

// Запрос можно выполнить так:
wp_reset_query(); // для надежности

global $wp_query, $current_user;
get_currentuserinfo();

$query_user_home = new WP_Query( array(
    ,'order'        => 'ASC'
    ,'post_type'    => 'home_of_'.$current_user->user_login
    ,'post_status'  => 'publish'
) );

if ( $query_user_home->have_posts() ) :
    while ( $query_user_home->have_posts() ) : $query_user_home->the_post();
        // проверка пароля
        if ( post_password_required() ) :
            the_content();
        elseif ( !current_user_can('') ) :
            // здесь можно вывести сообщение
            return;
        else :

            // ваш контент

        endif;
    endwhile;

else : // если нет записей
    printf(__( 'Пока ничего от г-на/г-жи %1$s.', TEXTDOMAIN ), $current_user->user_firstname.' '.$current_user->user_lastname);
endif; // завершение have_posts();

wp_rewind_posts(); // для следующего запроса

С таксономиями это имело бы еще больше смысла, так как можно было бы запрашивать только записи, помеченные терминами из таксономий этого пользователя, но для этого потребовался бы метабокс с терминами таксономий пользователя. Условием было бы то же самое: логин пользователя, и вы просто добавили бы таксономию:

function create_user_tax() {
    if ( current_user_can("$current_user->user_login") ) :
        global $current_user;
        get_currentuserinfo();

        $singular = $current_user->user_login;
        $plural = $singular.'\'s';

        // метки
        $labels = array (
                 'name'         => $plural
                ,'singular_name'=> $singular
            );

        // аргументы
        $args = array (
             'public'               => true
            ,'show_in_nav_menus'    => true
            ,'show_ui'              => true
            ,'query_var'            => true
            ,'labels'               => $labels
            ,'capabilities' => array(
                'manage_'.$current_user->user_login
            )
        );

        // Регистрация
        register_taxonomy ( 
             $current_user->user_login
            ,array ( 'post', 'page' )
            ,$args
        ); 
        // Добавление к типу записи
        // можно добавить и текущий тип записи пользователя
        register_taxonomy_for_object_type (
             $current_user->user_login
             ,array ( 'post', 'page', 'home_of_'.$current_user->user_login ) 
        );
    endif;
}
add_action( 'init', 'create_user_tax' );

Проверку возможностей (current_user_can) можно разместить и в другом месте. Все зависит от ваших конкретных потребностей. Просто для ясности: это примеры, которые помогут вам найти решение. Надеюсь, это поможет :)

4 февр. 2011 г. 02:59:25
0

Я реализовал нечто подобное с "участниками" — пользовательским типом записей и ручным назначением авторских прав конкретному участнику, так как это сайт для небольшой группы. Однако я помню, что в одной из веток поддержки BuddyPress читал о возможности подключения к процессу регистрации. Думаю, можно автоматически создавать страницу или пользовательский тип записи для каждого нового пользователя при регистрации и назначать эту страницу в качестве домашней для нового участника. Я также добавил фронтенд-редактор Scribu и заблокировал доступ к админке для участников, не являющихся администраторами. Вероятно, можно также добавить редирект после регистрации, чтобы новые участники перенаправлялись на свою страницу (которая, предположительно, может содержать контент по умолчанию).

Попробую найти ту ветку поддержки BuddyPress.

Дополнение — в селекторе автора на экране редактирования записи есть баг. В данный момент он не использует стандартную систему прав, что может усложнить реализацию решения для участников (хотя, вероятно, всё будет работать, если автор назначается при создании страницы). В Trac есть патч, но, кажется, он ещё не включён в ядро.

31 янв. 2011 г. 08:32:19
0

Это возможно с помощью плагина s2member, бесплатной версии достаточно. Я создал клиентскую зону, где у каждого клиента есть своя URL-ссылка.

Здесь есть видеоурок: http://www.primothemes.com/forums/viewtopic.php?f=4&t=586&start=0&hilit=client+area

1 февр. 2011 г. 11:50:44