web-dev-qa-db-fra.com

Limiter l'accès au tableau de bord pour des rôles d'utilisateur spécifiques à des actions spécifiques

J'ai un script qui permet à un utilisateur connecté (rôle Auteur) de supprimer ses propres publications à l'aide de get_delete_post_link(). Cependant, je souhaite également pouvoir limiter l'accès de l'auteur au tableau de bord. Toute tentative en ce sens en utilisant un plugin (Theme my Login, par exemple) ou un script simple comme ceux liés ci-dessous désactive ma capacité à utiliser get_delete_post_link(). Existe-t-il un moyen de restreindre l'accès au tableau de bord pour le rôle d'utilisateur "Auteur" tout en permettant la suppression de publications via get_delete_post_link()?

http://www.tutorialstag.com/restrict-wordpress-dashboard-access.html

Comment limiter l'accès au tableau de bord aux administrateurs uniquement?

2
laurayeffeth

C'est comme ça que j'ai fini par résoudre ce problème. A l'origine, j'ai utilisé ce code pour le lien afin de supprimer un message individuel:

<?php if( !(get_post_status() == 'trash') ) : ?>
<a class="delete-post" onclick="return confirm('Are you sure you wish to delete post: <?php echo get_the_title() ?>?')"href="<?php echo get_delete_post_link( get_the_ID() ); ?>">Delete</a>
<?php endif; ?>

Après avoir vérifié si l'utilisateur était connecté et s'il était l'auteur de ce message. Cela n'a pas fonctionné comme mentionné dans mon post original.

Au lieu de cela, j'ai utilisé un simple bouton de suppression (avec les mêmes vérifications que celles mentionnées ci-dessus):

<form class="delete-post" action="<?php bloginfo('url'); ?>/edit-post" method="post"> 
    <input id="post_id" type="hidden" name="postid" value="<?php the_ID(); ?>" /> 
    <input type="submit" value="Delete" />
</form>

et ce script jQuery pour faire un appel ajax qui exécutera mon script php:

jQuery(document).ready(function($){  
    $('.delete-post').bind('click', function(e){

        e.preventDefault();

        var post_id;
        post_id = $("#post_id").val();
        var data = {};
        var obj = {data: data}; 
        data['post_id'] = post_id;

        alert('Are you sure you wish to delete this post?');
        process_delete_post();

        function process_delete_post() {
            jQuery.ajax({
                type: "POST",
                url: run_delete_post.ajaxurl,
                data: ({
                    post_id : data['post_id'],
                    action : 'run_delete_post_script',
                }),
                success: function() {
                     location.href = "";
                },

                error: function(jqXHR, exception) {
                    if (jqXHR.status === 0) {
                        alert('Not connect.\n Verify Network.');
                    } else if (jqXHR.status == 404) {
                        alert('Requested page not found. [404]');
                    } else if (jqXHR.status == 500) {
                        alert('Internal Server Error [500].');
                    } else if (exception === 'parsererror') {
                        alert('Requested JSON parse failed.');
                    } else if (exception === 'timeout') {
                        alert('Time out error.');
                    } else if (exception === 'abort') {
                        alert('Ajax request aborted.');
                    } else {
                        alert('Uncaught Error.\n' + jqXHR.responseText);
                    }
                }

            });
        }   

    }); 

}); 

Dans mon fichier functions.php, j'ai configuré mon appel ajax:

function mytheme_delete_post() {
    if ( is_page_template( 'edit-delete-posts.php' ) ) {
        wp_enqueue_script( 'process-delete-post', get_template_directory_uri().'/js/process-delete-post.js', array('jquery'), true);
        wp_localize_script( 'process-delete-post', 'run_delete_post', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
        }
}
add_action('template_redirect', 'mytheme_delete_post');

$dirName = dirname(__FILE__);
$baseName = basename(realpath($dirName));
require_once ("$dirName/functions_custom.php");

add_action("wp_ajax_run_delete_post_script", "run_delete_post_script");     

Et puis, le script php à supprimer le message dans mon fichier functions_custom.php:

function run_delete_post_script() {
    // Test for current user
    mytheme_get_current_user();

    //Get the data from the submit page and convert to php variables
    foreach ($_POST as $field => $value) {
        if (isset($_POST[$field])) {
            $$field = $value;
        }
    }
    wp_delete_post( $post_id );
}
1
laurayeffeth

Qu'en est-il d'une redirection ciblée lorsqu'un auteur tente d'afficher le tableau de bord?

function restrict_dashboard_access() {
    //Leave AJAX requests alone - their life is hard enough without further scrutany
    if( $_SERVER['PHP_SELF'] == '/wp-admin/admin-ajax.php' )
        return;

    if( $_SERVER['PHP_SELF'] == '/wp-admin/post.php' && isset( $_REQUEST['action'] ) ) {
        switch( $_REQUEST['action'] ) {
            case 'trash': //Leave alone requests to delete posts,
            case 'delete'://such as those generated by get_delete_post_link()
                return;
        }
    }

    //For all other admin requests,

    //redirect users of the 'author' role to the home_url
    $user = get_userdata( get_current_user_id() );
    if( in_array( 'author', $user->roles ) ) {
        wp_redirect( home_url() );
        exit;  //Force script death to avoid useless script execution post-redirect
    }
}
add_action( 'admin_init', 'restrict_dashboard_access', 1 );

(Piratés ensemble depuis vos ressources liées et la page WP Codex pour l'action admin_init )

EDIT: Comment implémenter une redirection post-suppression vers une URL spécifique à la lumière des informations supplémentaires fournies dans les commentaires:

function restrict_dashboard_access() {
    //Leave AJAX requests alone - their life is hard enough without further scrutany
    if( $_SERVER['PHP_SELF'] == '/wp-admin/admin-ajax.php' )
        return;

    if( $_SERVER['PHP_SELF'] == '/wp-admin/post.php' && isset( $_REQUEST['action'] ) ) {
        switch( $_REQUEST['action'] ) {
            case 'trash': //Leave alone requests to delete posts,
            case 'delete'://such as those generated by get_delete_post_link()
                return;
        }
    }

    //For all other admin requests, redirect users of the 'author' role
    $user = get_userdata( get_current_user_id() );
    if( in_array( 'author', $user->roles ) ) {

        if( $_SERVER['PHP_SELF'] == '/wp-admin/edit.php' && ( isset( $_REQUEST['trashed'] ) || isset( $_REQUEST['deleted'] ) ) ) {
            // If an Author has just deleted a post - redirect them to a specific URL.
            wp_redirect( home_url() . '/post-deleted-page' );
        } else {
            // If an Author is viewing any other admin page, drop them back to the homepage
            wp_redirect( home_url() );
        }

        exit;  //Force script death to avoid useless script execution post-redirect
    }
}
add_action( 'admin_init', 'restrict_dashboard_access', 1 );
0
bosco