Capabilități și Tipuri de Postări Personalizate
Am un tip de postare personalizată pentru care aș dori să restricționez accesul la anumite roluri, însă am adăugat deja conținut folosind acest tip de postare personalizată și acum trebuie să le restricționez. Tipul de capabilitate era 'post'
'capability_type' => 'post'
Ceea ce e în regulă deoarece conținutul apare în backend, dar acum, imediat ce adaug orice capabilități, conținutul dispare din backend?
Am încercat să personalizez tipul de capabilitate pentru a include definiții la plural pentru a-mi construi propriile capabilități, dar imediat ce elimin sau schimb tipurile de capabilitate, dispare!
codul complet:
add_action( 'init', 'register_cpt_gallery' );
function register_cpt_gallery() {
$labels = array(
'name' => _x( 'Galerii', 'gallery' ),
'singular_name' => _x( 'Galerie', 'gallery' ),
'add_new' => _x( 'Adaugă Nou', 'gallery' ),
'add_new_item' => _x( 'Adaugă Galerie Nouă', 'gallery' ),
'edit_item' => _x( 'Editează Galeria', 'gallery' ),
'new_item' => _x( 'Galerie Nouă', 'gallery' ),
'view_item' => _x( 'Vezi Galeria', 'gallery' ),
'search_items' => _x( 'Caută Galerii', 'gallery' ),
'not_found' => _x( 'Nu s-au găsit galerii', 'gallery' ),
'not_found_in_trash' => _x( 'Nu s-au găsit galerii în Coș', 'gallery' ),
'parent_item_colon' => _x( 'Galerie Părinte:', 'gallery' ),
'menu_name' => _x( 'Galerii', 'gallery' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'description' => 'Galerii de imagini pentru clasele profesorilor',
'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 );
}
Am testat și cu un tip de postare personalizată complet nou și indiferent de tipul de capabilitate obțin aceeași problemă, de exemplu chiar dacă îl elimin și adaug unul personalizat:
'capability_type' => array('movie','movies');

După o scurtă discuție cu Magicroundabout, care a menționat o resursă utilă de la Justin Tadlock, am aflat că capabilitățile pentru tipurile personalizate de postări nu există efectiv decât dacă le adăugați rolului folosind add_cap. De exemplu, pentru următorul tip personalizat de postare:
add_action( 'init', 'register_cpt_gallery' );
function register_cpt_gallery() {
$labels = array(
'name' => __( 'Galerii', 'gallery' ),
'singular_name' => __( 'Galerie', 'gallery' ),
'add_new' => __( 'Adaugă nouă', 'gallery' ),
'add_new_item' => __( 'Adaugă o galerie nouă', 'gallery' ),
'edit_item' => __( 'Editează galeria', 'gallery' ),
'new_item' => __( 'Galerie nouă', 'gallery' ),
'view_item' => __( 'Vezi galeria', 'gallery' ),
'search_items' => __( 'Caută galerii', 'gallery' ),
'not_found' => __( 'Nu s-au găsit galerii', 'gallery' ),
'not_found_in_trash' => __( 'Nu s-au găsit galerii în Coșul de gunoi', 'gallery' ),
'parent_item_colon' => __( 'Galerie părinte:', 'gallery' ),
'menu_name' => __( 'Galerii', 'gallery' ),
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'description' => 'Galerii de imagini pentru clasele profesorilor',
'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'
),
// după cum a menționat iEmanuele, adăugarea map_meta_cap va mapa corect metadatele
'map_meta_cap' => true
);
register_post_type( 'gallery', $args );
}
Capabilitățile suplimentare trebuie adăugate unui rol pentru ca permisiunile să funcționeze efectiv în backend, inclusiv pentru 'administrator' - de exemplu:
function add_theme_caps() {
// obține rolul de 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');
Sper că acest lucru va fi util pentru alții.
În plus, funcția de traducere _x()
așteaptă ca al doilea argument să fie string $context
, care este o scurtă descriere, iar al treilea să fie string $domain
. Când nu furnizați o descriere, folosiți în schimb funcția de traducere __()
, care are string $domain
ca al doilea argument.

add_theme_caps()
ar trebui apelată o singură dată, nu de fiecare dată când se încarcă o pagină de administrare. Ar fi mai bine să folosești switch_theme
ca hook pentru activarea temei sau register_activation_hook
la activarea plugin-ului.

Adaugă:
map_meta_cap => true
în array-ul tău $args. Vezi aici pentru mai multe detalii. Sper că te ajută!

În opinia mea, nu ar trebui să îți mapezi singur capacitățile. Asigură-te că folosești plugin-ul map meta cap pentru asta. http://codex.wordpress.org/Function_Reference/map_meta_cap
Am petrecut zile încercând să mapez manual capacitățile personalizate cu cod. Doar instalează acel plugin, mapează capacitățile și dezactivează-l odată ce funcționează. Dacă creezi roluri personalizate, vei avea nevoie de plugin-ul Members.
Modul în care testez pentru a MĂ asigura că rolul meu are acele capacități (uneori juri că da, dar de fapt nu au) este să creez o pagină de depanare cu:
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;
}
}
Aceasta va arăta ce capacități ai de fapt.

Pentru Tipuri de Postare Personalizate, NU recomand utilizarea hook-ului:
add_action( 'registered_post_type', 'your_func', 10, 2 );
în schimb, recomand utilizarea:
add_filter( 'register_post_type_args', 'your_func', 10, 2 );
function your_func( $args, $name )
{
if ( $name == "your_custom_post_name" )
...
}

Nici măcar nu înțeleg de ce e o sugestie bună. Acea acțiune este apelată din post.php în partea de jos a register_post_type și transmite tipul și obiectul înapoi către orice cod care dorește să le prelucreze. Nu pare să fie nimic în neregulă cu asta. Deși nimic din această întrebare și răspuns nu se referea la această acțiune oricum. ;)
