Fixer une date de péremption sur vos articles WordPress

Mis à jour le :

Indiquer une date limite de publication sous WordPress n’est pas disponible en natif à la différence d’une date future de parution de vos articles. 2 techniques existent pour ajouter cette fonctionnalité.

Méthode n°1 – Utilisation de l’extension PublishPress Future (ex-Post Expirator)

Bien que je ne sois pas spécialement fan d’utiliser un plugin dans tous les cas, il faut bien avouer que c’est de loin la solution la plus simple pour disposer d’une fonction de date limite pour vos articles.

Post Expirator s’appelle désormais PublishPress Future. Rendez-vous dans Extensions > Ajouter une extension puis saisissez PublishPress Future dans le champ de recherche. Une fois la recherche effectuée, cliquez sur Installer maintenant puis sur Activer.

Si vous préférez passer par votre client FTP, téléchargez-la à partir du lien suivant :

Post Expirator

Plugin WordPress permettant de fixer une date limite sur vos articles. Failles de sécurité détectées par BoiteAWeb, en attente de correction. »

Taille du fichier : 10 Ko

Un panneau Actions Future s’affiche désormais dans la barre latérale de l’éditeur de vos articles et de vos pages. Cochez Activer l’action Future, choisissez l’action à appliquer dans la liste Action, puis la date et l’heure. Par défaut, l’extension propose de Modifier l’état en Brouillon, ce qui dépublie l’article ; vous pouvez aussi le passer en privé, le placer dans la corbeille, le supprimer ou modifier ses catégories.

Capture d'écran - Post Expirator, plugin WordPress
La boîte de Post Expirator en 2011 : devenue PublishPress Future, l’extension présente désormais ses réglages dans la barre latérale de l’éditeur

N’oubliez pas de mettre à jour les articles concernés.

Méthode n°2 – Utilisation d’un hack PHP

Programmer la dépublication avec WP-Cron

Cette technique est de loin la plus compliquée des 2 – elle est réservée aux utilisateurs avancés.

La première version de cette méthode modifiait la boucle du fichier index.php du thème pour masquer les articles expirés. Je vous la déconseille aujourd’hui : l’article restait accessible à son adresse et dans le flux RSS, la comparaison lisait les dates DD/MM/YYYY comme des dates américaines (un article daté du 25/12 disparaissait aussitôt, le 05/09 était compris comme le 9 mai), et les modèles d’un thème à blocs sont des fichiers HTML qui n’exécutent pas de PHP.

Je vous propose plutôt de dépublier réellement l’article à la date voulue : chaque fois que la date est saisie ou modifiée, le code ci-dessous programme une tâche WP-Cron qui fera passer l’article à l’état Brouillon le moment venu.

Ajoutez ce code dans le fichier functions.php de votre thème enfant ou dans une extension de fonctions globales :

/**
 * Returns the expiration date stored in the "expiration" custom field as a timestamp,
 * or null if there is none. Accepted formats: DD/MM/YYYY or DD/MM/YYYY HH:MM (site time zone).
 */
function wpc_get_expiration_timestamp( int $post_id ): ?int {
	$value = trim( (string) get_post_meta( $post_id, 'expiration', true ) );

	foreach ( array( '!d/m/Y H:i', '!d/m/Y' ) as $format ) {
		$date   = DateTimeImmutable::createFromFormat( $format, $value, wp_timezone() );
		$errors = DateTimeImmutable::getLastErrors();

		// Reject impossible dates such as 31/02/2027, which PHP would silently move to March.
		if ( $date && ( false === $errors || 0 === $errors['warning_count'] + $errors['error_count'] ) ) {
			return $date->getTimestamp();
		}
	}

	return null;
}

/**
 * Schedules (or reschedules) the unpublishing of a post with WP-Cron.
 */
function wpc_schedule_post_expiration( int $post_id ): void {
	if ( wp_is_post_revision( $post_id ) ) {
		return;
	}

	wp_clear_scheduled_hook( 'wpc_unpublish_expired_post', array( $post_id ) );

	$timestamp = wpc_get_expiration_timestamp( $post_id );

	if ( null !== $timestamp && in_array( get_post_status( $post_id ), array( 'publish', 'future' ), true ) ) {
		wp_schedule_single_event( max( $timestamp, time() ), 'wpc_unpublish_expired_post', array( $post_id ) );
	}
}
add_action( 'save_post', 'wpc_schedule_post_expiration' );

/**
 * Also reacts when the custom field is added or updated on its own (Custom Fields panel, imports, etc.).
 */
function wpc_expiration_field_changed( $meta_id, $post_id, $meta_key ): void {
	if ( 'expiration' === $meta_key ) {
		wpc_schedule_post_expiration( (int) $post_id );
	}
}
add_action( 'added_post_meta', 'wpc_expiration_field_changed', 10, 3 );
add_action( 'updated_post_meta', 'wpc_expiration_field_changed', 10, 3 );

/**
 * Switches the post to draft once its expiration date has passed.
 */
function wpc_unpublish_expired_post( int $post_id ): void {
	$timestamp = wpc_get_expiration_timestamp( $post_id );

	if ( null === $timestamp || $timestamp > time() || 'publish' !== get_post_status( $post_id ) ) {
		return;
	}

	// WP-Cron runs without a logged-in user: turn KSES off so the post content is saved untouched.
	$kses = (bool) has_filter( 'content_save_pre', 'wp_filter_post_kses' );
	kses_remove_filters();

	wp_update_post(
		array(
			'ID'          => $post_id,
			'post_status' => 'draft',
		)
	);

	if ( $kses ) {
		kses_init_filters();
	}
}
add_action( 'wpc_unpublish_expired_post', 'wpc_unpublish_expired_post' );

La date est interprétée dans le fuseau horaire choisi dans Réglages > Général. La tâche est recalculée à chaque modification de la date ou de l’article, et le code vérifie de nouveau la date au moment de l’exécution : si vous la repoussez ou supprimez le champ, l’article reste en ligne. Pensez-y aussi avant de republier un article expiré : tant que sa date reste dépassée, il repasse en brouillon à la prochaine exécution de WP-Cron.

Ajout d’un champ personnalisé

Le fonctionnement de ce hack est simple. Spécifiez un champ personnalisé avec la clé expiration dans les articles concernés puis indiquez une date au format DD/MM/YYYY comme valeur, éventuellement suivie d’une heure au format HH:MM (15/01/2027 18:00, par exemple). Dans l’éditeur de blocs, affichez d’abord ce panneau depuis le menu Options : Préférences > Général, rubrique Avancé, option Champs personnalisés, puis Afficher et recharger la page. Le panneau Champs personnalisés apparaît sous le contenu : saisissez expiration comme nom et la date comme valeur, puis cliquez sur Ajouter un champ personnalisé.

Par exemple, 01/01/2027 si vous souhaitez faire un article pour la Saint-Sylvestre : il sera dépublié le 1er janvier à minuit.

Éditeur de blocs de WordPress sur l’article publié « Programme de la soirée du Nouvel An » : sous le contenu, le panneau Champs personnalisés affiche le champ expiration avec la valeur 01/01/2027 et ses boutons Supprimer et Mettre à jour, au-dessus du formulaire Ajouter un champ personnalisé ; la barre latérale indique l’état Publié.
Respectez le format de date européen pour la valeur

Pour tester son bon fonctionnement, indiquez une date déjà passée sur un article de test : il passe à l’état Brouillon à la prochaine exécution de WP-Cron. Une date saisie dans un autre format, ou impossible comme le 31/02, est ignorée.

Dans les 2 cas évoqués ici, la technique reste la même : une date enregistrée dans un champ personnalisé de l’article, puis une tâche planifiée qui applique l’action à l’échéance. Ces tâches WP-Cron se déclenchent lors des visites sur votre site : sur un site peu fréquenté, l’article peut rester en ligne un peu après l’heure prévue. Si c’est gênant, ou si WP-Cron est désactivé sur votre site, confiez WP-Cron au planificateur de tâches de votre serveur.

Pour d’autres réglages d’affichage des articles, apprenez à exclure les articles épinglés de la boucle.

Avatar de Aurélien Denis

Protégez votre site WordPress

Vos données sont précieuses,
ne prenez pas le risque de tout perdre.
Confiez-moi votre maintenance !

Ces articles devraient t’intéresser…

21 réponses

  1. Avatar de Ludovic Dupont
    Ludovic Dupont

    Bonjour, je cherches dans le même style, mais je voudrais juste simplement que l’article soit pas effacé mais toujours présent sur le site si on tape son URL. Juste que certains articles s’affichent pendant un temps et après plus visible visuellement.

    Merci pour vos infos

  2. Avatar de karine
    karine

    Bonjour,

    Au final je suis allée sur ce lien : http://snipplr.com/view/3899/ j’ai inséré le code comme indiqué. Il va falloir que je teste sur un article récent mais ça à l’air de marcher.

    L’avantage c’est qu’apparemment, sous réserve de vérifications, l’article disparait de l’affichage sur le blog mais pas des archives. C’est déjà un pas.

    Je vous remercie pour votre réponse. Je me doute que ça ferait pas mal de choses à tester de votre côté et comme cela date, je vais continuer mes tests ^^ je pense que vais arriver à trouver quelque chose quand même.

    Cordialement.

    Karine

  3. Avatar de karine
    karine

    Bonjour,

    WordPress tourne très bien chez moi… Je suis avec la version 4.1.5 et ça fonctionne. La version PHP de Free doit normalement évoluer donc j’attends et j’espère.

    Le code indiqué fonctionnerait mais ne fait pas tout ce que je voudrais…C’est pour cela que je vous avais contacté.

    1. Avatar de Aurélien Denis
      Aurélien Denis

      Ce n’est pas normal que Free ne vous donne pas la possibilité d’évoluer car les minimum sont supérieurs à votre version actuelle : https://wordpress.org/about/requirements/

      Et encore, PHP 5.4 est conseillé.

      Sinon, pour le bout de code, c’est faisable mais cela nécessiterait de tester pas mal de choses de mon côté… 🙂

  4. Avatar de Aurélien Denis
    Aurélien Denis

    Bonjour Karine, désolé je n’avais pas vu passer votre commentaire parmi le flot continu… oui votre version de PHP est dépassé depuis de très nombreuses années. Elle ne permet pas théoriquement de faire tourner WordPress. Il vous faut évoluer absolument ! 🙂

  5. Avatar de karine
    karine

    Bonjour,

    Personne pour me répondre ou m’aider ?

    Cordialement.

    Karine

  6. Avatar de Karine
    Karine

    Bonjour,

    Pour ma part le plugin post expirator ne fonctionne pas chez moi ! Apparemment ma version de PHP pose soucis… J’ai beau demander sur le support du plugin, je n’ai pas de réponses.

    Je me demandais si on pouvait avoir une modification du code de base donné pour que les articles basculent vers une catégorie type « anciens articles » ?

    Je ne suis pas experte en programmation 🙂

    Cordialement.

    Karine

  7. Avatar de Maguin Philippe
    Maguin Philippe

    Bonjour,
    Est ce que cette technique fonctionne aussi pour une date entrée dans une meta box ? Car j’essaye mais je n’y arrive pas ?

    Cordialement
    Philippe

    1. Avatar de Aurélien Denis
      Aurélien Denis

      Oui bien sûr ! Une metaboxe n’est qu’une interface utilisateur pour un champ personnalisé lequel se compose d’une clé et d’une valeur. Il faut veiller à récupérer le nom exact du champ personnalisé.

  8. Avatar de bosnay gilles
    bosnay gilles

    le texte de cette page ne s’affiche as sur chrome mac sinon parfait sur safari ???
    bon courage

    1. Avatar de Aurélien Denis
      Aurélien Denis

      Visiblement c’est un bug de responsive sous Chrome généralisé à l’ensemble du site. Merci de m’avoir alerté ! Je vais mener des investigations… pour info, redimensionner la fenêtre résous le bug ici.

  9. Avatar de Cedric
    Cedric

    est il possible de recevoir un mail lorsque la page arrive à son terme?

  10. Avatar de valentinboisseau
    valentinboisseau

    Bonjour article interessant néanmoins je recherche quelque chose d’autre : Enlever la limite de la date de publication dans le temps (date passé en l’occurrence pour moi) exemple pour les année 1800 voir encore plus ancien. Comment s’y prendre ? merci

  11. Avatar de Linda
    Linda

    Merci pour les conseils, je vais tester ça 🙂

  12. Avatar de Nico
    Nico

    Il y aurait un autre plugin qui fait la même chose, mais qui a été mis a jour plus récemment : http://wordpress.org/extend/plugins/content-scheduler/

    Mais je me pose toujours la même question : est ce que la suppression d’article n’affecte pas le référencement ? (page 404 etc…)

    1. Avatar de Aurélien Denis
      Aurélien Denis

      Si le fait de limiter dans le temps un article doit être réservé à des usages bien particulier. Ce n’est jamais conseillé de supprimer un élément déjà publié régulièrement d’où aussi le fait que cette option n’existe pas par défaut – et aussi parce que l’usage est limité.

      1. Avatar de David
        David

        Bonjour,
        merci pour cette info.
        Ne serait-il pas possible de basculer l’article dans une catégorie annexe ?
        Cette astuce serait alors Tip Top pour des agenda ou des article événementiel.
        De plus cela éviterai les erreur 404.

  13. Avatar de Oscense
    Oscense

    Merci pour l’info ! Sauf qu’il faut préciser qu’apparemment le plugin ne fonctionne plus depuis plusieurs mois (http://wordpress.org/tags/post-expirator?forum_id=10) et il n’y a pas eu de mise à jour depuis janvier 2011 🙁 En espérant que son auteur se réveillera bientôt…

    1. Avatar de Aurélien Denis
      Aurélien Denis

      Ca m’étonne, il me semble que cela fonctionnait lors du test… tu l’as testé ?

  14. Avatar de Nico
    Nico

    Intéressante cette fonctionnalité, je la cherchais depuis un bon bout de temps. Par contre, je m’interroge sur ses effets négatifs sur le référencement, qu’en penses tu Aurélien ?