it-swarm.com.de

Funktionen und benutzerdefinierte Beitragstypen

Ich habe einen benutzerdefinierten Beitragstyp, mit dem ich den Zugriff auf bestimmte Rollen einschränken möchte. 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');
27
erichmond

Nach einem kurzen Chat mit Magicroundabout , der auf eine nützliche Ressource von Justin Tadlock hingewiesen hat, hat sich herausgestellt, dass Funktionen für benutzerdefinierte Beitragstypen nicht vorhanden sind, es sei denn, Sie verwenden add_cap für die Rolle, zum Beispiel für die 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.

36
erichmond

Hinzufügen:

map_meta_cap => true

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

7
iEmanuele

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 Members 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.

1
Ben Racicot

Für benutzerdefinierte Beitragstypen empfehle ich NICHT die Verwendung des Hakens:

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" ) 
   ...
}
0
T.Todua