Mengizinkan akses peran khusus ke jenis pos kustom di ujung belakang

8

Jadi saya mengalami beberapa masalah dengan ini dan saya tidak bisa melihat mengapa. Saya hanya perlu peran khusus yang dapat mengakses blog di bagian belakang.

Saya telah menambahkan jenis posting baru dengan jenis Kemampuan blogdan peran pengguna baru dengan semua batasan yang akan memungkinkan admin mengakses pengguna untuk menambah / mengedit jenis posting kustom. Ini berfungsi untuk admin dan mereka dapat mengakses jenis posting di bagian belakang. Namun pengguna peran khusus saya tidak bisa masuk ke bagian belakang sama sekali.

Jenis tulisan args of note

"capability_type" => 'blog',
"map_meta_cap" => true,

Mendaftar peran

function add_blog_manager_role(){
    add_role(
        'blog_manager',
        'Blog Manager',
        array(
            'read' => true,
            'edit_posts' => false,
            'delete_posts' => false,
            'publish_posts' => false,
            'upload_files' => true
        )
    );
}
add_action( 'admin_init', 'add_blog_manager_role', 4 );

Tambahkan Caps

function add_blog_role_caps() {
    $roles = array('blog_manager', 'editor','administrator');
    foreach($roles as $the_role) {
        $role = get_role($the_role);
        $role->add_cap( 'read' );
        $role->add_cap( 'read_blog');
        $role->add_cap( 'read_private_blog' );
        $role->add_cap( 'edit_blog' );
        $role->add_cap( 'edit_others_blog' );
        $role->add_cap( 'edit_published_blog' );
        $role->add_cap( 'publish_blog' );
        $role->add_cap( 'delete_others_blog' );
        $role->add_cap( 'delete_private_blog' );
        $role->add_cap( 'delete_published_blog' );
    }
}
add_action('admin_init', 'add_blog_role_caps', 5 );

Saya sudah googeling dengan panik mencoba mencari penyebabnya. Saya sudah mencoba dengan bentuk jamak, non jamak, mencoba menambahkan kemampuan ke args jenis posting. Namun saya tidak pernah bisa masuk ke belakang. Saya tidak punya kode lain dalam tema yang mungkin mengeluarkan pengguna dari admin (saya menghapus kode saya sendiri yang menendang mereka saat menguji ini)

Sunting Di sini Anda dapat melihat dump dari kemampuan blog_manager dari database, ada sedikit pengujian BS yang tersisa di sana, tetapi yang seharusnya tidak menghentikan mereka untuk dapat login dari apa yang saya ketahui.

'blog_manager' => array (
    'name' => 'Blog Manager',
    'capabilities' => array (
        'read' => true,
        'edit_posts' => false,
        'delete_posts' => false,
        'publish_posts' => false,
        'upload_files' => true,
        'read_blog' => true,
        'read_private_blog' => true,
        'edit_blog' => true,
        'edit_others_blog' => true,
        'edit_published_blog' => true,
        'publish_blog' => true,
        'delete_others_blog' => true,
        'delete_private_blog' => true,
        'delete_published_blog' => true,
        'blog' => true,
        'read_private_blogs' => true,
        'edit_blogs' => true,
        'edit_others_blogs' => true,
        'edit_published_blogs' => true,
        'publish_blogs' => true,
        'delete_others_blogs' => true,
        'delete_private_blogs' => true,
        'delete_published_blogs' => true,
        'delete_blogs' => true,
        'delete_blog' => true,
    ),
)
Chris Morris
sumber
1
Perhatikan bahwa peran dan kemampuan disimpan secara terus - menerus . Jika Anda memiliki beberapa versi sebelumnya yang tidak memungkinkan akses, mungkin masih ada sebagai bagian dari peran. Buang data yang persisten dan lihat apakah ada set yang tidak seharusnya.
Jarang
Saya menambahkan dump dari kemampuan database. Saya hanya memiliki 3 post kemampuan yang disetel ke false yang saya miliki dalam kode di atas.
Chris Morris
Saya akan menginstal plugin Editor Peran Pengguna - wordpress.org/plugins/user-role-editor . Kemudian secara manual memeriksa perbedaan antara pengguna / peran - mungkin ada sesuatu yang bertentangan atau hilang.
Welcher
Hai @ Chrisrisor, bagaimana Anda melakukannya? Apakah Anda akhirnya menemukan solusi?
Tim Malone

Jawaban:

3

Sulit untuk memecahkan masalah kode di atas karena itu hanya bagian dari kode aktual, tetapi inilah plugin minimum yang diperlukan untuk mendaftarkan jenis posting khusus (disebut Contoh) dan peran khusus (Blog Manager) yang memiliki akses ke contoh jenis posting kustom .

Ini juga dapat digunakan sebagai bagian dari file functions.php tema. Cukup gunakan pengaktifan tema dan kait penonaktifan sebagai gantinya.

<?php
/**
 * Plugin Name: WPSE 186337
 * Description: Debug WordPress StackExchange question 186337
 * Plugin URI: /wordpress/186337/
 * Author: Nathan Johnson
 * Licence: GPL2+
 * Licence URI: https://www.gnu.org/licenses/gpl-2.0.en.html
 */

//* Don't access this file directly
defined( 'ABSPATH' ) or die();

//* Add action to init to register custom post type
add_action( 'init', 'se186337_init' );

//* Register activation hook to add Blog Manager role
register_activation_hook( __FILE__ , 'se186337_activation' );

//* Register deactivation hook to remove Blog Manager role
register_deactivation_hook( __FILE__ , 'se186337_deactivation' );

function se186337_activation() {
  $caps = [
    //* Meta capabilities
    'read'                   => true,
    'edit_blog'              => true,
    'read_blog'              => true,
    'delete_blog'            => true,

    //* Primitive capabilities used outside of map_meta_cap()
    'edit_blogs'             => true,
    'edit_others_blogs'      => true,
    'publish_blogs'          => true,
    'read_private_blogs'     => true,

    //* Primitive capabilities used within of map_meta_cap()
    'delete_blogs'           => true,
    'delete_private_blogs'   => true,
    'delete_published_blogs' => true,
    'delete_others_blogs'    => true,
    'edit_private_blogs'     => true,
    'edit_published_blogs'   => true,
  ];

  add_role( 'blog_manager', 'Blog Manager', $caps );
}

function se186337_deactivation() {
  remove_role( 'blog_manager' );
}

function se186337_init() {
  $labels = [
    'name'          => __( 'Examples' ),
    'singular_name' => __( 'Example' ),
  ];
  $args = [
    'labels'          => $labels,
    'public'          => true,
    'has_archive'     => true,
    'capability_type' => 'blog',
    'map_meta_cap'    => true,
  ];
  register_post_type( 'examples', $args );
}
Nathan Johnson
sumber