Acceso a páginas específicas en wordpress para un usuario específico

2

Mi pregunta está relacionada con el control de acceso del usuario en wordpress

Tengo dos usuarios: admin (acceso de administrador) y user1 (editor). Mi requisito es que el administrador puede hacer cualquier modificación en el sitio de administración. Pero user1 solo puede editar y actualizar algunas páginas y no puede acceder a otros accesos, excepto las páginas asignadas.

¿No tengo idea de cómo implementar esta funcionalidad, por lo que se requiere su ayuda?

Mi entorno de trabajo:

  1. wordpress v 3.2.1
  2. El tema es veinte diez
pregunta w3uiguru 04.10.2011 - 11:33

3 respuestas

3

Pregunta muy interesante. Está un poco fuera del alcance de la funcionalidad típica de los rollos / capacidades, ya que es más detallado (a menos que esté equivocado, muy posible).

El primer paso sería poner un poco de manera que puedas asignar qué publicaciones puede editar un usuario.

Tiene más sentido mantener la página de perfil del usuario. Por lo tanto, puede enlazar a edit_user_profile , obtener todas las páginas del sitio y pegarlas en un cuadro de selección múltiple. Los comentarios del código deben explicar el paso a paso un poco. edit_user_profile solo aparece al editar los perfiles de otros usuarios.

<?php
add_action( 'edit_user_profile', 'wpse30211_user_profile' );
function wpse30211_user_profile( $user )
{
    // only show this on editor pages
    if( ! in_array( 'editor', $user->roles ) ) return;

    // get the pages.
    $pages = get_posts(
        array(
            'post_type'     => 'page',
            'numberposts'   => -1,
            'post_status'   => 'any',
        )
    );

    // Bail if we don't have pages.
    if( ! $pages ) return;

    // Which pages can our user edit?
    $allowed = get_user_meta( $user->ID, 'wpse30211_pages', true );
    if( ! is_array( $allowed ) || empty( $allowed ) ) $allowed = array();

    // nonce-i-fy things
    wp_nonce_field( 'wpse30211_nonce', 'wpse30211_nonce' );

    // section heading...
    echo '<h3>' . __( 'Grant this User permission to edit...' ) . '</h3>';
    echo '<select multiple="multiple" name="wpse30211[]">';
    echo '<option value="0">None</option>';
    foreach( $pages as $p )
    {
        // for use in checked() later...
        $selected = in_array( $p->ID, $allowed ) ? 'on' : 'off';
        echo '<option ' . selected( 'on', $selected, false ) . ' value="' . esc_attr( $p->ID ) . '">' . esc_html( $p->post_title ) . '</option>';
    }
    echo '</select>';
}

A continuación, debe guardar los datos adicionales que agregó al perfil de personas. Para hacer eso, te enganchas en edit_user_profile_update . Verifique el nonce configurado en la función anterior, luego verifique si el campo wpse30211 está configurado y guarde el material con update_user_meta .

<?php
add_action( 'edit_user_profile_update', 'wpse30211_user_save' );
function wpse30211_user_save( $user_id )
{
    // verify our nonce
    if( ! isset( $_POST['wpse30211_nonce'] ) || ! wp_verify_nonce( $_POST['wpse30211_nonce'], 'wpse30211_nonce' ) )
        return;

    // make sure our fields are set
    if( ! isset( $_POST['wpse30211'] ) ) 
        return;

    $save = array();
    foreach( $_POST['wpse30211'] as $p )
    {
        $save[] = $p;
    }
    update_user_meta( $user_id, 'wpse30211_pages', $save );
}

Ahora la parte divertida: no permitir el acceso a ciertas páginas. Para hacerlo, puedes enlazar a load-post.php , que se dispara cuando se carga wp-admin/post.php , la pantalla de edición posterior. Coge la ID de publicación que se está editando, verifica que sea una página. Luego, capture el usuario actual con wp_get_current_user y obtenga las páginas que pueden editar con get_user_meta . Si la ID de la publicación actual no está en el conjunto de páginas que pueden editar, llame a wp_die y elimine la página.

<?php
add_action( 'load-post.php', 'wpse30211_kill_edit' );
function wpse30211_kill_edit()
{
    $post_id = isset( $_REQUEST['post'] ) ? absint( $_REQUEST['post'] ) : 0;
    if( ! $post_id ) return;

    // bail if this isn't a page
    if( 'page' !== get_post_type( $post_id ) ) return;

    $user = wp_get_current_user();
    $allowed = get_user_meta( $user->ID, 'wpse30211_pages', true );
    if( ! is_array( $allowed ) || empty( $allowed ) ) $allowed = array();

    // if the user can't edit this page, stop the loading...
    if( ! in_array( $post_id, $allowed ) )
    {
        wp_die( 
            __( 'User cannot edit this page' ),
            __( "You can't edit this post" ),
            array( 'response' => 403 )
        );
    }
}

Finalmente, puedes enlazar con pre_update_post y evitar que la actualización del usuario no pueda editar la página.

<?php
add_action( 'pre_post_update', 'wpse30211_stop_update' );
function wpse30211_stop_update( $post_id )
{
    // not a page? bail.
    if( 'page' !== get_post_type( $post_id ) ) return;

    $user = wp_get_current_user();
    $allowed = get_user_meta( $user->ID, 'wpse30211_pages', true );
    if( ! is_array( $allowed ) || empty( $allowed ) ) $allowed = array();

    if( ! in_array( $post_id, $allowed ) ) 
    {
        wp_die( 
            __( 'User cannot edit this page' ),
            __( "You can't edit this post" ),
            array( 'response' => 403 )
        );
    }
}

Lo anterior funciona, pero sospecho que puede haber una manera de hacerlo un poco más fácil con el rol incorporado de WP & capacidades Aquí está todo como un complemento .

    
respondido por el chrisguitarguy 04.11.2011 - 05:46
2

Ok, vieja pregunta; pero la solución ya está en el núcleo de WP. A menos que también desee evitar que User1 lea páginas en las que no tiene privilegios de edición. En cuyo caso, necesitará un sistema de administración de roles / acceso, como el código de la respuesta aceptada o los complementos del directorio de complementos de wordpress .

Si solo desea evitar editar : User1 configurado como Autor (en lugar de Editor) solo podrá editar su propio contenido. Si usted (como Administrador) establece el Usuario1 como el "Autor" de la página o publicación que acaba de crear (generalmente en la parte inferior de la pantalla de Edición), el Usuario1 podrá editarlo. Puede crear páginas como administrador y establecer autor como "Usuario1", otorgándole al Usuario1 un acceso de edición a la página.

Por supuesto, como he dicho, esto es irrelevante si quieres ocultar totalmente las otras publicaciones / páginas del Usuario1.

    
respondido por el gloria 07.03.2013 - 23:51
1

Puede utilizar un complemento como Members de Justin Tadlock o Role Scoper plugin , con los que puede personalizar todas las capacidades para el administrador, así como los roles de editor (y cualquier otro rol). Incluso puedes definir tus propios roles con capacidades.

    
respondido por el George 04.10.2011 - 13:48

Lea otras preguntas en las etiquetas