Ermöglichen des benutzerdefinierten Rollenzugriffs auf den benutzerdefinierten Beitragstyp im Back-End

8

Ich habe also einige Probleme damit und kann nicht verstehen warum. Ich brauche nur eine benutzerdefinierte Rolle, die auf das Blog im Backend zugreifen kann.

Ich habe einen neuen Beitragstyp mit dem Funktionstyp blogund einer neuen Benutzerrolle mit allen Obergrenzen hinzugefügt , die es Benutzern mit Administratorzugriff ermöglichen, den benutzerdefinierten Beitragstyp hinzuzufügen / zu bearbeiten. Dies funktioniert für Administratoren und sie können auf den Beitragstyp im Backend zugreifen. Benutzer meiner benutzerdefinierten Rolle können jedoch überhaupt nicht in das Back-End gelangen.

Post-Typ-Argumente

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

Rolle registrieren

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

Caps hinzufügen

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

Ich habe verzweifelt gegoogelt und versucht, die Ursache dafür zu finden. Ich habe versucht, mit Plural, nicht Plural Caps, Funktionen in die Post-Typ-Argumente hinzuzufügen. Ich komme jedoch nie ins Backend. Ich habe keinen anderen Code im Thema, der Benutzer aus dem Administrator werfen könnte (ich habe meinen eigenen Code entfernt, der sie beim Testen rausgeschmissen hat).

Bearbeiten Hier sehen Sie einen Speicherauszug der blog_manager-Funktionen aus der Datenbank. Dort ist noch einiges an Test-BS übrig, aber das sollte nicht verhindern, dass sie sich von dem, was ich weiß, anmelden können.

'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
quelle
1
Beachten Sie, dass Rollen und Funktionen dauerhaft gespeichert werden. Wenn Sie eine frühere Version davon hatten, die keinen Zugriff erlaubte, ist diese möglicherweise noch als Teil der Rolle vorhanden. Speichern Sie die persistenten Daten und prüfen Sie, ob etwas festgelegt ist, das nicht vorhanden sein sollte.
Erst
Ich habe einen Speicherauszug der Datenbankfunktionen hinzugefügt. Ich habe nur die 3 Post-Funktionen auf false gesetzt, die ich im obigen Code habe.
Chris Morris
Ich würde das Plugin für den Benutzerrollen-Editor installieren - wordpress.org/plugins/user-role-editor . Überprüfen Sie dann manuell die Unterschiede zwischen den Benutzern / Rollen - möglicherweise liegt ein Konflikt vor oder es fehlt.
Welcher
Hallo @ChrisMorris, wie bist du damit umgegangen? Haben Sie am Ende eine Lösung gefunden?
Tim Malone

Antworten:

3

Es ist schwierig, den obigen Code zu beheben, da er nur ein Teil des tatsächlichen Codes ist. Hier ist jedoch das Mindest-Plugin, das zum Registrieren eines benutzerdefinierten Beitragstyps (als Beispiel bezeichnet) und einer benutzerdefinierten Rolle (Blog Manager) erforderlich ist, die Zugriff auf den benutzerdefinierten Beitragstyp "Beispiel" hat .

Dies kann auch als Teil der Datei functions.php eines Themas verwendet werden. Verwenden Sie stattdessen einfach die Hooks zur Aktivierung und Deaktivierung des Themas.

<?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
quelle