Funktionen und benutzerdefinierte Beitragstypen

30

Ich habe einen benutzerdefinierten Beitragstyp, der den Zugriff auf bestimmte Rollen einschränken soll. Ich habe jedoch bereits Inhalte mit dem benutzerdefinierten Beitragstyp hinzugefügt und muss sie nun einschränken. Der Capability_Typ war "Post".

'capability_type' => 'post'

Was ist in Ordnung, wenn der Inhalt im Backend angezeigt wird? Sobald ich Funktionen hinzufüge, verschwindet der Inhalt aus dem Backend.

Ich habe versucht, den Fähigkeitstyp so anzupassen, dass er mehrere Definitionen enthält, um meine eigenen zu erstellen. Sobald ich jedoch die Fähigkeitstypen entferne oder ändere, ist sie verschwunden!

vollständiger Code:

add_action( 'init', 'register_cpt_gallery' );

function register_cpt_gallery() {
$labels = array( 
    'name' => _x( 'Galleries', 'gallery' ),
    'singular_name' => _x( 'Gallery', 'gallery' ),
    'add_new' => _x( 'Add New', 'gallery' ),
    'add_new_item' => _x( 'Add New Gallery', 'gallery' ),
    'edit_item' => _x( 'Edit Gallery', 'gallery' ),
    'new_item' => _x( 'New Gallery', 'gallery' ),
    'view_item' => _x( 'View Gallery', 'gallery' ),
    'search_items' => _x( 'Search Galleries', 'gallery' ),
    'not_found' => _x( 'No galleries found', 'gallery' ),
    'not_found_in_trash' => _x( 'No galleries found in Trash', 'gallery' ),
    'parent_item_colon' => _x( 'Parent Gallery:', 'gallery' ),
    'menu_name' => _x( 'Galleries', 'gallery' ),
);

$args = array( 
    'labels' => $labels,
    'hierarchical' => true,
    'description' => 'Image galleries for teachers classes',
    'supports' => array( 'title', 'editor', 'author'),

    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,

    'menu_icon' => get_bloginfo('template_url') . '/images/imagegallery.png',
    'show_in_nav_menus' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'has_archive' => true,
    'query_var' => true,
    'can_export' => true,
    'rewrite' => true,
    'capability_type' => 'post',
    'capabilities' => array(
        'edit_post' => 'edit_gallery',
        'edit_posts' => 'edit_galleries',
        'edit_others_posts' => 'edit_other_galleries',
        'publish_posts' => 'publish_galleries',
        'read_post' => 'read_gallery',
        'read_private_posts' => 'read_private_galleries',
        'delete_post' => 'delete_gallery'
    )
);

register_post_type( 'gallery', $args );
}

Ich habe dies auch mit einem völlig neuen benutzerdefinierten Beitragstyp getestet und unabhängig vom Funktionstyp erhalte ich das gleiche Problem, z. B. auch wenn ich ihn entferne und meinen benutzerdefinierten hinzufüge:

'capability_type' => array('movie','movies');
Erichmond
quelle

Antworten:

40

Nach einem kurzen Chat mit Magicroundabout, der auf eine nützliche Ressource von Justin Tadlock hinwies , stellte sich heraus, dass Funktionen für benutzerdefinierte Beitragstypen nur dann vorhanden sind, wenn Sie add_cap für die Rolle verwenden, z. B. für den folgenden benutzerdefinierten Beitragstyp:

add_action( 'init', 'register_cpt_gallery' );

function register_cpt_gallery() {
$labels = array( 
    'name' => _x( 'Galleries', 'gallery' ),
    'singular_name' => _x( 'Gallery', 'gallery' ),
    'add_new' => _x( 'Add New', 'gallery' ),
    'add_new_item' => _x( 'Add New Gallery', 'gallery' ),
    'edit_item' => _x( 'Edit Gallery', 'gallery' ),
    'new_item' => _x( 'New Gallery', 'gallery' ),
    'view_item' => _x( 'View Gallery', 'gallery' ),
    'search_items' => _x( 'Search Galleries', 'gallery' ),
    'not_found' => _x( 'No galleries found', 'gallery' ),
    'not_found_in_trash' => _x( 'No galleries found in Trash', 'gallery' ),
    'parent_item_colon' => _x( 'Parent Gallery:', 'gallery' ),
    'menu_name' => _x( 'Galleries', 'gallery' ),
);

$args = array( 
    'labels' => $labels,
    'hierarchical' => true,
    'description' => 'Image galleries for teachers classes',
    'supports' => array( 'title', 'editor', 'author'),
    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'menu_icon' => get_bloginfo('template_url') . '/images/imagegallery.png',
    'show_in_nav_menus' => true,
    'publicly_queryable' => true,
    'exclude_from_search' => false,
    'has_archive' => true,
    'query_var' => true,
    'can_export' => true,
    'rewrite' => true,
    'capabilities' => array(
        'edit_post' => 'edit_gallery',
        'edit_posts' => 'edit_galleries',
        'edit_others_posts' => 'edit_other_galleries',
        'publish_posts' => 'publish_galleries',
        'read_post' => 'read_gallery',
        'read_private_posts' => 'read_private_galleries',
        'delete_post' => 'delete_gallery'
    ),
    // as pointed out by iEmanuele, adding map_meta_cap will map the meta correctly 
    'map_meta_cap' => true
);

register_post_type( 'gallery', $args );
}

Die zusätzlichen Funktionen sollten zu einer Rolle hinzugefügt werden, damit die Berechtigungen tatsächlich im Backend ausgeführt werden können, einschließlich des Administrators. Beispiel:

function add_theme_caps() {
    // gets the administrator role
    $admins = get_role( 'administrator' );

    $admins->add_cap( 'edit_gallery' ); 
    $admins->add_cap( 'edit_galleries' ); 
    $admins->add_cap( 'edit_other_galleries' ); 
    $admins->add_cap( 'publish_galleries' ); 
    $admins->add_cap( 'read_gallery' ); 
    $admins->add_cap( 'read_private_galleries' ); 
    $admins->add_cap( 'delete_gallery' ); 
}
add_action( 'admin_init', 'add_theme_caps');

Ich hoffe, das ist nützlich für andere.

Erichmond
quelle
11
add_theme_caps()sollte nur einmal aufgerufen werden, nicht jedes Mal, wenn eine Admin-Seite geladen wird. Es wäre besser, switch_themeals Hook für die Theme-Aktivierung oder register_activation_hookfür die Plugin-Aktivierung zu verwenden.
d79
Nett! Ich benutze gerne wp cli, um die Funktionen hinzuzufügen, wenn es sich um eine vollständig benutzerdefinierte / eindeutige Site handelt, da es sich um eine Aktion handelt, die nur einmal ausgeführt werden muss.
Squarecandy
8

Hinzufügen:

map_meta_cap => true

zu Ihrem $ args-Array. Schauen Sie hier für mehr. Ich hoffe es hilft!

Emmanuele
quelle
1
Das ist, was ich auch dachte, aber nicht ganz der Fall.
Erichmond
Dies funktionierte für mich
Shikyo
1

IMHO bilden Sie nie Ihre eigenen Fähigkeiten ab. Stellen Sie sicher, dass Sie das Map Meta Cap Plugin verwenden. http://codex.wordpress.org/Function_Reference/map_meta_cap

Ich habe tagelang versucht, meine benutzerdefinierten Kappen manuell mit Code zuzuordnen. Installieren Sie einfach dieses Plugin, ordnen Sie Ihre Caps zu und deaktivieren Sie es, sobald es funktioniert. Wenn Sie benutzerdefinierte Rollen erstellen, benötigen Sie das Mitglieder- Plugin.

Die Art und Weise, wie ich teste, um sicherzustellen, dass meine Rolle diese Fähigkeiten aufweist (manchmal schwören Sie, dass Sie dies tun, aber nicht wirklich tun), erstellt eine Debugging-Seite mit:

    if( !function_exists( 'current_user_has_role' ) ){
        function current_user_has_role( $role ){
            $current_user = new WP_User( wp_get_current_user()->ID );
            $user_roles = $current_user->roles;
            $is_or_not = in_array( $role, $user_roles );
            return $is_or_not;
        }
    }

Dies zeigt Ihnen, über welche Funktionen Sie tatsächlich verfügen.

Ben Racicot
quelle
-1

Für benutzerdefinierte Beitragstypen empfehle ich NICHT die Verwendung von Hooks:

add_action( 'registered_post_type', 'your_func', 10, 2 );

stattdessen schlage ich vor:

add_filter( 'register_post_type_args', 'your_func', 10, 2 );
function your_func( $args, $name ) 
{
   if ( $name == "your_custom_post_name" ) 
   ...
}
T.Todua
quelle
Der Vorschlag ist gut, aber er beantwortet die Frage nicht.
Aurovrata,