Creare un Area Riservata con WordPress senza Plug-in
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/
Una guida molto interessante, grazie Andrea!
😉
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!!!
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à!
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
Ciao Laura,
ci sono diversi modi per realizzare quello che vuoi fare, quello piu semplice potrebbe essere utilizzare un if come questo:
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:
Non ho testato a fondo questo codice ma dovrebbe funzionare.
😉
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?
Ciao Andrea, grazie!
Sto scrivendo un articolo su come aggiungere questa funzione, penso di pubblicarlo a giorni…
Il modo per mostrare solo certi contenuti per utente più semplice è aggiungere un campo personalizzato ad ogni utente che viene creato, poi utilizzare i tag per assegnare un contenuto riservato a un determinato utente (campo personalizzato e tag devono essere uguali, per esempio campo personalizzato CLIENTEX con tag CLIENTEX). Quando l’utente si logga il loop mostra solo gli articoli con tag uguale al suo campo personalizzato.
Implementata la funzionalità della quale avevamo discusso, check!
http://www.marchettidesign.net/2013/02/area-riservata-con-wordpress-senza-plug-in-visualizzare-contenuti-diversi-per-ogni-utente/
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!
Ciao Eros,
tramite questo plug-in:
http://wordpress.org/extend/plugins/private-only/
puoi rendere tutto wordpress privato, se non si è loggati si viene reindirizzati al classico form per accedere a wordpress..
😉
Ciao,
vorrei inserire nella pagina dell’area riservata un pulsante di log out, sai come fare?
Grazie
Ciao Mirko, incolla il codice che trovi nella pagina qui sotto dove vuoi che appaia il pulsante di logout:
http://www.wprecipes.com/how-to-create-a-logout-button-on-your-wordpress-blog
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!
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.
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!
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!
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
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
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?
Ciao MFC, purtroppo no..
http://en.support.wordpress.com/themes/adding-new-themes/
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.
Ciao Valentina,
ti consiglio di ricontrollare il codice, ho testato il sistema con wordpress 3.6.2, se vuoi puoi scaricare il tema base con l’area riservata integrata al seguente indirizzo:
http://www.marchettidesign.net/2013/09/wpday-creare-una-area-riservata-con-wordpress-slide-e-download-file/
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?
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..
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
Ah dimenticavo una terza domanda: quale variabile contiene la data e l’ora di pubblicazione dell’articolo in modo che possa farla apparire? Grazieee