Carnet Wiki

Filtre mot du jour - Retourne un article aléatoirement chaque jour

Objectifs

Retourner un article différent par jour sans problème de cache

Solution

  • placer sur la page #CACHE{3600}
  • utliser le filtre suivant [(#REM|retourne_id_article_mot_jour)]

Merci à marcimat pour l’idée de l’algorithme

<?php

if (!defined('_ECRIRE_INC_VERSION')) {
	return;
}


/**
 * filtre retourner un id_article different par jour
 * utilise avec [(#REM|retourne_id_article_mot_jour)]
 *
 * @return int id_article
 */
function retourne_id_article_mot_jour() {
	include_spip('inc/config');

	$id_article_mot_jour = 0;
	$today = date('z');

	// lire le tableau
	$jours_connus = lire_config('mot_jour/jours_connus');
	// spip_log($jours_connus,"mot_jour");

	// si jour deja connu, on le sort
	if (is_array($jours_connus)) {
		if (isset($jours_connus[$today])) {
			return $jours_connus[$today];
		}
	}

	// sinon, on recupere un nouvel article de selection, ici les articles de la rubrique 39 et 125
	$where = array();
        $where[] = "statut = 'publie'";
	$where[] = "id_rubrique IN (39,125)";
    if (is_array($jours_connus)) {
			if (count($jours_connus)) {
				$where[] = "id_article NOT IN (".implode(",",$jours_connus).")";
			}
	}
	$id_article_mot_jour = sql_getfetsel('id_article', 'spip_articles', $where, '', 'RAND()', '0,1');

	// on sauve le nouveau mot
	$jours_connus[$today] = $id_article_mot_jour;

	// on depile un jour
	if (z >= 182) {
		unset($jours_connus[z-182]);
	} else {
		unset($jours_connus[365 - z]);
	}

	// on sauve le tout
	ecrire_config('mot_jour/jours_connus', $jours_connus);

	return $id_article_mot_jour;
}
erational - Mise à jour :19 juillet 2017 à 16h56min