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

By Andrea Marchetti
@marchetti_design

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!

Commenti

  1. Avatar 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…

  2. Avatar 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..

  3. Avatar 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

  4. Avatar 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!

  5. Avatar 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?

  6. Avatar 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

  7. Avatar Riccardo ha detto:

    Ciao Andrea, ottimo tutorial.
    Ho un problema quando creo un contenuto e lo voglio associare a dun utente: se dalla select seleziono il nome dell’utente e clicco su aggiorna mi reimposta il selettore su tutto. Sai come posso risolvere? Grazie

    • Avatar Riccardo ha detto:

      Ho risolto, errore nel codice mio.
      Ho un atro problema, quando clicco sul link per vedere il contenuto riservato non mi trova la pagina perché nel permalink aggiunge /contenuti/.
      Come posso risolvere? Grazie

  8. Avatar Michele ha detto:

    Ciao Andrea, vorrei rendere riservata la visione di alcuni post e non delle pagine, é possibile con questa soluzione o vale solo per le pagine?
    Grazie

Lascia un commento

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

Share