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() :

  $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():

    $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 è:

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:

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:

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.