Capabilități și Tipuri de Postări Personalizate

30 iul. 2013, 17:20:27
Vizualizări: 78.9K
Voturi: 38

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');
0
Toate răspunsurile la întrebare 4
2
56

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.

30 iul. 2013 23:24:54
Comentarii

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.

d79 d79
13 apr. 2015 13:42:45

Foarte bine! Îmi place să folosesc wp cli pentru a adăuga capabilitățile dacă este un site complet personalizat/unic, deoarece este o acțiune care trebuie să se întâmple o singură dată.

squarecandy squarecandy
1 dec. 2017 03:56:31
2
12

Adaugă:

map_meta_cap => true

în array-ul tău $args. Vezi aici pentru mai multe detalii. Sper că te ajută!

30 iul. 2013 20:39:24
Comentarii

Așa am crezut și eu, dar nu în totalitate.

erichmond erichmond
30 iul. 2013 22:47:51

Asta a funcționat pentru mine

Shikyo Shikyo
27 mar. 2018 17:20:39
0

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

31 iul. 2013 00:56:25
2

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" ) 
   ...
}
21 apr. 2019 00:58:52
Comentarii

sugestia este una bună, dar nu răspunde la întrebare.

Aurovrata Aurovrata
11 nov. 2019 10:06:13

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

TonyG TonyG
14 oct. 2021 02:58:04