Funzionalità e tipi di post personalizzati


30

Ho un tipo di post personalizzato che vorrei limitare l'accesso a determinati ruoli, tuttavia ho già aggiunto contenuti utilizzando il tipo di post personalizzato e ora devo renderli limitati. Capacity_type era 'post'

'capability_type' => 'post'

Il che va bene quando il contenuto viene mostrato nel back-end, tuttavia, non appena aggiungo funzionalità, il contenuto scompare dal back-end?

Ho provato a personalizzare il tipo di capacità in modo da includere definizioni plurali per costruirne una mia, ma non appena rimuovo o cambio i tipi di capacità non c'è più!

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 capacità ottengo lo stesso problema, ad esempio anche se lo rimuovo e aggiungo quello personalizzato:

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

Risposte:


40

Dopo una breve chat con Magicroundabout, che ha indicato una risorsa utile di Justin Tadlock , si scopre che le funzionalità per i tipi di post personalizzati non esistono effettivamente a meno che non si usi add_cap per il ruolo, ad esempio per il seguente tipo di post personalizzato:

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

le funzionalità aggiuntive dovrebbero essere aggiunte a un ruolo affinché le autorizzazioni funzionino effettivamente nel back-end, incluso l '"amministratore", ad esempio:

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

Spero che questo sia utile per gli altri.


11
add_theme_caps()dovrebbe essere chiamato solo una volta, non ogni volta che viene caricata una pagina di amministrazione. Sarebbe meglio usare switch_themecome hook per l'attivazione del tema o register_activation_hookper l'attivazione del plugin.
d79,

Bello! Mi piace usare wp cli per aggiungere funzionalità se è un sito completamente personalizzato / unico poiché è un'azione che deve avvenire solo una volta.
squarecandy,

8

Inserisci:

map_meta_cap => true

al tuo array $ args. Guarda qui , per di più. Spero che sia d'aiuto!


1
Questo è quello che ho pensato anche, ma non del tutto.
Erichmond,

Questo ha funzionato per me
Shikyo,

1

Non ho mai mappato le tue capacità. Assicurati di usare il plug-in meta-map per farlo. http://codex.wordpress.org/Function_Reference/map_meta_cap

Ho trascorso giorni cercando di mappare manualmente i miei tappi personalizzati con il codice. Basta installare quel plug-in, mappare i tappi e disattivare una volta funzionante. Se si creano ruoli personalizzati, sarà necessario il plug-in Membri .

Il modo in cui provo per ASSICURARMI che il mio ruolo abbia quelle capacità (a volte giuri di farlo ma in realtà non lo fai) 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 funzionalità hai effettivamente.


-1

Per i tipi di posta personalizzati, NON suggerisco di utilizzare l'hook:

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

invece suggerisco di usare:

add_filter( 'register_post_type_args', 'your_func', 10, 2 );
function your_func( $args, $name ) 
{
   if ( $name == "your_custom_post_name" ) 
   ...
}

il suggerimento è valido, ma non risponde alla domanda.
Aurovrata,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.