Cum să permiți accesul unui rol personalizat la un tip de postare personalizat în backend

5 mai 2015, 14:01:43
Vizualizări: 18.3K
Voturi: 10

Am o problemă cu acest lucru și nu înțeleg de ce. Am nevoie doar ca un rol personalizat să poată accesa blogul în backend.

Am adăugat un nou tip de postare cu un Capability type blog și un nou rol de utilizator cu toate capabilitățile necesare pentru a permite administratorilor să adauge/modifice tipul de postare personalizat. Acest lucru funcționează pentru administratori și ei pot accesa tipul de postare în backend. Totuși, utilizatorii cu rolul meu personalizat nu pot intra deloc în backend.

Argumentele importante pentru tipul de postare

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

Înregistrarea rolului

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

Adăugarea capabilităților

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 );

Am căutat intens pe Google pentru a găsi cauza acestei probleme. Am încercat cu capabilități la plural, neplural, am încercat să adaug capabilități în argumentele tipului de postare. Dar niciodată nu pot intra în backend. Nu am alte coduri în temă care ar putea scoate utilizatorii din admin (am eliminat propriul meu cod care îi excludea în timp ce testam asta).

Editare Aici puteți vedea un dump al capabilităților blog_manager din baza de date, există o grămadă de teste BS rămase acolo, dar asta nu ar trebui să le împiedice să se autentifice din câte știu eu.

'blog_manager' => array (
    'name' => 'Manager Blog',
    '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,
    ),
)
4
Comentarii

Rețineți că rolurile și capacitățile sunt salvate persistent. Dacă ați avut o versiune anterioară a acestui lucru care nu permitea accesul, s-ar putea să fie încă acolo ca parte a rolului. Verificați datele persistente și vedeți dacă există ceva setat care nu ar trebui să fie.

Rarst Rarst
5 mai 2015 17:32:31

Am adăugat un dump al capacităților din baza de date. Am doar cele 3 capacități de postare setate la false pe care le am în codul de mai sus.

Chris Morris Chris Morris
5 mai 2015 17:54:49

Aș instala plugin-ul User Role Editor - https://wordpress.org/plugins/user-role-editor/. Apoi inspectați manual diferențele dintre utilizatori/roluri - poate exista ceva conflictual sau lipsă.

Welcher Welcher
21 mai 2015 02:50:29

Bună @ChrisMorris, cum ai procedat cu asta? Ai reușit să găsești o soluție până la urmă?

Tim Malone Tim Malone
29 iun. 2016 11:18:05
Toate răspunsurile la întrebare 2
1

Este dificil să depanezi codul de mai sus deoarece este doar o parte din codul real, dar iată pluginul minim necesar pentru a înregistra un tip de postare personalizat (numit Exemplu) și un rol personalizat (Manager de Blog) care are acces la tipul de postare personalizat Exemplu.

Acesta poate fi folosit și ca parte a fișierului functions.php al unei teme. Doar folosește hook-urile de activare și dezactivare a temei în loc.

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

//* Nu accesa acest fișier direct
defined( 'ABSPATH' ) or die();

//* Adaugă acțiune la init pentru a înregistra tipul de postare personalizat
add_action( 'init', 'se186337_init' );

//* Înregistrează hook-ul de activare pentru a adăuga rolul Manager de Blog
register_activation_hook( __FILE__ , 'se186337_activation' );

//* Înregistrează hook-ul de dezactivare pentru a elimina rolul Manager de Blog
register_deactivation_hook( __FILE__ , 'se186337_deactivation' );

function se186337_activation() {
  $caps = [
    //* Capabilități meta
    'read'                   => true,
    'edit_blog'              => true,
    'read_blog'              => true,
    'delete_blog'            => true,

    //* Capabilități primitive folosite în afara map_meta_cap()
    'edit_blogs'             => true,
    'edit_others_blogs'      => true,
    'publish_blogs'          => true,
    'read_private_blogs'     => true,

    //* Capabilități primitive folosite în interiorul 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', 'Manager de Blog', $caps );
}

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

function se186337_init() {
  $labels = [
    'name'          => __( 'Exemple' ),
    'singular_name' => __( 'Exemplu' ),
  ];
  $args = [
    'labels'          => $labels,
    'public'          => true,
    'has_archive'     => true,
    'capability_type' => 'blog',
    'map_meta_cap'    => true,
  ];
  register_post_type( 'examples', $args );
}
21 feb. 2017 20:22:16
Comentarii

în funcția se186337_activation() ai atribuit capabilitățile, dar de ce nu ai folosit funcția $add->cap pentru a fi utilizată în interiorul unei alte funcții cu un foreach loop pentru a adăuga capabilități în acest fel? sper că are sens...

Krys Krys
22 mar. 2022 08:08:09
0

Dacă sunteți de acord cu un plugin, atunci puteți utiliza plugin-ul de mai jos.

https://wordpress.org/plugins/capability-manager-enhanced/

7 aug. 2016 01:02:05