web-dev-qa-db-fra.com

Rôles pour les types de publication personnalisés

J'ai créé des types de publication personnalisés, mais je voudrais les masquer dans le tableau de bord des abonnés, des auteurs et des rédacteurs (pour l’essentiel, autoriser uniquement les administrateurs à y accéder).

Puis-je faire cela sans installer de plugin?

1
Force Flow

Je suis sûr que vous pouvez spécifier certaines fonctionnalités lors de l’enregistrement du type de message lui-même. Cependant, voici une version plus robuste qui peut être largement utilisée dans le tableau de bord de l’administration.

/**
 * Hide dashboard administrator menus from disallowed user roles.
 *
 * @author Michael Ecklund
 * @author_url https://www.michaelbrentecklund.com/
 *
 * @return void
 */
function mbe_hide_menus() {

    global $current_user, $menu;

    # Set list of disallowed user roles.
    $disallowed_roles = array( 'subscriber', 'author', 'editor' );
    $disallowed       = false;

    # Check current user role against all disallowed roles.
    foreach ( $disallowed_roles as $disallowed_role ) {

        # Current user role must not be disallowed.
        if ( in_array( $disallowed_role, $current_user->roles ) ) {

            $disallowed = true;// User role disallowed.
            break;

        }

    }

    # User passed the check. Bail before hiding the menu.
    if ( $disallowed === false ) {
        return;
    }

    # Set list of disallowed dashboard administration menus.
    $restricted = array(
        __( 'INSERT MENU NAME HERE' )// Text as it appears in the admin menu.
    );

    # Attempt to hide admin menus.
    foreach ( $menu as $index => $menu_data ) {

        if ( in_array( $menu_data[0], $restricted ) ) {
            unset( $menu[ $index ] );
        }

    }

}

Pour activer la fonction, vous devez ajouter l'action.

add_action('admin_menu', 'mbe_hide_menus', 101);

Le code ci-dessus ne fait que masquer l'affichage des menus de l'administrateur à l'utilisateur. Ils peuvent toujours accéder directement aux pages s’ils connaissent les bonnes URL.

Vous pouvez utiliser ceci pour empêcher des utilisateurs non privilégiés d'accéder à des pages d'administration spécifiques.

/**
 * Restrict admin pages from unprivileged users.
 *
 * @author Michael Ecklund
 * @author_url https://www.michaelbrentecklund.com/
 *
 * @return void
 */
function mbe_disallow_admin_pages() {

    global $pagenow;

    # Skip checking administrative users.
    if ( current_user_can( 'administrator' ) ) {
        return;
    }

    # Set denyable & hookable list of admin pages.
    $page_slugs = apply_filters( 'mbe_disallowed_admin_pages', array(
        'admin.php'           => 'jetpack',
        'options-general.php' => ''
    ) );

    # Page parameter isn't always present.
    if ( ! isset( $_GET['page'] ) ) {
        $page = '';
    }

    # Check current admin page against denied admin page list.
    if ( array_key_exists( $pagenow, $page_slugs ) && in_array( $page, $page_slugs ) ) {
        wp_die( 'You do not have sufficient permissions to access this page.' );
    }

}

Pour activer la fonction, vous devez ajouter l'action.

add_action( 'admin_init', 'mbe_disallow_admin_pages' );
1
Michael Ecklund