Creare un Area Riservata con WordPress senza Plug-in

By Andrea Marchetti · Nov 2012

Creare un Area Riservata con WordPress senza Plug-in
Area riservata con Wordpress

AGGIORNAMENTO NUOVO TUTORIAL: Come creare un area riservata Vol.2 – Miglioramenti nel codice e nuove funzionalità

In questo articolo vedremo come creare un’ area riservata nel nostro sito WordPress dove gli utenti registrati potranno accedere a contenuti privati.

L’approccio per realizzare l’area riservata è il seguente: 

– Creeremo un custom post type “Area riservata” per inserire i contenuti. Successivamente renderemo privati quelli pubblicati da questo post type e infine richiameremo i contenuti in una pagina custom dove inseriremo il form per accedere all’area.

– Faremo in modo che qualsiasi utente registrato come “Sottoscrittore” dall’amministratore possa accedere e visualizzare i contenuti privati.

– Faremo in modo che all’utente non appaia mai il backend di WordPress (anche se ciò dovesse avvenire, essendo registrato come “Sottoscirttore”, le operazioni che potrebbe fare sarebbero irrilevanti).

Apriamo il file function.php del nostro tema wordpress e inseriamo il codice necessario.

1) Definiamo il Custom Post Type

Definiamo un post type area riservata tramite il quale pubblicheremo i contenuti.

//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'
),
);
register_post_type('area-riservata', $args);
}

2) Impostiamo i contenuti del custom post type come privati

//rendo il post type privato di default
function force_type_private($post)
{
if ($post['post_type'] != 'area-riservata' || $post['post_status'] == 'trash')
return $post;
$post['post_status'] = 'private';
return $post;
}
add_filter('wp_insert_post_data', 'force_type_private');

3) Rendiamo i contenuti privati visibili agli utenti di tipo “Sottoscrittore”

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

4) Richiamiamo i custom post type in un template pagina “area riservata”

Creiamo un file area-riservata.php nella cartella del nostro tema. Nel file definiamo un template pagina “Area riservata”. Se siamo loggati mostriamo un messaggio di benvenuto e i custom post type privati tramite loop, altrimenti mostriamo il form per loggarsi.

<?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 global $current_user; get_currentuserinfo(); echo 'Benvenuto, '. $current_user->user_login ; ?>
<hr />
<?php //loop custom post type privati
$wpquery = new WP_Query(array(
'post_type'      => 'area-riservata',
));
while ($wpquery->have_posts()): $wpquery->the_post();
?>
<div class="post">
<h2><?php the_title(); ?></h2>
<?php the_content('Leggi...');?>
</div>
<hr />
<?php endwhile; ?>
<?php } else { ?>
Area Riservata
<?php if (!(current_user_can('level_0'))){ ?>
<h2>Login</h2>
<form action="<?php echo get_option('home'); ?>/wp-login.php" method="post">
<input type="text" name="log" id="log" value="<?php echo wp_specialchars(stripslashes($user_login), 1) ?>" size="20" />
<input type="password" name="pwd" id="pwd" size="20" />
<input type="submit" name="submit" value="Send" class="button" />
<p>
<label for="rememberme"><input name="rememberme" id="rememberme" type="checkbox" checked="checked" value="forever" /> Remember me</label>
<input type="hidden" name="redirect_to" value="<?php echo $_SERVER['REQUEST_URI']; ?>" />
</p>
</form>
<a href="<?php echo get_option('home'); ?>/wp-login.php?action=lostpassword">Recover password</a>
<?php } else { ?>
<h2>Logout</h2>
<a href="<?php echo wp_logout_url(urlencode($_SERVER['REQUEST_URI'])); ?>">logout</a><br />
<a href="http://XXX/wp-admin/">admin</a>
<?php }?>
<?php } ?>
<?php get_footer(); ?>


Per associare il template a una pagina basta crearne una e nel pannello “attributi pagina” selezionare il template appena creato.

5) Rimuoviamo la parola “Privato” dal titolo dei contenuti privati

I contenuti privati di default hanno la parola “privato” prima del titolo, non vogliamo che questa parola appaia quindi inseriamo in function.php il seguente codice.

// Rimuovo Privato dal titolo
function clean_title($titolo) {
$titolo = attribute_escape($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');

6) Nascondiamo la barra di WordPress agli utenti di tipo “Sottoscrittore”

Come ultimo dettaglio nascondiamo la barra di WordPress agli utenti loggati ad esclusione dell’admin.

//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');
}

Avendo utilizzato un custom post type i contentuti riservati posso essere ulteriormente sviluppati implementando per esempio categorie e matabox. Per sviluppare queste funzionalità seguite le numerose guide che ci sono sui custom post type.

Non ci resta che aggiungere gli utenti come sottoscrittori e mandare loro la password.

Stay Tuned!

AGGIORNAMENTO:
Nuove funzionalità implementate in questo articolo, ogni utente ora può vedere solo i suoi contenuti: http://www.marchettidesign.net/2013/02/area-riservata-con-wordpress-senza-plug-in-visualizzare-contenuti-diversi-per-ogni-utente/

41 Commenti

  1. Gregory ha detto:

    Una guida molto interessante, grazie Andrea!

  2. Brs ha detto:

    Wow complimenti per l’articolo!!!
    Sono riuscito ad implementare il tuo tutorial, il problema e che ogni sottoscrittore vede tutti i post privati, si potrebbe filtrare post specifici per ogni utente? sarebbe fantastico!!!

    • Andrea Marchetti ha detto:

      Ciao Brs, grazie!
      Nel sito nel quale ho utilizzato questo sistema, gli utenti dovevano vedere tutti gli articoli…
      Per risolvere il tuo problema penso che si potrebbe implementare un filtro con i tag. Si potrebbe utilizzare un tag per ogni cliente, passare questo nel loop di WordPress e visualizzare solo gli articoli con il tag del cliente loggato.

      Appena avrò tempo proverò ad aggiungere questa funzionalità!

  3. laura ha detto:

    Ottima questa guida…Non sono molto pratica di wp ma vorrei applicare questa funzionalità che hai descritto, al contenuto di un portfolio.
    Mi spiego meglio: ho un sito visibile a tutti, al suo interno ho inserito un portfolio e volevo rendere alcune categorie di questo portfolio, visibili solo ad utenti registrati….con vari plugin non sono riuscita, o meglio riesco a bloccare solo pagine e articoli mentre le immagini restano visibili (e non risolvo nulla visto che voglio limitare proprio le immagini). E’ possibile fare qualcosa di simile con questa procedura che hai indicato? Grazie, Laura

    • Andrea Marchetti ha detto:

      Ciao Laura,
      ci sono diversi modi per realizzare quello che vuoi fare, quello piu semplice potrebbe essere utilizzare un if come questo:

      < ?php if ( is_user_logged_in() ) { //loop categoria protetta } ?>

      se l’utente è loggato viene mostrato il contenuto dell’ if, se all’interno di questo metti un loop che richiama la categoria protetta questa non verrà visualizzata se non si è loggati.

      Altro approcciao (Più raffinato) potrebbe essere mettere due if uno dentro l’altro nell’ loop dei lavori. Il primo controlla se sei nella categoria protetta il secondo “interno a questo” mostra i lavori solo sei loggato:

      < ?php if ( in_category( 'tua categoria protetta' )) { if ( is_user_logged_in() ) { //mostra contenuto protetto } } else { // mostra contenuto standard } ?>

      Non ho testato a fondo questo codice ma dovrebbe funzionare.

      😉

  4. andrea ha detto:

    ciao Andrea, veramente un’ottima giuda!

    Vorrei mostrare però un contenuto diverso per ogni utente perché attualmente tutti gli utenti vedono la stessa area riservata.

    Ogni utente loggato deve vedere solo il contenuto dedicato a lui.
    Qual’è il modo più semplice per implementare questa funzione?

  5. Eros ha detto:

    Ciao Andrea…
    io dovrei rendere tutto wordpress privato, praticamente deve presentarsi una pagina di login all’ingresso del sito, come se fosse in manutenzione, per poi accedere e avere tutte le aree disponibili una volta loggato!!
    La registrazione non mi interessa perchè gli utenti li creo io, credi sia fattibile una cosa del genere?? WordPress 3.5.1
    Grazie in anticipo!

  6. mirko ha detto:

    Ciao,
    vorrei inserire nella pagina dell’area riservata un pulsante di log out, sai come fare?

    Grazie

  7. Chiara ha detto:

    Ciao, ho seguito la tua guida e sono riuscita ad inserire sia il custom post type che il template area riservata.
    Il mio problema ora, però, è che io ho tutta una sezione del sito che deve essere privata e non potendo associare i post riservati a diverse pagine (non c’è la voce attributi nella pagina di edit riservata), visualizzo sempre tutti i post creati da area riservata. Inoltre se inserisco pagine dal post type standard e seleziono il template area riservata, non visualizzo quanto inserito ma visualizzo sempre solo i post inseriti dal custom post type.
    Non so se sono stata chiara, ma insomma, io ho semplicemente bisogno che gli utenti arrivino sulla prima pagina dell’aria riservata (presente nella barra del menu) si logghino per poi avere accesso anche alle altre pagine.
    Abbiamo effettivamente trovato un plugin che permette di categorizzare articoli e pagine permettendo l’accesso solo a un certo tipo di utente, ma mi piace molto di più l’area riservata come la descrivi tu.

    Grazie!

    • Andrea Marchetti ha detto:

      Ciao Chiara, non ho ben capito il tuo problema, vuoi visualizzare i post riservati in più pagine e non solo nella pagina area riservata?

      Se queste altre pagine sono delle categorie puoi pubblicare all’loro interno dei post privati. WordPress già di default consente di pubblicare post privati, l’inconveniente rispetto l’articolo è che ogni post privato ha una password che devi impostare tu e poi mandare al cliente.

  8. Chiara ha detto:

    Ciao, Andrea. Ho risolto!
    Ho semplicemente creato un template “area riservata” con le stesse identiche caratteristiche della stessa pagina standard, aggiungendo in più solo la parte di codice che prevede il log in (presa dal tuo esempio di template) 🙂
    In questo modo quando creo una nuova pagina – non in custom post type ma normalmente in Pagine – selezionando il template “area riservata” l’unica cosa che ottengo di diverso è la necessità di loggarsi per la visualizzazione.

    Grazie mille, il tuo post mi è stato comunque molto utile!

  9. Gianluca ha detto:

    Ciao Andrea,
    Sto seguendo i tuoi tutorial per creare un blog wordpress. Fino ad ora non ho incontrato nessuna difficoltà, ma adesso mi sono bloccato quando realizzo il sistema dei contenuti privati degli utenti Quando vado alla pagina area-privata.php con un utente “sottoscrittore” mi da questo errore: Fatal error: Call to undefined function get_header() in /membri/devannag/blog/area-riservata.php on line 11.
    Non capisco quale sia l’errore dato che ho seguito passo passo la guida.
    Ti ringrazio in anticipo!

    • Andrea Marchetti ha detto:

      Ciao Gianluca, get_header è la funzione utilizzata per includere l’header del tema wordpress, probabilmente c’è qualche errore nell’inculsione dell’header. Controlla i file del tema

  10. Francesco ha detto:

    Ciao Andrea,
    grazie per il tutorial veramente ben fatto.. Avrei una domanda: quando un’utente sbaglia la password viene reindirizzato sulla pagina d’accesso all’amministrazione di wordpress, mentre mi piacerebbe che comparisse un messaggio d’errore all’interno della pagina stessa… sai come si può fare ?

    Grazie

  11. MFC ha detto:

    Grazie dell’articolo. E’ proprio quello che mi ci vuole. Una domanda, però, da neofita.
    Questo metodo lo può utilizzare anche chi ha un sito su wordpress.com?

  12. Valentina ha detto:

    Ciao,

    Stavo utilizzando il codice scritto, ma ho notato che non è un compatibile con WordPress 3.6.. Conosci un modo per risolvere il problema? Grazie mille.

  13. Claudio ha detto:

    Salve, complimenti splendido articolo.
    Nel mio sito, ad ogni articolo corrisponde un band musicale e vorrei creare un’ area riservata per ognuno di loro.
    Nel post vorrei che l’utente possa inserire le date dei soli eventi, quindi vorrei che non modifichi le altre cose all’interno degli articoli.
    Le faccio un esempio:
    rockband
    evento

    vorrei che l’utente abbia la possibilità di utilizzare SOLO la tabella ed aggiungere le date da solo utilizzando il plugin TinyMCE Advanced.
    Parlo di fantascienza vero?

    • Andrea Marchetti ha detto:

      Ciao Paolo,
      creare una struttura del genere non è semplice, prima guarderei se ci sono plug-in che fanno qualcosa di simile, per esempio con buddypress puoi creare gruppi stile facebook..

  14. giovpres ha detto:

    Ciao Andrea,
    grazie per il codice, ho due domande:
    ho creato un utente e gli ho assegnato il ruolo di editore, come faccio a fargli vedere nel backend solo il menu Area Riservata? Deve poter caricare i contenuti protetti senza andare a smanettare altro…
    L’altra domanda è: come posso personalizzare l’email che arriva per la password dimenticata?
    Grazie in anticipo. Ciao

  15. giovpres ha detto:

    Ah dimenticavo una terza domanda: quale variabile contiene la data e l’ora di pubblicazione dell’articolo in modo che possa farla apparire? Grazieee

  16. Benedetta ha detto:

    Ciao Andrea,

    sto realizzando un sito web con WordPress e avevo proprio la necessita’ di fare un’Area Riservata. Ho seguito passo passo la tua ottima guida pero’ ho un problema! Nelle pagine della sezione Area Riservata non vedo gli Attributi di Pagina. Proprio non ci sono! Ovviamente ho gia’ controllato le impostazioni dello schermo ma niente! Hai idee?
    Grazie mille!

    • Andrea Marchetti ha detto:

      Ciao Benedetta,
      vanno abilitati con 'hierarchical' => true, quando si definisce il post type in function.php
      fatto questo poi dovrai selezionarli nelle impostazioni di visualizzazione nel backend 😉

  17. Cristian ha detto:

    Ciao Andrea,

    Great tutorial, I’m using it on a client website, but I have one request if it’s possible. Could you write an article (I think it will be useful for many of your visitors) about how to display some error messages instead of going to wp-admin when users leave blank both the logon fields, or one of them, or when they have to reset the password.

    Hopefully my request is clear 🙂

    Grazie mille,
    Cristian

  18. Francesco ha detto:

    Ciao Andrea, grazie per questo articolo utile e ben spiegato tanto che sono riuscito ad adattare il tuo codice alle mie esigenze. Ho creato grazie alla tua guida una pagina riservata ed all’interno del loop sono riuscito a far vedere il titolo e solo le prime tre righe del testo inserito nella pagina inserendo poi “continua a leggere” . Ora ho un problema e non riesco a venirne a capo. L’articolo creato nell’area riservata c’è e lo posso modificare ma quando vado a visionare le modifiche mi dice “Oops! That page can’t be found.” idem quando clicco su “continua a leggere” come se l’articolo che ho creato non esistesse. Come posso risolvere? Ti ringrazio anticipatamente e spero di essere stato chiaro nella mia spiegazione.

    Francesco

    • Francesco ha detto:

      Ciao Andrea,

      ho risolto e lascio qui la soluzione così da condividerla con chi può trovarsi un caso simile tra le mani.

      Dal file function.php ho eliminato i primi due punti della tua guida quindi non ho Custom Post Type dell’Area Riservata e all’interno della pagina statica che ho creato area-riservata.php ho inserito un loop che mi richiama la categoria area-riservata degli Articoli poi imposto Privato a tutti i nuovi articoli che non voglio far vedere a chi non è registrato.

      Funziona tutto correttamente.

      Ti ringrazio ancora perché senza la tua guida non ne sarei venuto a capo!

      Francesco

  19. Armando ha detto:

    A me non funziona l’area riservata mi dà questo: Fatal error: Call to undefined function get_header() in /web/htdocs/www.dogadvisor.org/home/wp-admin/area-riservata.php on line 6 come mai?? Helppp

  20. olGerva ha detto:

    Ciao
    Ottima guida, ben dettagliata … complimenti
    Ho un piccolo problema …
    La mia pagina wp-login.php è mascherata tramite htaccess, quindi devo inserire “manager” per accedere alla stessa pagina wp-login così rappresentata
    wp-login.php?6qy16a0ari3nkbtrcbmik

    Utilizzando la tua procedura, una volta date le credenziali vengo rimbalzato alla 404.

    Potresti aiutarmi per risolvere il problema.
    Se necessiti di maggiori dettagli np.

    Grazie in anticipo

  21. Roberto ha detto:

    Ciao e grazie vorrei mettere il codice che va sul functions.php su un file functions .php del mio tema child, ma se inserisco pari pari il codice da te indicato sul tema genitore tutto a posto, sul tema child invece mi da errore. sapresti indicarmi la giusta sintassi da indicare sul functions.php per il tema child?
    grazie e auguri di buone feste

  22. Manuel ha detto:

    Ciao Andrea,

    ho seguito alla lettera il tutoria, nel backend mi è comparsa la voce area privata e l’inserimento dei contenuti e se creo una pagina posso dargli il tema area privata.
    Ma non funziona!!! perché??
    grazie M

  23. Rufus ha detto:

    salve e grazie per il tutorial
    se volessi aggiungere la possibilità di far accedere all’ area riservata oltre al sottoscrittore pure il collaboratore basta aggiungerlo così ?:

    //rendo il post privato visibile al ruolo sottoscrittore+ collaboratore
    2
    $subRole = get_role( ‘subscriber’ , ‘ contributor’);

    grazie

Lascia un commento

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