§ 37. Come visualizzare tutti i sondaggi WP Polls su una pagina

Un giorno mi sono chiesto: come si fa a raccogliere / visualizzare tutti i sondaggi attivi creati con il plugin WP Polls sulla stessa unica pagina? Ovviamente, mi riferisco ai soli sondaggi ancora aperti al voto: infatti, tra le impostazioni del plugin in questione c’è solamente l’opzione di creare una pagina con l’«archivio dei sondaggi» sulla quale vengono mostrati i risultati di tutti i sondaggi, indipendentemente dal fatto che il visitatore del sito abbia già votato in ognuno di essi o meno. Ma se volessimo dare a tutti la possibilità di partecipare comodamente a tutti i sondaggi vecchi?
E allora ho deciso di creare da solo quella pagina con tutti i sondaggi attivi. Le caratteristiche di quella pagina devono, almeno per me, essere molto semplici:
– visualizzare tutti i sondaggi attivi, partendo dal più recente;
– numerare i sondaggi visualizzati, assegnando il numero 1 al sondaggio più vecchio;
– per ogni sondaggio visualizzare solo la domanda, le possibili risposte, il buttone «vota» e la data di creazione.
Per capire da dove tirare fuori tutti i dati relativi ai singoli sondaggi dobbiamo andare sul database dove è installata la copia di WordPress che utilizza il plugin dei sondaggi. Su quel database scopriamo che la tabella contenente i sondaggi ha il prefisso pollsq. Studiando la struttura della tabella, scopriamo quali campi di essa ci servono per la realizzazione dei punti 1 e 3 della breve lista riportata sopra (la numerazione dei sondaggi visualizzati, invece, è una cosa che possiamo fare con le forze proprie, non ci serve alcun dato dal database). In particolare, ci servono:
– poll_timestamp (contiene la data della creazione del sondaggio);
– poll_id (contiene l’id del sondaggio).
Tiriamo fuori tutti i sondaggi dalla tabella, li ordiniamo in base alla data decrescente e li pubblichiamo sulla stessa pagina con un ciclo che genera il shortcode di visualizzazione per ogni sondaggio esistente sulla base del suo id. Ci viene un codice PHP di questo tipo:

<?php
   global $wpdb;
   $polls_table = $wpdb->prefix . 'pollsq';
   $polls = $wpdb->get_results("SELECT * FROM $polls_table WHERE pollq_active = 1 ORDER BY pollq_timestamp DESC");
   if ($polls) {
      foreach ($polls as $poll) {
         $poll_date = date('d/m/Y', $poll->pollq_timestamp);
         echo '<div class="poll">';
         echo '<h4>Sondaggio №' . esc_html($poll_number) . ' (del ' . esc_html($poll_date) . ')</h4>';
         echo do_shortcode('

Cosa bisogna fare dell’ora legale?

Loading ... Loading ...
'); echo '</div><br /><hr><br />'; } } else { echo '<p>Nessun sondaggio attivo trovato.</p>'; } ?>

Già fatto in questo modo il codice funziona, nel senso che visualizza sulla stessa pagina tutti i sondaggi con le rispettive date, permettendo all’utente di partecipare comodamente a tutti i sondaggi che vuole.
Ci resta da fare la numerazione dei sondaggi visualizzati, ma questo è un esercizio del tipo scolastico.
Prima del ciclo creiamo una variabile-contatore, alla quale assegniamo come valore la quantità totale dei sondaggi (la quantità dei sondaggi può aumentare col tempo, ma questo non significa che dobbiamo modificare lo script tutte le volte).

$poll_number = count($polls);

Mentre nel ciclo che già abbiamo facciamo decrementare il valore di quella variabile di 1 ogni volta che viene visualizzato un sondaggio:

$poll_number--;

Ecco, dunque, il codice completo della soluzione:

<?php
   global $wpdb;
   $polls_table = $wpdb->prefix . 'pollsq';
   $polls = $wpdb->get_results("SELECT * FROM $polls_table WHERE pollq_active = 1 ORDER BY pollq_timestamp DESC");
   if ($polls) {
      $poll_number = count($polls);
      foreach ($polls as $poll) {
         $poll_date = date('d/m/Y', $poll->pollq_timestamp);
         echo '<div class="poll">';
         echo '<h4>Sondaggio №' . esc_html($poll_number) . ' (del ' . esc_html($poll_date) . ')</h4>';
         echo do_shortcode('

Cosa bisogna fare dell’ora legale?

Loading ... Loading ...
'); echo '</div><br /><hr><br />'; $poll_number--; } } else { echo '<p>Nessun sondaggio attivo trovato.</p>'; } ?>

Dal punto di vista grafico, il risultato dipenderà anche dalle regole CSS del vostro sito. Sul mio sito, per esempio, il risultato dello script di cui sopra appare così:

E voi, ora, avete tutte le indicazioni fondamentali anche per fare questa visualizzazione con i contenuti e/o la loro organizzazione diversi.
Ah, una precisazione per i meno esperti: per creare una pagina del vostro sito con lo script appena visto, inserite quest’ultimo nel file page.php del vostro tema WordPress, non dimenticatevi di indicare un Template Name, salvate con il nome che volete (per esempio, tuttisondaggi.php), caricate nella cartella del tema sul server e poi create la pagina attraverso la vostra admin.
Per esempio, il file tuttisondaggi.php del vostro tema WordPress potrebbe essere così (è solo un esempio per coloro che non sanno proprio dove inserire il codice!):

<?php
/*
Template Name: Tutti i sondaggi attivi
*/
?>
<?php get_header(); ?>
   <div id="main">
      <div id="content">
         <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
         <h2 class="singlepage"><?php the_title(); ?></h2>
         <?php
            global $wpdb;
            $polls_table = $wpdb->prefix . 'pollsq';
            $polls = $wpdb->get_results("SELECT * FROM $polls_table WHERE pollq_active = 1 ORDER BY pollq_timestamp DESC");
            if ($polls) {
                $poll_number = count($polls);
            	foreach ($polls as $poll) {
                   $poll_date = date('d/m/Y', $poll->pollq_timestamp);
                   echo '<div class="poll">';
                   echo '<h4>Sondaggio №' . esc_html($poll_number) . ' (del ' . esc_html($poll_date) . ')</h4>';
                   echo do_shortcode('

Cosa bisogna fare dell’ora legale?

Loading ... Loading ...
'); echo '</div><br /><hr><br />'; $poll_number--; } } else { echo '<p>Nessun sondaggio attivo trovato.</p>'; } ?> <?php endwhile; endif; ?> <?php comments_template(); ?> </div> <!-- end content div--> <?php get_sidebar(''); ?> </div> <!-- end the main div--> </div> <!-- end wrapper div --> <?php get_footer(); ?>

Mentre sulla vostra admin di WordPress, creando la pagina, dovrete solo indicare il titolo della pagina, il suo modello (coincide con il Template Name che avete scritto nel codice) e l’eventuale pagina-genitore.
Si può pubblicare!