Può essere un’esigenza comune a varie tipologie di progetto quella di imporre dei limiti alla pubblicazione di articoli o post type per determinati ruoli utente. Prendiamo ad esempio il caso di portali wordpress che prevedono l’attivazione di sottoscrizioni a diversi ‘packages’ a costo cresente, ciascuno dei quali consenta la possibilità di inserire offerte e / o strutture in numero variabile.
In questo caso occorre per prima cosa distinguere i ruoli utente creando i ruoli necessari con la funzione add_role() :
1 2 3 4 5 6 7 8 |
$my_role=add_role( 'package1', 'Entry', array( 'read' => true, 'read_private_pages'=>true,//consente di accedere ad una pagina privata ( es.un pannello di controllo custom) ) ); |
successivamente alla creazione del ruolo possiamo definire le “capabilities” attribuite al ruolo “package1” definito da get_role():
1 2 3 4 5 6 7 8 9 10 11 |
$role = get_role( 'package1' ); $role->add_cap( 'read' ); $role->add_cap( 'read_private_pages' $role->add_cap( 'upload_files' ); $role->add_cap( 'edit_aziende' ); $role->add_cap( 'edit_azienda' ); $role->add_cap( 'publish_posts' ); $role->add_cap( 'edit_published_aziende'); $role->add_cap( 'edit_offerta' ); $role->add_cap( 'edit_offerte' ); $role->add_cap( 'delete_offerta' ); |
con le quali definiamo quali sono le azioni che l’utente può eseguire (le custom capabilities sono state definite in precedenza nella creazione dei post_type)
Entrambi gli snippet di cui sopra vanno eseguite sull’hook “init”, quindi il codice completo è:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
function SOFT_set_custom_role(){ $my_role=add_role( 'package1', 'Entry', array( 'read' => true, 'read_private_pages'=>true,//consente di accedere ad una pagina privata ( es.un pannello di controllo custom) ) ); $role=get_role(package1); $role->add_cap( 'read' ); $role->add_cap( 'read_private_pages' $role->add_cap( 'upload_files' ); $role->add_cap( 'edit_aziende' ); $role->add_cap( 'edit_azienda' ); $role->add_cap( 'publish_posts' ); $role->add_cap( 'edit_published_aziende' ); $role->add_cap( 'edit_offerta' ); $role->add_cap( 'edit_offerte' ); $role->add_cap( 'delete_offerta' ); } add_action('init','SOFT_set_custom_role'); |
A questo punto avremo un ruolo utente a cui possiamo imporre determinati limiti:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
add_action( 'admin_init', 'SOFT_check_post_limit' ); function SOFT_check_post_limit() { //limiti di pubblicazione per pacchetti di aziende e offerte global $pagenow, $typenow, $current_user, $userdata,$wpdb; if('package1'==$userdata->roles[0] ){ //L'utente corrente ha il ruolo package1 if($typenow == 'aziende' && ($pagenow == 'post-new.php' || ($pagenow == 'post.php' && isset($post)))){ $backUrl = admin_url('edit.php?post_type=aziende&az_notification=1'); $item_count = $wpdb->get_var( "SELECT count(*) FROM $wpdb->posts WHERE (post_status = 'publish' OR post_status = 'draft' OR post_status = 'pending') AND post_type = 'aziende' AND post_author = $userdata->ID" ); if( $item_count >= 1 ) {// header('Location: ' . $backUrl); exit(); } } elseif( $typenow == 'offerte' && ($pagenow == 'post-new.php' || ($pagenow == 'post.php' && isset($post)))){ $backUrl = admin_url('edit.php?post_type=offerte&off_notification=1'); $shopinfo_count = $wpdb->get_var( "SELECT count(*) FROM $wpdb->posts WHERE (post_status = 'publish' OR post_status = 'draft' OR post_status = 'pending') AND post_type = 'offerte' AND post_author = $userdata->ID" ); if( $item_count >= 3 ) { header('Location: ' . $backUrl); exit(); } } } return; } |
In questo modo, verificato che l’utente ha raggiunto il limite massimo di articoli (o, come in questo caso i post type “aziende” e e “offerte” ) consentiti al ruolo, lo reindirizziamo alla pagina di elenco, aggiungendo un parametro in $_GET che ci consente di mostrare una notifica all’utente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function SOFT_show_notices { global $registerMessages; if(isset($_GET['az_notification']) && $_GET['az_notification'] == '1'){ echo '<div class="error"><p>'.__('Spiacenti, avete raggiunto il massimo numero di Aziende inseribili con il vostro pacchetto di iscrizione, contattate l\'amministrazione per un eventuale upgrade!','softrade').'</p></div>'; } if(isset($_GET['off_notification']) && $_GET['az_notification'] == '1'){ echo '<div class="error"><p>'.__('Spiacenti, avete raggiunto il massimo numero di Offerte inseribili con il vostro pacchetto di iscrizione, contattate l\'amministrazione per un eventuale upgrade!','softrade').'</p></div>'; } if(isset($registerMessages)){ echo '<div class="updated"><p>'.$registerMessages.'</p></div>'; } } add_filter( 'admin_notices', 'SOFT_show_notices' ); |
che viene dunque avvisato correttamente.
Ovviamente è possibile modificare le clausole condizionali a proprio piacimento, arrivando a definire in maniera capillare limiti anche per singoli utenti e adattare queste funzioni ad ogni esigenza progettuale.
Leave A Comment