• Chi sono
  • Contattami
  • Feed RSS
  • FlipBoard

Karibusana

  • MacOs
  • WordPress
  • iPhone
  • Jailbreak
  • Marketing
  • SEO
Ti trovi qui: Home / WordPress / Come creare contenuti privati per utenti

Come creare contenuti privati per utenti

Aggiornato da Vincenzo Vecchio il 29 Luglio, 2020 3 commenti

Qualche tempo fa avevo scritto un articolo su come creare un’area riservata in WordPress senza l’utilizzo di plugins grazie ai custom post type, è infatti possibile proteggere degli articoli per tutti gli utenti che hanno il ruolo di sottoscrittore.

Un lettore mi ha chiesto se fosse possibile attribuire gli articoli a degli specifici utenti, in questo articolo vi spiego come fare. Le nuove funzionalità permetteranno di:

  • Inserire contenuti visibili a tutti gli utenti aventi accesso con il ruolo subscriber
  • Inserire contenuti assegnati a un singolo utente

Quando l’utente si loggerà vedrà un elenco di contenti misti, alcuni visibili a tutti, alcuni solo per lui. Di seguito uno screenshot dell’area privata

Area privata WordPress contenuti per singolo utente

Se hai dimestichezza con WordPress puoi implementatare le modifiche utilizzando il seguente codice. Se invece preferisci utilizzare un plugin ne ho sviluppato uno ad hoc, questo plugin ti permette anche di attribuire gli articoli privati a più di un utente e aggiunge anche una sidebar all’area privata dove poter inserire dei widget specifici per gli utenti che hanno accesso all’area privata.

Checkout Aggiunto al carrello

Modifichiamo il file functions.php

Per prima cosa inseriamo il seguente codice nel file functions.php del nostro tema. Questo ci permetterà di creare un nuovo custom post type chiamato Area Riservata

// Creo il post type per l’area riservata
function karibusana_create_post_type() {

    $labels = array(

        'name'           		=> __('Area riservata'),
        'singular_name'  		=> __('Contenuto'),
        'add_new'        		=> __('Aggiungi contenuto'),
        'add_new_item'  		=> __('Nuovo contenuto'),
        'edit_item'      		=> __('Modifica contenuto'),
        'new_item'       		=> __('Nuovo contenuto'),
        'all_items'      		=> __('Elenco contenuti'),
        'view_item'      		=> __('Visualizza contenuti'),
        'search_items'   		=> __('Cerca contenuto'),
        'not_found'      		=> __('Contenuto non trovato'),
        'not_found_in_trash' 	=> __('Contenuto non trovato nel cestino'),

    );

    $args = array(

        'labels'            => $labels,
        'public'            => true,
        'rewrite'           => array('slug' => 'contenuti'),
        'has_archive'       => true,
        'hierarchical'      => false,
        'menu_position'     => 5,
        'supports'          => array(
                                'title',
                                'editor',
                                'thumbnail',
                                'comments'
                                ),
    );

   register_post_type('area-riservata', $args);

}

add_action('init', 'karibusana_create_post_type');

Funzioni aggiuntive

Inseriamo una serie di funzioni che servono per il funzionamento del sistema:

  • Rendiamo i post del custom post type privati di default
  • Rendiamo i post privati visibili ai sottoscrittori
  • Rimuoviamo la parola privato dal titolo del post
  • Nascondiamo la barra di WordPress agli utenti con il ruolo sottoscrittore
//rendo il post type privato di default
function karibusana_force_type_private ($post) {

    if ($post['post_type'] == 'area-riservata') {
        if ($post['post_status'] == 'publish') {
	        $post['post_status'] = 'private';
        } 
    }

    return $post;
}

add_filter('wp_insert_post_data', 'karibusana_force_type_private');

$subRole = get_role('subscriber');
// Rendo il post privato visibile al ruolo sottoscrittore
$subRole->add_cap('read_private_posts');

function karibusana_remove_private_post_prefix($format) {
    return '%s';
}
 
add_filter( 'private_title_format', 'karibusana_remove_private_post_prefix', 99, 2 );

// Nascondo la barra di wordpress tranne che all’admin
if (!current_user_can('manage_options')) {
	add_filter('show_admin_bar', '__return_false');
}

if (!current_user_can('edit_posts')) {
	add_filter('show_admin_bar', '__return_false');
}

Aggiungiamo un custom metabox

Con il seguente codice possiamo aggiungere un custom metabox all’interno dell’editor degli articoli, per mostrare un menù a tendina con una lista di tutti gli utenti che hanno il ruolo sottoscrittore. Per questa funzione ho tratto spunto da un articolo che ho trovato su smashing magazine.

Di default il nostro select box è impostato su tutti, lasciate questa opzione se volete mostrare l’articolo a tutti gli utenti con il ruolo di sottoscrittore oppure scegliete uno scpecifico utente dal menù a tendina.

// creo il metabox per il post type area riservata
function users_meta_init(){
  add_meta_box("users-meta", "Seleziona utenti", "users", "area-riservata", "normal", "high");
}

add_action("admin_init", "users_meta_init");

// lista degli utenti
function users(){

  global $post;

  $custom = get_post_custom($post->ID);
  $users = isset($custom["users"][0]);

	$user_args  = array(
		// cerco solo gli utenti di tipo sottoscrittore
		'role' => 'Subscriber',
		'orderby' => 'display_name'
	);

	// creo la WP_User_Query object
	$wp_user_query = new WP_User_Query($user_args);
	// richiamo i risultati
	$subscribers = $wp_user_query->get_results();
	// controllo i risultati
	if (!empty($subscribers)) {

	    // l’attributo di name è la chiave del customfield
	    echo "<select name='users'>";
	    	echo '<option value="all">Tutti</option>';
		    // loop che mostra tutti i sottoscrittori
		    foreach ($subscribers as $subscriber){

		        // Richiamo i dati dei sottoscrittori
		        $subscriber_info = get_userdata($subscriber->ID);
		        $subscriber_id = get_post_meta($post->ID, 'users', true);
		        if($subscriber_id == $subscriber_info->ID) { 
		        	$subscriber_selected = 'selected="selected"'; 
		        } else { 
		        	$subscriber_selected = '';
		        }

		        echo '<option value='.$subscriber_info->ID.' '.$subscriber_selected.'>'.$subscriber_info->display_name.'</option>';
		    }

	    echo "</select>";

	} else {

	    echo 'Nessun utente trovato';

	}

}

function karibusana_save_userlist(){

  global $post;
	
	if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
	    return;
	}

   if(isset($_POST["users"])){

   update_post_meta($post->ID, "users", sanitize_html_class($_POST["users"]));
	}

}

// salvo l’impostazione della lista
add_action('save_post', 'karibusana_save_userlist');

Template Area Riservata

Una volte eseguitre le modifiche al nostro file functions.php dobbiamo creare un nuovo template perosnalizzato che ci permetterà di elencare i diversi post filtrandoli a seconda dei permessi che abbiamo impostato. Basterà creare un nuovo file areariservata.php che inseriremo nel cartella del nostro tema.

<?php
/*
Template Name: Area Riservata
*/

get_header(); 

// Controllo che l'utente sia loggato
if (is_user_logged_in()) {

	$current_user = wp_get_current_user();

	// Funzione per ottenere il nome e cognome dell'utente
	function karibusana_get_users_name( $user_id = null ) {
		$user_info = $user_id ? new WP_User($user_id) : $current_user;
		if ( $user_info->first_name ) {
			if ( $user_info->last_name ) {
				return $user_info->first_name . ' ' . $user_info->last_name;
			}
			return $user_info->first_name;
		}
		return $user_info->display_name;
	
	}

	// Funzione per ottenere il ruolo dell'utente
	function karibusana_get_user_role ($user, $role) {
		  $roles = $user->roles; 
		  return in_array($role, (array) $user->roles);
	
	}

	// ID dell'utene loggato
	$user_id = $current_user->ID;

	// Mostro messaggio di benvenuto
	echo 'Benvenuto, '.karibusana_get_users_name($user_id).'<hr/>';

	// Controllo il ruolo dell'utene, se amministratore allora mostra tutti i contenuti altrimenti solo quelli dell'utente
	if(karibusana_get_user_role ($current_user, 'administrator')) {

		// loop con tutti i contenuti
		$wpquery = new WP_Query(array(
			'post_type'	=> 'area-riservata',
		));

	} else {

		//loop con i contenuti del relativo utente + quelli contrassegnati come all
		$wpquery = new WP_Query(array(  'post_type'	=> 'area-riservata',
										'meta_query' => array(
										'relation' => 'OR',
											array(  'key' => 'users',
													'value' => $user_id,
													'compare' => '=' 
											),
											array(  'key' => 'users',
													'value' => 'all',
												    'compare' => '='
											)
										)
								    )
								);

	}

if ( $wpquery -> have_posts() ) : while ( $wpquery -> have_posts() ) : $wpquery -> the_post(); ?>

<div class="post">
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2><br>
<?php the_content('Leggi…');?>
</div>
<hr/>

<?php endwhile; else: ?>

<div class="post">

<h3>Spicenti, non ci sono contenuti</h3>

</div>

<?php endif; 

 echo "<a href=" . wp_logout_url( home_url() ) . " title='Logout'>Logout</a>";	

} else { ?>

	Area Riservata

	<h2>Login</h2>

	<?php wp_login_form(); ?>

	<?php } ?>

</div>

<?php get_footer(); ?>

Spero questo articolo sia stato di vostro gradimento, lasciatemi un commento se dovesse servirvi aiuto e non dimenticate di condividere questo articolo sui social.

Altri articoli che potrebbero interessarti

Cosa cambia in WordPress 3.8?
sito per amministratori di condominio
Creare un sito per l’amministrazione condominiale
Child theme in wordpress
Introduzione all’uso dei child theme in WordPress

Vincenzo Vecchio

Appassionato di tecnologia. Da molti anni mi occupo della realizzazione di siti web utilizzando i più comuni CMS. In particolare WordPress e Joomla. Di recente mi sono anche avvicinato al modo Apple e a tutti i suoi prodotti.

Seguimi su : FacebookGoogle+Twitter

Commenti

  1. luciano dice

    26 Luglio 2020 alle 10:41

    Gentile Vincenzo grazie per l’articolo che funziona perfettamente. Le volevo chiedere se è possibile inserire un controllo sul metabox per evitare che ci si dimentichi di attribuire l’autore al post?
    Grazie mille

    Rispondi
    • Vincenzo dice

      27 Luglio 2020 alle 0:04

      Ciao Luciano, si è possibile ma richiede del tempo per svilupparlo. Credo che lo inserirò nella versione pro del plugin. Contattami in privato se sei interessato

    • Vincenzo dice

      29 Luglio 2020 alle 20:13

      Ho aggiunto la funzione di validazione nella versione pro del plugin.

Lascia un commento Annulla risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

Articoli Recenti

  • Come creare contenuti privati per utenti
  • Come disabilitare la GPU AMD Radeon su MacBook Pro
  • Come creare area riservata WordPress senza plugins
  • GDPR e WordPress la guida definitiva per il tuo sito
  • Come ottimizzare i CSS per avere 100/100 su Google PageSpeed
  • Integrare Gravity Forms con MyCred

Commenti Recenti

  • Vincenzo su Area riservata su WordPress con WP Customer Area
  • Franco P. su Area riservata su WordPress con WP Customer Area
  • Vincenzo su Area riservata su WordPress con WP Customer Area
  • Fabio su Area riservata su WordPress con WP Customer Area

Archivi

  • Febbraio 2020 (1)
  • Dicembre 2019 (1)
  • Agosto 2018 (1)
  • Aprile 2018 (1)
  • Marzo 2018 (1)

© 2025 · Cookie Policy · Privacy Policy