web-dev-qa-db-ja.com

カスタム投稿タイプの役割

カスタム投稿タイプをいくつか作成しましたが、購読者、作成者、および編集者に対してダッシュボードでそれらを非表示にしたい(基本的には管理者にアクセスを許可するだけにします)。

プラグインをインストールせずにこれを実行できますか?

1
Force Flow

Post Type自体を登録しながら、いくつかの機能を指定できると確信しています。ただし、これは管理ダッシュボードで広く使用できる、より堅牢なバージョンです。

/**
 * 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 ] );
        }

    }

}

機能を起動するには、アクションを追加する必要があります。

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

上記のコードは、ユーザーに表示される管理者メニューフォームを非表示にすることに限ります。正しいURLを知っていれば、彼らはまだ直接ページにアクセスできます。

これを使用して、特権のないユーザーによる特定の管理ページへのアクセスを拒否することができます。

/**
 * 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.' );
    }

}

機能を起動するには、アクションを追加する必要があります。

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