Annonces à venir proposées, et dates d'événement au lieu des dates de publication

Retour du commanditaire après le premier envoi réel (juillet 2026) : des
annonces à venir n'étaient pas proposées à la coche, et les dates affichées
étaient les dates de publication.

- Fenêtre « à venir » de 12 mois (FUTURE_HORIZON_MONTHS), démarrant à la fin
  du mois de la newsletter ou à aujourd'hui si ce mois est passé, en
  remplacement du plafond « début de fenêtre <= fin du mois ». Idem pour les
  séances (SEANCE_WINDOW_MARGIN_DAYS de 5 jours supprimée). Ces items sont
  regroupés dans un bloc « À venir », décochés par défaut.
- event_date_label() centralise les libellés du thème (« Le X de H1 à H2 »,
  « Du X au Y », « Jusqu'au X », « X à H ») sur la convention
  date_de_debut > datetime > post_date. Utilisée par l'export et par la
  pastille de la liste à cocher, qui affichent donc la même chose.
- Tri par date d'événement (sql_event_date_order) et non par date de
  publication.
- Fenêtres de fin « +35 j » et « +3 mois » recalées sur la date d'événement :
  un événement annoncé plus de 35 jours à l'avance sortait de la fenêtre
  avant d'avoir eu lieu et manquait dans la newsletter de son propre mois.
- merge_selected_items() : une sélection déjà enregistrée est réinjectée dans
  la liste même si ses items sont sortis de la fenêtre — sans ça, rouvrir puis
  réenregistrer une ancienne newsletter l'amputait silencieusement.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011w7RzAHv4r1Yahnm2NwDDG
This commit is contained in:
2026-08-27 17:48:08 +02:00
co-authored by Claude Opus 5
parent 021f322719
commit 3cf09ea74f
6 changed files with 409 additions and 136 deletions
+15 -16
View File
@@ -540,28 +540,27 @@ body { margin: 0 !important; padding: 0 !important; }
// ── Date helpers ──────────────────────────────────────────────────────────
private function format_date_for_category(int $post_id, int $cat_id): string {
$window = Thalim_NL_Post_Query::get_window_type($cat_id);
// Ouvrages : année seule, comme l'affichage des cartes côté front.
$date_format = ($cat_id === THALIM_NL_CAT_OUVRAGES) ? 'Y' : 'j F Y';
if ($window === 'debut_minus35_to_fin') {
$raw_debut = get_post_meta($post_id, 'date_de_debut', true) ?: '';
$raw_fin = get_post_meta($post_id, 'date_de_fin', true) ?: '';
$debut_str = $this->format_raw_date($raw_debut, $date_format);
$fin_str = $this->format_raw_date($raw_fin, $date_format);
if ($debut_str && $fin_str && $debut_str !== $fin_str) {
return $debut_str . '' . $fin_str;
if ($cat_id === THALIM_NL_CAT_OUVRAGES) {
$raw_dt = get_post_meta($post_id, 'datetime', true) ?: '';
$year = $this->format_raw_date($raw_dt, 'Y');
if ($year) {
return $year;
}
return $debut_str ?: $fin_str;
$post = get_post($post_id);
return $post ? $this->format_raw_date($post->post_date, 'Y') : '';
}
$raw_dt = get_post_meta($post_id, 'datetime', true) ?: '';
if ($raw_dt && !str_starts_with($raw_dt, '0000-00-00')) {
return $this->format_raw_date($raw_dt, $date_format);
// Date de l'événement annoncé (date_de_debut > datetime > date_de_fin),
// et non date de publication : « Du X au Y », « Jusqu'au X », « X à H ».
$label = Thalim_NL_Post_Query::event_date_label($post_id);
if ($label !== '') {
return $label;
}
// Aucune date saisie : dernier recours, la date de publication.
$post = get_post($post_id);
return $post ? $this->format_raw_date($post->post_date, $date_format) : '';
return $post ? $this->format_raw_date($post->post_date) : '';
}
private function format_raw_date(string $raw, string $format = 'j F Y'): string {