Creare un Area Riservata con WordPress vol.2: visualizzare contenuti Diversi / Comuni

By Andrea Marchetti - 21 Ott , 2014

Creare un Area Riservata con WordPress vol.2:  visualizzare contenuti Diversi / Comuni
Area Riservata 2.0

Già in passato avevamo visto come realizzare un area riservata con wordpress. Nei precedenti tutorial i contenuti potevano essere visualizzati o da tutti gli utenti aventi accesso all’area riservata o singolarmente da un singolo utente.

La nuova Area Riservata vol.2 combina queste due funzionalità in un unico strumento di pubblicazione di contenuti riservati:

  • potranno essere inseriti contenuti visibili a tutti gli aventi accesso
  • potranno essere inseriti contenuti assegnati a un singolo utente

Gli utenti che accedono all’area devono essere iscritti come sottoscrittori al sito e non vedranno il backend di wordpress.

Quando l’utente si loggerà vedrà un elenco di contenti misti, alcuni visibili a tutti, alcuni solo per lui. Questa nuova versione introduce anche altri miglioramenti che semplificando l’installazione.

Functions.php

Come prima cosa apriamo il file functions.php di wordpress e definiamo un nuovo custom post type area riservata.

//creo il post type per l'area riservata
add_action('init', 'crea_contenuti');
function crea_contenuti() {
$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);
}

A seguire inseriamo una serie di instruzioni che servono per il funzionamento del sistema:

  • rendo i post del custom post type privati di default
  • rendo i post privati visibili ai sottoscrittori
  • rimuoviamo la parola privato dal titolo del post
  • nascondiamo la barra di wordpress
//rendo il post type privato di default
function 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', 'force_type_private');
//rendo il post privato visibile al ruolo sottoscrittore
$subRole = get_role( 'subscriber' );
$subRole->add_cap( 'read_private_posts' );
// rimuovo privato dal titolo
function clean_title($titolo) {
$titolo = esc_attr($titolo);
$cerca = array(
'#Privato:#'
);
$sostituisci = array(
'-' // Sostituiamo la voce "Privato" con
);
$titolo = preg_replace($cerca, $sostituisci, $titolo);
return $titolo;
}
add_filter('the_title', 'clean_title');
//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');
}

Ora andiamo alla parte fondamentale della nuova area riservata, il custom metabox con la lista degli utenti iscritti al sito.

// creo il metabox per il post type area riservata
function users_meta_init(){
add_meta_box("users-meta", "User Select", "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 'No authors found';
}
}
// salvo l'impostazione della lista
add_action('save_post', 'save_userlist');
function save_userlist(){
global $post;
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return $post->ID;
}
update_post_meta($post->ID, "users", $_POST["users"]);
}

Con questo codice creaimo un metabox con all’interno una selectbox Visibilità Utenti; questa select contiene l’elenco di tutti gli utenti inscritti al sito, di default è impostata su Tutti.

Selzionando uno degli utenti assegnamo il contenuto che stiamo pubblicando solo a quell’utente. Nell’esempio visibile a Mario.

Template Area Riservata

Ora che abbiamo creato il motore della nostra area riservata dobbiamo visualizzare i contenti. Creaimo un custom template areariservata.php che inseriremo nel cartella del nostro tema.

<?php
/*
Template Name: Area Riservata
*/
?>
<?php get_header(); ?>
<?php //se l'utente è loggato mostra messaggio di benvenuto e post
if ( is_user_logged_in() ) {?>
<?php //info dell'utente loggato
global $current_user;
get_currentuserinfo();
$my_user = $current_user->user_login ;
$my_user_level = $current_user->user_level ;
$my_user_id = $current_user->ID;
echo 'Benvenuto, '. $my_user;
?>
<hr />
<?php //se l'utente è l'admin mostro tutti i contenuti, altrimenti mostro quelli dell'utente associato al post
if($my_user_level == 10) {
//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' => $my_user_id,
'compare' => '='
),
array(
'key' => 'users',
'value' => 'all',
'compare' => '='
)
)
)
);
}
?>
<?php if ( $wpquery -> have_posts() ) : while ( $wpquery -> have_posts() ) : $wpquery -> the_post(); ?>
<?php //richiamo le info dell'utente associato al post
$user_selected = get_post_meta($post->ID, 'users', TRUE);
$user_info = get_userdata($user_selected);
?>
<div class="post">
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<?php the_content('Leggi...');?>
<?php if($user_selected == 'all') { ?>
<small><i><?php  echo 'Contenuto per Tutti'; ?></i></small>
<?php } else  { ?>
<small><i><?php  echo 'Contenuto per l\'utente: ' . $user_info->user_login . "\n";	 ?></i></small>
<?php } ?>
</div>
<hr />
<?php endwhile; else: ?>
<div class="post">
<h3>Spicenti, non ci sono contenuti...</h3>
</div>
<?php endif; ?>
<a href="<?php echo wp_logout_url( home_url() ); ?>" title="Logout">Logout</a>	
<?php } else { ?>
Area Riservata
<h2>Login</h2>
<?php wp_login_form(); ?>
<?php } ?>
</div>
<?php get_footer(); ?>

Una volta impostato il template in una pagina wordpress, quando visualizzeremo la pagina ci apparirà (se non si è loggati) un form per il log-in.

Inseriti user e password ed effettuato l’accesso, la pagina mostra un messaggio di benvenuto e i post relativi all’utente loggato, più quelli visibili a tutti. (L’utente di livello admin vede tutto).

Ricapitolando di default il contenuto che pubblichiamo nell’area riservata è visibile a tutti gli utenti che hanno accesso. Se volgiomo pubblicare un contenuto per un singolo utente, basterà selezionare l’utente nella lista Visibilità Utenti e pubblicare.

Con questa soluzione l’utene visualizzerà contenuti personali e altri comuni a tutta l’area riservata. Le applicazioni sono molte, amministratori di condomini, assietanza clienti di aziende, siti di istituti scolastici e altro ancora.

I file per il download sono disponibili qui di seguito, se avete applicazioni interessanti o suggermenti lasciateli nei commenti.

Stay Tuned!

demo

Se ti và ringraziami con un Like a MarchettiDesign.net.

Oppure offrimi un caffè :-)
download

Commenti Facebook

40 Commenti

  1. Nicola ha detto:

    Ciao Andrea.

    Trovo che questo post e quello precedente siano fantastici perchè sono proprio quelli che mi servono per creare il sito di un amministratore di condominio (come tu già citi). Sono settimane che cercavo soluzioni con plugin,widget ecc ecc..ma non ho trovato nulla che mi abbia soddisfatto come questi due articoli.
    Se posso (e credo che anche gli altri utenti siano interessati) io sto usando questi plugin:

    Members: per la creazione di nuovi ruoli ( ho administrator, condòmini e sottoscrittori.Questi ultimi sono gli utenti NON condòmini che potranno accedere a tutte le sezioni del sito (es. blog) TRANNE nell’area condòmini che apparirà a menù se appunto l’utente fà parte di quel gruppo)

    Peter’s Login Redirect: per gestire i redirect dei login/logout in base ai ruoli

    User Access Manager: per creare gruppi (in questo caso saranno i Condomìni (es: Via Roma 43)).

    Quando si iscrive un utente farà parte del ruolo sottoscrittore. Si interviene manualmente per modificarlo come condòmino e aggiungere il o i flag gruppi (perchè un condòmino può far parte di più condomìni gestiti).
    A questo punto si entra nell’area condòmini dove ci saranno la lista dei suoi condomìni di cui fa parte.
    Entrando in uno di questi entrerà in gioco tutto quello che hai descritto (con ovvie modifiche).
    Il condòmino vedrà tutti i file generali del condomìnio + i suoi.

    Spero di non fare troppi passaggi macchinosi per gestire il tutto e mi piacerebbe confrontarmi o ricevere consigli con uno sicuramente più esperto =)

    P.S: la documentazione da te rilasciata funziona solo nel caso in cui la pagina si chiama AREA RISERVATA ed usi il template medesimo.
    Se la pagina la chiamo HOME e uso il template A.R. non funziona.

    • Andrea Marchetti ha detto:

      Ciao Nicola, grazie dei complimenti, più plug-in usi per realizzare una funzionalità piu ci sono rischi di malfunzionamento,
      con i dovuti test non ci sono problemi ad usare comunque vari plugin insieme.

      Per la pagina home wordpress a una sua gerarchia:

      http://codex.wordpress.org/Template_Hierarchy

      Può darsi che il template areariservata sia “sovrascritto” da un altro template..

  2. Emanuele ha detto:

    Buongiorno, non riesco a capire in che modo il post è collegato all’utente perchè vorrei far apparire affianco al titolo nella lista dei post (lato admin) l’utente a cui è associato.

    Grazie.

    • Andrea Marchetti ha detto:

      Ciao Emanuele,
      nella wpquery nel loop del custom template vengono confrontati id dell’utente corrente e id dell’utene asseganto al post se sono ugauli viene mostrato il post..

      • Emanuele ha detto:

        Ciao, si si la query di interrogazione l’ho capita, non riesco a capire in fase di salvataggio dove si va a salvare l’id dell’utente

  3. cristian ha detto:

    Ciao Andrea come sempre ottimo tutorial..complimenti!!
    Ho provato la tua area riservata sul template twenty twelve di wp e devo dire che risulta molto efficace e semplice da “installare”. Riuscirei ad installarlo anche in un template premium con lo stesso procedimento??
    Ho notato inoltre che il titolo del post contenuto mi compare linkato e mi restituisce un errore 404.

  4. Giancarlo ha detto:

    Ciao Marchetti! Questo post è veramente eccezionale..gran lavoro!
    Vorrei chiederti soltanto una cosa: laddove c’è il metabox “Visibilità utenti”, nella selezione appaiono i nomi utenti, oltre alla voce “tutti”. Vorrei che apparisse il “firstname” invece dell’ “user”. Qual è la linea di codice che dovrei modificare? Grazie per l’aiuto in anticipo!

  5. olgerva ha detto:

    Ottimo articolo
    Ho un problema …
    Applicando il tuo procedimento al Thema AVADA, se io sono loggato lato dashboard come amministratore, vedo tutto correttamente.
    Se viceversa, apro il sito e cerco di loggarmi dalla pagina specifica “provato” (la pagina con template areariservata, mi continua a dare not found 404….

    Non capisco dove potrebbe stare il problema.
    Grazie per l’interesse.

    • olgerva ha detto:

      Ciao
      Nel frattempo ho fatto alcune prove e sembra che SOLO con il tema AVADA io abbia questo problema.
      Proverò a scivere anche ad AVADA e vediamo

      Grazie per eventuali suggerimenti

    • paolo ha detto:

      complimenti andrea
      anch’io però riscontro lo stesso problema di olgerva
      questo il tema avada il link alla pagina dell’articolo genera un errore 404
      sto verificando soluzioni e sono graditi suggerimenti
      grazie

    • paolo ha detto:

      Aggiornamento:
      magicamente nel navigare tra una pagina e l’altra
      adesso funziona anche il link alla pagina dell’articolo riservato
      unica correzione effettuata è al codice copiato ed incollato in functions.php
      la riga non interpretata correttamente è
      echo ‘Tutti’;

  6. igor ha detto:

    Ciao Andrea, complimenti per l’ennesimo utilissimo tutorial. Non ho ben capito però come creare il custom template per area riservata. Quando aggiungo contenuto dall’area riservata e vado su anteprima mi visualizza errore 404 pagina non trovata ( oltre a non darmi la possibilità di flaggare a lato in che pagina postare l’articolo). Qualche consiglio? Grazie!
    Igor_

  7. Luigi ha detto:

    Grazie Andrea per il tutorial, sono riuscito ad implementare tutto. Solo che ti disturbo perché ho due problemi:
    1. Il box di login e password mi appare allineato tutto a sinistra mentre lo vorrei al centro della pagina
    2. Una volta effettuato l’accesso, il contenuto della pagina dedicata a Mario (una photogallery) mi appare sempre allineato a sinistra, ed inoltre molto stretto, tanto che le anteprime delle foto risultano piccolissime.
    Come posso rimediare?
    Ti ringrazio.

  8. oscar ha detto:

    Buongiorno,
    ottimo tutorial!
    sono riuscito a fare tutto ma non capisco perchè quando visualizzo il contenuto dell’area riservata mi mette un titolo con un link che mi riporta ad una pagina che non esiste “404 page not found”.
    Mi crea un link al titolo ma non mi crea le cartelle con il contenuto.

    esempio: http://dynamoviz.com/area/

    A me basterebbe togliere questo link o anche togliere direttamente il titolo

    devo levarlo da function.php o da areariservata.php?

    Grazie

    Oscar

  9. Miriam ha detto:

    Ciao, ottimo tutorial… era in parte quello che mi serviva…

    con questo tutorial riesco a vedere:
    – contenuti visibili a tutti gli aventi accesso;
    – contenuti assegnati a un singolo utente;

    se volessi scegliere più utenti a cui fare vedere i miei contenuti ma non a tutti… sarebbe possibile? Mi basterebbe sostituire la select con una list… O dovrei anche cambiare il codice?

    • afmarchetti ha detto:

      Ciao Miriam, è una delle features che vorrei implemetare in futuro, non è però una cosa semplicissima, se porti avanti il progetto comunicalo qui nel blog 😉

  10. Francesco ha detto:

    Ciao Andrea!

    complimenti per il post è ottimo e funzionale! quello che vorrei fare però è quello di creare liste di utenti e profilare i contenuti per le tipologie di lista. Come poteri interventire partendo da quello che hai realizzato tu?? Hai qualche dritta da darmi in merito?Ti ringrazio in anticipo.
    Francesco

    • afmarchetti ha detto:

      Ciao Francesco, è una delle features che vorrei implemetare in futuro, non è però una cosa semplicissima, se porti avanti il progetto comunicalo qui nel blog 😉

  11. Gabriele ha detto:

    Ciao,
    prima di tutto grazie per l’utilissimo articolo!
    Non capisco solo una cosa: ho fatto tutto come descritto e vedo correttamente l’area riservata nella mia dashboard. Ho pubblicato il contenuto riservato, dando disponibilità a tutti. Come faccio a vedere la pagina di log-in?

  12. Luca ha detto:

    Ciao, ottimo tutorial!!! Ho una domanda:
    Se volessi selezionare più utenti dal menu a tendina è possibile farlo?

    Grazie

  13. Fabrizio ha detto:

    Ciao Andrea, grazie mille per questo tutorial e per tutti i precedenti ad esso connessi.
    Hai quasi risolti tutti i problemi che avevo con i custom post type tranne uno, forse banale, ma con il quale non riesco ad andare avanti.
    Ho creato un custom post type “Inserzioni Pubblicitarie” visibile agli utenti registrati con il ruolo “Inserzionisti” debitamente creato mediante plugin.
    Il mio problema è che nel backend, quando effettuo il login con le credenziali di un “Inserzionista”, vedo anche i custom posts “Inserzioni Pubblicitarie” di altri utenti. Ovviamente in sola visualizzazione, ma non è quello che vorrei in quanto ogni inserzionista deve vedere solo le sue inserzioni.
    C’è una capability da settare in tal senso nel function.php senza dover modificare il file edit.php del core WP?

  14. alessandro ha detto:

    ciao e grazie per l’interesantissimo articolo.
    Io ho un problema: mi scompare il box a destra per selezionare il template areariservata.php.
    La pagina mi si carica col template di default del tema.. Sai dirmi come posso fare?
    grazie!

  15. Ettore ha detto:

    Ciao Andea,
    complimenti per il tutorial… funziona tutto alla perfezione tranne un piccolo dettaglio…
    quando si clicca su uno dei link ai post privati, viene restituito l’errore 404 Page not found…
    Hai qualche suggerimento per risolvere questo errore??
    Grazie…

  16. Ettore ha detto:

    Scusa Andrea, altro piccolo dettaglio…
    Nell’anteprima dell’area riservata, ogni post privato è interamente visualizzato… sarebbe possibile visualizzare solo poche righe del post ed eventualmente un link “continua a leggere” ? se si, mi diresti come modificare il codice?
    Grazie ancora…

  17. lorenzo ha detto:

    ciao andrea. ti chiedo aiuto…. dopo la prima parte delle tue istruzioni, avendo modificato Functions.php, non mi da la possibilità di scegliere un utente, ma mi dice No authors found. aiuto..

  18. Niko ha detto:

    Salve Andrea,
    Ho appena letto il suo articolo, dove spiega come creare un’area riservata in cui ogni utente ha una sua area privata ! In particolar modo io mi trovo a dover creare un’area riservata di un sito internet per un consulente tributario, all’interno della quale ogni suo cliente da noi precedentemente caricato avrà la possibilità di visionare e scaricare i propri documenti ! la difficoltà in cui mi sono ritrovato è questa ! Utilizzando la piattaforma wordpress da poco tempo, ho pensato a qualche plug-in che mi permettesse di avere questa area-riservata.. ahimè non ho trovato ancora quello che fa per me!! tutti quelli installati e che ho testato generano un’area riservata comune agli utenti loggati.. ho letto che devo trasportare il codice che ci ha mostrato nel tutorial, nel file “Area_Riservata.php” ma non ho idea di dove si trovi ! può suggerirmi qualcosa ? a me andrebbe benissimo anche l’installazione di un plug-in, attendo con ansia una sua risposta e anticipatamente la ringrazio !
    Nicola

  19. Tommaso ha detto:

    ciao andrea, ottimo tutorial,
    ma una volta caricati i codici provo ad andare sul sito ma mi da subito questo errore

    Fatal error: Call to undefined function add_action() in C:\xampp\htdocs\Seap_1.0.20151010\wp-includes\functions.php on line 4999

    la linea 4999 equivale a:
    add_action(‘init’, ‘crea_contenuti’);

    cosa posso fare?
    grazie in anticipo!

  20. Laura ha detto:

    …ma se creo un contenuto allegando un file, per esempio un pdf, quest’ultimo sarà visibile o reperibile tramite i motori di ricerca?

  21. Roberto ha detto:

    Ciao Andrea, complimenti per il lavoro.
    Vorrei poter fare rimanere alcuni post sempre primi nella visualizzazione del template “Area Privata”, visualizzarli prima del loop e poi escluderli dallo stesso . Come sticky post dell’area privata. Come posso fare

    Ciao e grazie per la condivisione

Lascia un commento

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