Creare un Area Riservata con WordPress vol.2: visualizzare contenuti Diversi / Comuni
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!
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.
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..
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.
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..
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
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.
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!
Ciao Giancarlo, dovrebbe essere la linea 136 di functions.php
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.
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
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
Ciao Paolo, resetta i permalink.
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’;
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_
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.
Ciao Luigi, controlla lo stile del tuo tema ed adattalo al custom template 😉
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
Ciao Oscar, prova a resettare i permalink di wordpress 😉
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?
Ciao Miriam, è una delle features che vorrei implemetare in futuro, non è però una cosa semplicissima, se porti avanti il progetto comunicalo qui nel blog 😉
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
Ciao Francesco, è una delle features che vorrei implemetare in futuro, non è però una cosa semplicissima, se porti avanti il progetto comunicalo qui nel blog 😉
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?
Ciao Grabirele, dalla pagina dove hai impostato il custom template.
Ciao, ottimo tutorial!!! Ho una domanda:
Se volessi selezionare più utenti dal menu a tendina è possibile farlo?
Grazie
Ciao Luca, è una delle features che vorrei implemtare in futuro.
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?
Ciao Fabrizio, sempre meglio evitare di modificare i file core.
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!
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…
Ciao Ettore, resetta i permalink.