Filtre Age et articles programmés

Bonjour la commu SPIP !

J’ai de nouveau besoin de votre aide. Dans le cadre d’une campagne SEO nous souhaitons programmer des articles à publier en avance.

Pour se faire nous programmons la date de publication dans l’article via cet outil :

Côté sommaire, pour filtrer nous utilisions le filtre {age>=0}. Seulement, les articles apparaissent quand même sur la page mais génèrent une erreur lorsqu’on tente de les consulter. En examinant la requête effectuée pour récupérer les article de ma boucle je me suis rendu compte que le filtre age ajoutait cette condition à la requête MySQL : (TIMESTAMPDIFF(HOUR,articles.date,‹ 2024-11-25 15:20:00 ›)/24 >= 0)

Et le soucis vient de là, en effet les articles prorammés pour dans moins d’une heure apparaissent alors qu’ils ne sont normalement pas encore publiés.

Ya t’il un moyen de remplacer (par le biais d’un plugin, ou d’un morceau de code dans mes options) le HOUR par SECOND afin que les articles ne soient visibles qu’une seconde avant leur publication ?

Merci d’avance pour votre aide !

Config : SPIP 4.3.3

Mouais, je ne crois pas que des plugins faisant cela existe.
Pour ce que j’en vois en première approche du reste, on pourrait considérer cela comme un bug, mais si on modifie par seconde, le risque est qu’un article publié dans l’heure qui précède n’apparaisse pas, car le cache sera toujours valide.

Donc peut être ouvrir un ticket, et on en discute là bas ?

Avec plaisir, mais je ne sais pas où se trouvent les tickets :smiley:

En soit, que l’article n’apparaissent pas pile à l’instant T ne me pose pas spécialement de problèmes, le tout est qu’il soit publié après l’heure de publication et pas avant :slight_smile:

Ici Tickets · spip / spip · GitLab

Il faut

  1. Créer un compte (les passerelles gitlab/github ne marche pas, à ma connaissance)
  2. Attendre qu’1 admin valide (normalement ca peut aller rapidement vite)
  3. Puis « créer un nouveau ticket »

Yes j’ai fini par trouver :slight_smile: je suis en train de créer le ticket.

Ticket créé, cependant, s’il faut attendre la prochaine release pour avoir le correctif, ça risque de me compliquer la tâche… les équipes SEO bossent déjà sur notre contenu.

Y aurait-il un moyen « en attendant » de hardcoder cette modif ?

bah deja si le bug est sur une heure avant, tu décalre tout d’une heure.

Ensuite si la PR arrive rapidement, bah tu pourra toi même surcharger le fichier fourni avec spip pour avoir le critère corrigé.

Enfin tu peux toi meme proposer la PR : le code étant ici ecrire/public/criteres.php · master · spip / spip · GitLab tu a à le fouillé (probablement qu’il faut modifier l 2670 et 2675, ainsi que la fonction calculer_param_date().

Il y a d’autres manières SPIP d’écrire {age>=0} avec la précision que tu veux.

Voici 2 pistes :

  • avec un critère {date_redac<=NOW()}
  • sinon, avec un critère {WHERE ...} et justement, il y a un exemple qui utilise une fonction MYSQL de date : {where} - SPIP

Selon le contenu visé, il est parfois nécessaire, ou plus facile en tout cas, de préparer le contenu du critère avant, dans un #SET.
Par exemple :
#SET{where,#GET{" spip_articles.date_redac < "}|concat{" NOW() "}}
ou
#SET{where,#GET{" spip_articles.date_redac < "}|concat{#VAL{' "Y-m-d H:i:s" '}|date}}
puis
{where #GET{where}} en critère de ta boucle à la place de {age>=0}

bah deja si le bug est sur une heure avant, tu décalre tout d’une heure.

Déjà testé mais l’écart reste valable, si je programme l’article 1h avant, il sera affiché dans les boucles aussi 1h plus tôt.

Enfin tu peux toi meme proposer la PR : le code étant ici ecrire/public/criteres.php · master · spip / spip · GitLab tu a à le fouillé (probablement qu’il faut modifier l 2670 et 2675, ainsi que la fonction calculer_param_date().

Je ne pense pas avoir assez de légitimité pour proposer un correctif :slight_smile: je suis trop noob sur spip pour me le permettre. =) Je préfère faire confiance aux choix de l’équipe de développeurs chevronnés qui maintiennent SPIP. Et peut-être que ce choix de précision est prévu pour des raisons bien définies et que mon cas est trop particulier pour que je puisse le proposer comme solution « universelle ».

avec un critère {date_redac<=NOW()}

Si j’en juge par la documentation il faudrait plutôt que je me base sur le critère date du coup? Qui correspond à la date de publication?

J’aime bien l’idée de la requête en direct, est ce que cela peut influencer les performances ? L’idée de le préparer en amont me serait judicieussement utile car j’ai besoin de ce critère à plusieurs endroits dans la page d’accueil (plusieurs boucles d’articles)

Dans le code comme dans la vie, exprime ce que tu veux exprimer et choisit donc pour cela l’expression qui correspond à ton besoin (date, date_redac ou autre) .

Là sur ces écritures, il n’y a pas d’impact sur les performances car c’est pré-compilé une seule fois et les calculs doivent se faire de toute manière à peu près pareil ensuite.

Si tu dois employer ce test en plusieurs endroits, tu peux te créer un filtre (fonction PHP) pour renvoyer dans les squelettes SPIP l’expression calculée à partir de l’argument passé et ainsi le code de calcul sera proprement rangé dans le fichier de fonctions PHP et le squelette sera visuellement allégé.

Si tu dois employer ce test en plusieurs endroits, tu peux te créer un filtre (fonction PHP) pour renvoyer dans les squelettes SPIP l’expression calculée à partir de l’argument passé et ainsi le code de calcul sera proprement rangé dans le fichier de fonctions PHP et le squelette sera visuellement allégé.

Je vais voir comment je peux réaliser cela via la documentation SPIP, je ne maîtrise pas encore bien le fonctionnement des fonctions « homemade ».

En attendant, j’ai fais simple pour tester :

{where articles.date <= NOW() }

ça a l’air de fonctionner comme attendu.