Restricționează vizualizarea tipurilor de postări personalizate în funcție de rolul utilizatorului
Am creat un tip de postare personalizat și am creat câteva roluri personalizate pentru utilizatori și vreau să pot restricționa vizualizarea tipului de postare în funcție de rolurile specifice.
Există o modalitate simplă de a restricționa acest lucru?
Fiecare rol are capacități.
Iată un simplu contributor pentru efortul nostru: (el doar scrie și editează)
add_role('contributor', 'Contributor', array(
'read' => true,
'edit_posts' => true,
'delete_posts' => false,
));
Acum el are o nouă capabilitate (poate edita postările altor persoane)
function add_capability()
{
$role = get_role('contributor');
$role->add_cap('edit_others_posts');
}
add_action('admin_init', 'add_capability');
Acum să adăugăm noile sale capabilități pentru noul nostru tip de postare. Mai întâi să creăm tipul de postare:
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');
Tipul de postare este creat, dar contributorul nu are nicio putere asupra lui. Să-i dăm ceva putere:
function add_capability()
{
$role = get_role('contributor');
$role->add_cap('read_myposttype');
$role->add_cap('edit_myposttypes');
$role->add_cap('delete_myposttype', false); // pentru siguranță
}
add_action('admin_init', 'add_capability');
Capabilitățile read_post și read_* asigură că utilizatorul cu acel rol atribuit nu va putea vedea și accesa acea zonă curentă. Va primi acea eroare generică WordPress:
Nu aveți permisiuni suficiente pentru a accesa această pagină
Și să ne asigurăm că autorii noștri (acel rol implicit) nu pot vedea postările myposttype:
function remove_author_capability()
{
$role = get_role('author');
$role->add_cap('read_myposttype', false);
}
add_action('admin_init', 'remove_author_capability');
Nu uitați să curățați:
function add_roles_on_activation() // adăugăm roluri la activare
{
add_role('contributor', 'Contributor', array(
'read' => true,
'edit_posts' => true,
'delete_posts' => false,
));
}
register_activation_hook(__FILE__, 'add_roles_on_activation');
function add_roles_removal() // ne curățăm după noi
{
remove_role('contributor');
}
register_deactivation_hook(__FILE__, 'add_roles_removal');
Acum, dacă doriți doar să eliminați elemente din meniu (făcându-le accesibile prin URL oricum), iată cum:
Din bara de administrare (acel meniu mic plutitor din partea de sus):
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');
Din meniu:
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');

Ei bine... nu văd niciun cod... așa că nu știu dacă ai creat tu tipul personalizat de postare sau ai folosit un plugin. Presupun că ai creat tipul personalizat de postare în functions.php. Acolo poți avea o instrucțiune if pentru a verifica dacă utilizatorul are anumite capabilități.
<?php current_user_can( $capability, $args ); ?>
Ar fi foarte util dacă ai putea posta niște cod, astfel încât să pot oferi un exemplu specific despre cum să faci asta.
http://codex.wordpress.org/Function_Reference/current_user_can

În primul rând, iată cum putem obține rolul utilizatorului curent.
<?php
// Obține ID-ul utilizatorului curent
$user_id = get_current_user_id();
// Obține datele utilizatorului bazate pe acest ID
// returnate sub formă de array
$user_data = new WP_User( $user_id );
// Putem afișa primul rol din array
// astfel...
echo $user->roles[0];
// Sau putem afișa întregul
// array astfel
print_r($user->roles);
?>
Acum putem folosi datele de mai sus pentru a construi o simplă condiție if în template-uri. Aceasta va varia în funcție de ce încercați să realizați, dar...
<?php
$user_roll = $user->roles[0];
if($user_roll =="administrator") {
// Codul aici va fi executat doar dacă
// utilizatorul curent este administrator
}
?>
Înțelegeți ideea ;)

Când înregistrăm un Tip Personalizat de Postare (CPT), folosim hook-ul de acțiune init
:
add_action( 'init', 'my_custom_post_type_function', 0 );
Deci, ceea ce trebuie să facem este să punem o condiție bazată pe rolul utilizatorului în jurul acestei înregistrări specifice de CPT în două etape:
1. Avem nevoie de o funcție care să returneze rolul curent al utilizatorului ca șir de caractere
function my_get_current_user_role() {
$user = wp_get_current_user();
$roles = (array)$user->roles;
return $roles[0];
}
2. Apoi restricționăm
if(my_get_current_user_role() == 'administrator'){
add_action( 'init', 'my_custom_post_type_function', 0 );
}
