Limitare la visualizzazione dei custom post type in base al ruolo utente

23 apr 2013, 18:06:36
Visualizzazioni: 23.2K
Voti: 5

Ho creato un custom post type e alcuni ruoli utente personalizzati e vorrei poter limitare la visualizzazione del post type in base a ruoli specifici.

Esiste un modo semplice per implementare questa restrizione?

2
Commenti

Per favore incolla il tuo codice. Cosa hai già provato?

Brad Dalton Brad Dalton
12 gen 2014 23:53:50

Controlla qui. Potrebbe esserti utile

how-to-restrict-specific-post-types-from-being-read-or-added-by-specific-user-roles

TBI Infotech TBI Infotech
27 giu 2014 16:18:50
Tutte le risposte alla domanda 4
0

Ogni ruolo ha delle capacità.

Ecco un semplice contributore al nostro progetto: (può solo scrivere e modificare)

add_role('contributor', 'Contributore', array(
    'read' => true,
    'edit_posts' => true,
    'delete_posts' => false,
));

Ora ha una nuova capacità (può modificare i post di altre persone)

function add_capability()
{
    $role = get_role('contributor');
    $role->add_cap('edit_others_posts');
}
add_action('admin_init', 'add_capability');

Ora aggiungiamo le sue nuove capacità per il nostro nuovo tipo di post. Prima creiamo il tipo di post:

function create_myposttype()
{
    register_post_type(
        'myposttype',
        array(
            'public' => true,
            'capability_type' => 'myposttype',
            'capabilities' => array(
                'publish_posts' => 'publish_myposttypes',
                'edit_posts' => 'edit_myposttypes',
                'edit_others_posts' => 'edit_others_myposttypes',
                'read_private_posts' => 'read_private_myposttypes',
                'edit_post' => 'edit_myposttype',
                'delete_post' => 'delete_myposttype',
                'read_post' => 'read_myposttype',
            ),
        )
    );
}
add_action('init', 'create_myposttype');

Il tipo di post è stato creato ma il contributore non ha alcun potere su di esso. Diamogli un po' di poteri:

function add_capability()
{
    $role = get_role('contributor');
    $role->add_cap('read_myposttype');
    $role->add_cap('edit_myposttypes');
    $role->add_cap('delete_myposttype', false); // per sicurezza
}
add_action('admin_init', 'add_capability');

La capacità read_post e read_* assicura che l'utente con quel ruolo assegnato non possa vedere e accedere a quell'area. Riceverà il generico errore di Wordpress:

Non hai i permessi sufficienti per accedere a questa pagina

E ora facciamo in modo che i nostri autori (quel ruolo predefinito) non possano vedere i post di tipo myposttype:

function remove_author_capability()
{
    $role = get_role('author');
    $role->add_cap('read_myposttype', false);
}
add_action('admin_init', 'remove_author_capability');

Ricordati di pulire:

function add_roles_on_activation() // aggiunge i ruoli all'attivazione
{
    add_role('contributor', 'Contributore', array(
        'read' => true,
        'edit_posts' => true,
        'delete_posts' => false,
    ));
}
register_activation_hook(__FILE__, 'add_roles_on_activation');

function add_roles_removal()  // puliamo dopo di noi
{
    remove_role('contributor');
}
register_deactivatin_hook(__FILE__, 'add_roles_removal');

Ora se vuoi solo rimuovere elementi dal menu (rendendoli comunque accessibili tramite URL) ecco come:

Dalla adminbar (quel piccolo menu fluttuante in alto):

function my_edit_adminbar($wp_admin_bar)
{
    if(current_user_can('read_myposttype'))
        $wp_admin_bar->remove_node('new-myposttype');
}
add_action('admin_bar_menu', 'my_edit_adminbar');

Dal menu:

function my_edit_menu()
{
    if(current_user_can('read_myposttype'))
    {
        $slug = 'edit.php?post_type=myposttype';
        remove_menu_page($slug);
    }
}
add_action('admin_menu', 'my_edit_menu');
3 set 2014 19:46:10
1

Beh... non vedo alcun codice... quindi non so se hai creato il custom post type da solo o hai usato un plugin. Presumo che tu abbia creato il custom post type in functions.php. Lì puoi inserire un'istruzione if per verificare se l'utente ha determinate capacità.

<?php current_user_can( $capability, $args ); ?>

Sarebbe davvero utile se potessi postare del codice, così posso fornire un esempio specifico su come fare questo.

http://codex.wordpress.org/Function_Reference/current_user_can

23 apr 2013 18:34:19
Commenti

Questo si applica alle capacità e non ai ruoli. Poiché l'impostazione viene salvata nel database wp_user_roles, qualsiasi funzione dovrebbe essere eseguita una sola volta.

Brad Dalton Brad Dalton
13 gen 2014 00:17:09
0

Prima di tutto, ecco come possiamo ottenere il ruolo dell'utente corrente.

<?php 

// Ottieni l'ID dell'utente corrente
$user_id = get_current_user_id(); 

// Ottieni i dati dell'utente basati su questo ID
// restituiti in un array
$user_data = new WP_User( $user_id );


// Potremmo visualizzare il primo elemento del ruolo 
// nell'array in questo modo...   
echo $user->roles[0];


// Oppure potremmo stampare l'intero
// array in questo modo 
print_r($user->roles);

?> 

Ora potremmo usare i dati sopra per costruire un semplice if statement nei template. Questo varierà a seconda di ciò che stai cercando di ottenere ma...

<?php 

$user_roll = $user->roles[0];
if($user_roll =="administrator") {

    // Il codice qui verrà eseguito solo se l'utente
    // corrente è un amministratore
}
?> 

Hai capito il concetto ;)

28 mag 2014 02:24:08
0

Quando si registra un Custom Post Type (CPT) utilizziamo l'hook di azione init:

add_action( 'init', 'my_custom_post_type_function', 0 );

Quindi ciò di cui abbiamo bisogno è inserire una condizione basata sul ruolo dell'utente attorno alla registrazione specifica del CPT in due passaggi:

1. Creare una funzione che restituisca il ruolo dell'utente corrente come stringa

    function my_get_current_user_role() {
     $user = wp_get_current_user();
     $roles = (array)$user->roles;
     return $roles[0];
    }

2. Poi restringere

    if(my_get_current_user_role() == 'administrator'){
     add_action( 'init', 'my_custom_post_type_function', 0 );
    }
1 dic 2021 17:37:04