web-dev-qa-db-fra.com

Restreindre l'accès à une page en backend

Comment puis-je limiter la modification d'une page du backend à un utilisateur spécifique?

J'ai essayé quelques plugins mais je pensais que le faire sans plugins serait la voie à suivre pour moi.

Quelles mesures puis-je prendre pour résoudre ce problème?

3
Sankalp Mishra

Cela peut être fait en deux étapes. Tout d’abord, ajoutez un crochet à la page /wp-admin/edit.php?post_type=page pour empêcher la page souhaitée d’apparaître pour les autres utilisateurs. Et un autre point d'ancrage pour rediriger les utilisateurs non autorisés d'essayer d'accéder directement à la page /wp-admin/post.php?post=ID&action=edit.

Ici, le type de message est page, mais vous pouvez le remplacer par un autre. Faites les ajustements indiqués dans les commentaires:

/**
 * Adjust the following:
 * post_type
 * User ID
 * Post ID
 */

add_action( 'load-edit.php', 'load_custom_filter_wpse_94387' );
add_action( 'load-post.php', 'block_page_access_wpse_94387' );

/**
 * Executed only in /wp-admin/edit.php
 *
 * Checks current post type and bail if not correct
 */
function load_custom_filter_wpse_94387()
{
    global $typenow;

    // Not the correct post type, do nothing
    if( 'page' != $typenow ) // <--- adjust
        return;

    add_filter( 'posts_where' , 'posts_where_wpse_94387' );
}

/**
 * If not authorized user, remove page from listing
 */
function posts_where_wpse_94387( $where ) 
{
    $current_user = wp_get_current_user();

    if ( 2 == $current_user->ID ) // <--- adjust
        return $where;

    $where .= ' AND ID != 119'; // <--- adjust
    return $where;
}

/**
 * Check if unauthorized user is trying to access restricted page
 */
function block_page_access_wpse_94387()
{
    // Check for post=119, if it is not this one, do nothing
    if( !isset( $_GET['post'] ) || '119' != $_GET['post'] ) // <--- adjust
        return;

    // Check for user, if allowed user, do nothing
    $current_user = wp_get_current_user();  
    if ( 2 == $current_user->ID ) // <--- adjust
        return;

    // Invalid attempt to edit the page, redirect
    wp_redirect( admin_url( 'edit.php?post_type=page' ) );
    exit();
}

Questions-réponses pertinentes:
- Où mettre mon code: plugin ou functions.php?
- Mettre à jour le décompte des publications (publié, brouillon, non attaché) dans l'interface d'administration

2
brasofilo