maxdays

Come noto in WP vale la regola:
vengono visualizzati – per ordine di data decrescente – i primi articoli in evidenza e poi i primi articoli di qualsiasi categoria, fino al totale specificato in impostazioni lettura.

Con poche righe di codice è possibile aggiungere un parametro in modo da far “scadere” gli articoli dalla home page dopo un certo numero di giorni; se il parametro non è impostato – o è impostato ad un valore non numerico – non scadono, cioè si comportano secondo la regola sopra riportata.
Se invece il parametro indica che è già passato per un determinato articolo il numero di giorni massimo di permanenza, questo non viene più visualizzato, diminuendo il numero totale di articoli visualizzati.

Per visualizzare e impostare il parametro si deve innanzitutto verificare che sia spuntato “Campi personalizzati” in “Impostazioni schermo”:

e a questo punto si può poi inserire il numero di giorni nel parametro maxdays; in questo esempio è di 5 giorni:

Questo è il codice, inserito all’interno del loop principale in index.php:

<?php /* Start the Loop */ $datenow = date_create("now"); ?>
<?php while ( have_posts() ) : the_post(); 
  // visualizza il post solo se non sono passati i giorni massimi previsti - campo custom 'maxdays' 
  $keyvalue = get_post_meta(get_the_ID(), 'maxdays', true);
  if ( '' == $keyvalue || !is_numeric( $keyvalue ) ) $keyvalue=365*5;
  $interval = date_diff(date_create(get_the_date('Y-m-d H:i:s')), $datenow);
  $numdays = $interval->format('%a');
  if ($numdays<$keyvalue):
    get_template_part( 'content', get_post_format() );
  endif; ?>
<?php endwhile; ?>
									

da notare che la funzione date_diff è definita solo per PHP > 5.3. Quindi per versioni PHP inferiori è necessario usare un workaround, ad esempio questo che si trova sul sito php.net:

/**
 * Workaround for PHP < 5.3.0
 */
if(!function_exists('date_diff')) {
    class DateInterval {
        public $y;
        public $m;
        public $d;
        public $h;
        public $i;
        public $s;
        public $invert;
        
        public function format($format) {
            $format = str_replace('%R%y', ($this->invert ? '-' : '+') . $this->y, $format);
            $format = str_replace('%R%m', ($this->invert ? '-' : '+') . $this->m, $format);
            $format = str_replace('%R%d', ($this->invert ? '-' : '+') . $this->d, $format);
            $format = str_replace('%R%h', ($this->invert ? '-' : '+') . $this->h, $format);
            $format = str_replace('%R%i', ($this->invert ? '-' : '+') . $this->i, $format);
            $format = str_replace('%R%s', ($this->invert ? '-' : '+') . $this->s, $format);
            
            $format = str_replace('%y', $this->y, $format);
            $format = str_replace('%m', $this->m, $format);
            $format = str_replace('%d', $this->d, $format);
            $format = str_replace('%h', $this->h, $format);
            $format = str_replace('%i', $this->i, $format);
            $format = str_replace('%s', $this->s, $format);
            
            return $format;
        }
    }

    function date_diff(DateTime $date1, DateTime $date2) {
        $diff = new DateInterval();
        if($date1 > $date2) {
            $tmp = $date1;
            $date1 = $date2;
            $date2 = $tmp;
            $diff->invert = true;
        }
        
        $diff->y = ((int) $date2->format('Y')) - ((int) $date1->format('Y'));
        $diff->m = ((int) $date2->format('n')) - ((int) $date1->format('n'));
        if($diff->m < 0) {
            $diff->y -= 1;
            $diff->m = $diff->m + 12;
        }
        $diff->d = ((int) $date2->format('j')) - ((int) $date1->format('j'));
        if($diff->d < 0) {
            $diff->m -= 1;
            $diff->d = $diff->d + ((int) $date1->format('t'));
        }
        $diff->h = ((int) $date2->format('G')) - ((int) $date1->format('G'));
        if($diff->h < 0) {
            $diff->d -= 1;
            $diff->h = $diff->h + 24;
        }
        $diff->i = ((int) $date2->format('i')) - ((int) $date1->format('i'));
        if($diff->i < 0) {
            $diff->h -= 1;
            $diff->i = $diff->i + 60;
        }
        $diff->s = ((int) $date2->format('s')) - ((int) $date1->format('s'));
        if($diff->s < 0) {
            $diff->i -= 1;
            $diff->s = $diff->s + 60;
        }
        
        return $diff;
    }
}
									

Leave a Reply

Your email address will not be published. Required fields are marked *