Problème sur les articles post-datés
Bonjour,
Le problème constaté :
- La fonctionnalité « Ne pas publier les articles avant la date de publication fixée » est active.
- Un article a été publié (le 27/03/14) avec comme date de publication le 02/04/14 à 0h01.
- Le 27/03/14, aucun problème, l'article est bien en attente.
- Le 28/03/14, une personne me signale que l'article est en ligne.
A noter qu'un problème similaire avait été signalé puis fermé (http://core.spip.org/issues/2902).
Après de nombreuses recherches, j'ai trouvé comment reproduire ce problème.
Cette procédure fonctionne sous SPIP 2.1.26 ainsi que sous SPIP 3.0.16 (sans plugins additionnels) :
a) Dans la configuration de SPIP, l'option "Ne pas publier les articles avant la date de publication fixée" est cochée.
b) Création de l'article B post-daté à la date N à 13h55 (le statut de l'article est : publié).
c) Création de l’article A post-daté à la date N à 14h00 (le statut de l'article est : publié).
d) A la date N à 13h52, on tente de consulter l'article A sur le site public en étant authentifié. Sur le site public on ne peut pas visualiser l'article A. On ne consulte volontairement pas l'article B.
e) A la date N à 13h56, on consulte l'article A sans être authentifié. L'article A est visible sur le site public. On ne consulte volontairement pas l'article B.
f) A la date N à 13h59, on tente de consulter l'article A sans être authentifié (avec &tt=1 pour forcer le calcul de la page). Sur le site public on ne peut pas visualiser l'article A.
g) A la date N à 14h02, l'article A et l’article B sont accessibles sur le site public.
Le problème provient du fait qu'à l'étape e) SPIP actualise bien 'calculer_prochain_postdate' (dans ecrire/public.php), mais après l'affichage de la page. Aussi, la page affichée se base sur l'ancienne valeur de 'calculer_prochain_postdate' (celle de l'article B).
Exemple de solution : Si dans ecrire/public.php, on met en commentaire le code relatif à 'date_prochain_postdate' et que, par exemple, l’on place le code suivant juste avant « Charger l'aiguilleur des traitements derogatoires » (je ne sais pas si c’est le meilleur emplacement), alors j’ai constaté que le problème disparaît :
if (!((_request('var_mode') == 'debug') OR $tableau_des_temps)){ if (isset($GLOBALS['meta']['date_prochain_postdate']) AND $GLOBALS['meta']['date_prochain_postdate'] <= time()) { include_spip('inc/rubriques'); calculer_prochain_postdate(true); } }
Cordialement Equipement