web-dev-qa-db-fra.com

Accès à des pages spécifiques dans wordpress pour un utilisateur spécifique

Ma question concerne le contrôle d'accès des utilisateurs dans wordpress

J'ai deux utilisateurs - admin (accès admin) et user1 (éditeur). Mon exigence est que l'administrateur peut effectuer toute modification sur le site d'administration. Mais l'utilisateur1 ne peut éditer et mettre à jour que certaines pages et aucun accès autre que les pages attribuées.

Je ne sais pas comment implémenter cette fonctionnalité, votre aide est donc nécessaire.

Mon environnement de travail:

  1. wordpress v 3.2.1
  2. Le thème est vingt dix
2
w3uiguru

Question très intéressante. C'est un peu en dehors de la fonctionnalité typique des fonctions/rouleaux car elle est plus fine (à moins que je ne me trompe - très possible).

La première étape consisterait à définir une méthode permettant d'affecter les publications qu'un utilisateur peut modifier.

Il est plus logique de coller à la page de profil de l'utilisateur. Vous pouvez donc vous connecter à edit_user_profile, obtenir toutes les pages du site et les coller dans une zone de sélection multiple. Les commentaires de code devraient expliquer l'étape par étape un peu. edit_user_profile s'affiche uniquement lors de la modification des profils d'autres utilisateurs.

<?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>';
}

Ensuite, vous devez enregistrer les données supplémentaires que vous avez ajoutées au profil des personnes. Pour ce faire, vous vous connectez à edit_user_profile_update. Vérifiez le nonce défini dans la fonction ci-dessus, puis vérifiez si le champ wpse30211 est défini et enregistrez le contenu avec 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 );
}

Maintenant la partie amusante: interdire l'accès à certaines pages. Pour ce faire, vous pouvez vous connecter à load-post.php, qui se déclenche lorsque wp-admin/post.php, l’écran de post-édition, est chargé. Prenez le post id en cours de modification, assurez-vous que c'est une page. Ensuite, récupérez l'utilisateur actuel avec wp_get_current_user et obtenez les pages qu'il est autorisé à modifier avec get_user_meta. Si l'ID de la publication actuelle ne figure pas dans le tableau de pages qu'il est autorisé à modifier, appelez wp_die et supprimez la page.

<?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 )
        );
    }
}

Enfin, vous pouvez vous connecter à pre_update_post et empêcher que la mise à jour de l'utilisateur ne puisse pas modifier la page.

<?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 )
        );
    }
}

Ce qui précède fonctionne, mais je pense qu’il pourrait y avoir un moyen de le faire un peu plus facilement avec le rôle et les capacités intégrés de WP. Voici le tout sous forme de plugin .

3
chrisguitarguy

Ok, vieille question; mais la solution réside déjà dans le noyau WP. Sauf si vous souhaitez également empêcher l'utilisateur 1 de lire des pages, il ne dispose d'aucun privilège d'édition. Dans ce cas, vous aurez besoin d’un système de gestion des rôles/accès, tel que le code de la réponse acceptée ou les plugins du répertoire wordpress .

Si vous souhaitez uniquement empêcher modification : Utilisateur1 défini comme Auteur (au lieu de Editeur) ne pourra éditer que son propre contenu. Si vous (en tant qu'administrateur) définissez Utilisateur1 comme "Auteur" de la page ou du message que vous venez de créer (généralement au bas de l'écran Éditer), l'utilisateur 1 pourra le modifier. Vous pouvez créer des pages en tant qu'administrateur et définir l'auteur comme "Utilisateur1", en accordant à l'utilisateur1 un accès en édition à la page.

Bien sûr, comme je l'ai dit, cela n'a aucune importance si vous souhaitez masquer totalement les autres publications/pages de User1.

2
gloria

Vous pouvez utiliser un plugin tel que Members ou le plugin Role Scoper de Justin Tadlock , avec lesquels vous pouvez personnaliser toutes les fonctionnalités pour l'administrateur ainsi que les rôles d'éditeur (et tous autres rôles correspondants). matière). Vous pouvez même définir vos propres rôles avec des capacités.

1
user2015