Funzionalità e Tipi di Post Personalizzati

30 lug 2013, 17:20:27
Visualizzazioni: 78.9K
Voti: 38

Ho un tipo di post personalizzato a cui vorrei limitare l'accesso a determinati ruoli, tuttavia, ho già aggiunto contenuti utilizzando il custom post type e ora devo renderli ristretti. Il capability_type era 'post'

'capability_type' => 'post'

Questo va bene poiché i contenuti vengono visualizzati nel backend, tuttavia, non appena aggiungo delle capabilities il contenuto scompare dal backend?

Ho provato a personalizzare il tipo di capability per includere definizioni plurali per costruire le mie, ma non appena rimuovo o cambio i tipi di capability, scompare!

codice completo:

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

Ho anche testato questo con un tipo di post personalizzato completamente nuovo e indipendentemente dal tipo di capability ottengo lo stesso problema, ad esempio anche se lo rimuovo e aggiungo il mio personalizzato:

'capability_type' => array('movie','movies');
0
Tutte le risposte alla domanda 4
2
56

Dopo una breve conversazione con Magicroundabout che mi ha segnalato una risorsa utile di Justin Tadlock, si scopre che le capability per i custom post type in realtà non esistono a meno che non si utilizzi add_cap per il ruolo, ad esempio per il seguente custom post type:

add_action( 'init', 'register_cpt_gallery' );

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

$args = array( 
    'labels' => $labels,
    'hierarchical' => true,
    'description' => 'Gallerie immagini per le classi degli insegnanti',
    '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'
    ),
    // come sottolineato da iEmanuele, aggiungendo map_meta_cap mapperà correttamente i meta
    'map_meta_cap' => true
);

register_post_type( 'gallery', $args );
}

Le capability aggiuntive devono essere assegnate a un ruolo affinché i permessi funzionino effettivamente nel backend, incluso l' 'administrator' - ad esempio:

function add_theme_caps() {
    // ottiene il ruolo administrator
    $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');

Spero che questo possa essere utile ad altri.

Inoltre, la funzione di traduzione _x() si aspetta che il secondo argomento sia string $context, che è una breve descrizione, e il terzo sia string $domain. Quando non si fornisce una descrizione, è meglio utilizzare la funzione di traduzione __() che ha string $domain come secondo argomento.

30 lug 2013 23:24:54
Commenti

add_theme_caps() dovrebbe essere chiamato una sola volta, non ogni volta che viene caricata una pagina di amministrazione. Sarebbe meglio usare switch_theme come hook per l'attivazione del tema o register_activation_hook per l'attivazione del plugin.

d79 d79
13 apr 2015 13:42:45

Ottimo! Mi piace usare wp cli per aggiungere le capability se si tratta di un sito completamente personalizzato/unico, dato che è un'azione che deve avvenire una sola volta.

squarecandy squarecandy
1 dic 2017 03:56:31
2
12

Aggiungi:

map_meta_cap => true

al tuo array $args. Guarda qui per maggiori informazioni. Spero ti sia utile!

30 lug 2013 20:39:24
Commenti

Anche io pensavo così ma non è del tutto il caso.

erichmond erichmond
30 lug 2013 22:47:51

Questo ha funzionato per me

Shikyo Shikyo
27 mar 2018 17:20:39
0

IMHO non mappi mai le tue capacità. Assicurati di utilizzare il plugin map meta cap per farlo. http://codex.wordpress.org/Function_Reference/map_meta_cap

Ho passato giorni a cercare di mappare manualmente le mie capacità personalizzate con il codice. Basta installare quel plugin, mappare le tue capacità e disattivarlo una volta che funziona. Se crei ruoli personalizzati, avrai bisogno del plugin Members.

Il modo in cui testo per ASSICURARMI che il mio ruolo abbia quelle capacità (a volte pensi di averle ma in realtà non le hai) è creare una pagina di debug con:

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

Questo ti mostrerà quali capacità hai effettivamente.

31 lug 2013 00:56:25
2

Per i Custom Post Types, NON consiglio di usare l'hook:

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

invece consiglio di usare:

add_filter( 'register_post_type_args', 'your_func', 10, 2 );
function your_func( $args, $name ) 
{
   if ( $name == "your_custom_post_name" ) 
   ...
}
21 apr 2019 00:58:52
Commenti

il suggerimento è buono, ma non risponde alla domanda.

Aurovrata Aurovrata
11 nov 2019 10:06:13

Non capisco nemmeno perché sia un buon suggerimento. Quell'azione viene chiamata da post.php alla fine di register_post_type, e passa il tipo e l'oggetto a qualsiasi codice che voglia gestirla. Non sembra esserci nulla di sbagliato in questo. Anche se nulla in questa Q&A faceva riferimento a questa azione comunque. ;)

TonyG TonyG
14 ott 2021 02:58:04