Advertisement
  1. Web Design
  2. HTML/CSS
  3. HTML

Ajouter une date d'expiration aux articles Wordpress

Scroll to top
Read Time: 9 min

() translation by (you can also view the original English article)

Je gère plusieurs sites qui incluent des notifications et des messages d'information importants sous forme de bannière sur la page d'accueil. J'ai tendance à utiliser un type de contenu personnalisé pour ça afin d'ajouter mes bannières et de les afficher où j'en ai besoin dans mon thème. (Si vous souhaitez faire quelque chose de similaire, c'est expliqué dans ce tutoriel)

Invariablement, mes bannières ont une date d'expiration. Elles peuvent contenir des informations sur un événement à venir ou un poste vacant par exemple. Une fois l'événement passé ou le poste pourvu, je dois aller sur le site et supprimer manuellement l'article.

Ce serait beaucoup plus simple, lorsque je crée ce type d'articles, de pouvoir spécifier une date d'expiration après laquelle ils ne seraient plus visible sur mon site.

Dans ce tutoriel, je vais vous montrer comment faire ça. Il y a trois étapes :

  1. Créer une boîte de champ personnalisé pour la date d'expiration sur la page d'édition d'article.
  2. Ajouter le sélecteur de date de jQuery UI sur ce champ afin d'améliorer l'interface.
  3. Et enfin, utiliser le hook pre_get_posts pour s'assurer que les articles ne soient pas affichés après leurs dates d'expiration.

Ce dont vous aurez besoin

Pour accomplir ce tutoriel vous aurez besoin :

  • d'une installation de Wordpress pour le développement
  • d'un éditeur de code

Vous allez créer une extension avec tout le code nécessaire pour gérer une date d'expiration et l'activer sur votre site. C'est parti !

Mettre en place l'extension

Premièrement, vous devez créer votre plugin. Dans le répertoire "plugins" de votre répertoire wp-content, créez un fichier vide nommé tutsplus-post-expiry-date.php

Ouvrez le fichier dans votre éditeur de code et ajoutez-y le code suivant :

1
<?php
2
/*

3
Plugin Name: Add an Expiry Date to Posts

4
Plugin URI: https://.tutsplus.com/tutorials/add-an-expiry-date-to-wordpress-posts--cms-22665

5
Description: Adds an expiry date to posts, using a the jQuery UI datepicker

6
Author: Rachel McCollin

7
Version: 1.0

8
 */

Vous allez devoir éditer ce fichier pour utiliser votre propre nom et URL d'extension. Vous en avez besoin pour indiquer à Wordpress que c'est une extension et ce qu'elle fait.

Maintenant allez dans la partie Extensions dans l'administration Wordpress et activez l'extension.

Créer le champ personnalisé

Dans un premier temps, nous allons créer la boîte de champ personnalisé pour la date d'expiration.

En utilisant add_meta_box() pour afficher une boîte de champ personnalisé.

La première étape consiste à créer la fonction qui va ajouter la boîte de champ personnalisé à l'écran d'édition d'article. Ajouter ceci à votre fichier d'extension :

1
function tutsplus_add_expiry_date_metabox() {
2
    add_meta_box( 
3
        'tutsplus_expiry_date_metabox', 
4
        __( 'Expiry Date', 'tutsplus'), 
5
        'tutsplus_expiry_date_metabox_callback', 
6
        'post', 
7
        'side', 
8
        'high' 
9
    );
10
}
11
add_action( 'add_meta_boxes', 'tutsplus_add_expiry_date_metabox' );

On utilise la fonction add_meta_box qui a six paramètres :

  • 'tutsplus_expiry_date_metabox' : l'identifant unique de cette boîte de champ personnalisé
  • __( 'Expiry Date', 'tutsplus') : c'est ce qui est affiché comme titre de la boîte de champ personnalisé
  • 'tutsplus_expiry_date_metabox_callback' : la fonction de rappel qui rempli la boîte de champ personnalisé (nous allons créer ça après)
  • 'post' : le type de contenu sur lequel cette boîte de champ personnalisé apparaîtra lors de l'édition
  • 'side' : dans quel partie de l'écran apparaîtra la boîte de champ personnalisé
  • 'high' : à quelle position la boîte de champ personnalisé aparaîtra 

La fonction est attachée par la suite au hook add_meta_boxes pour l'appeller au bon moment.

Créer la fonction de rappel

Si vous enregistrez votre extension et affichez votre écran d'édition maintenant, vous verrez une erreur parce que la fonction de rappel n'a pas été définie. C'est donc ce que nous allons faire.

Ajouter ceci à votre fichier d'extension :

1
function tutsplus_expiry_date_metabox_callback( $post ) { ?>
2
    
3
  <form action="" method="post">
4
		
5
		<?php 		
6
		//retrieve metadata value if it exists

7
		$tutsplus_expiry_date = get_post_meta( $post->ID, 'expires', true );
8
		?>
9
		
10
		<label for "tutsplus_expiry_date"><?php __('Expiry Date', 'tutsplus' ); ?></label>
11
				
12
		<input type="text" class="MyDate" name="tutsplus_expiry_date" value=<?php echo esc_attr( $tutsplus_expiry_date ); ?> / >			
13
	
14
	</form>
15
	
16
<?php }

Regardons ce que ça fait :

  • On définit la fonction de rappel tutsplus_expiry_date_metabox_callback() avec $post en paramètre.
  • On ouvre un élément de formulaire.
  • On créé une variable appelée $tutsplus_expiry_date avec comme valeur la valeur de la clé 'expires'.
  • On crée un label pour le champ dans la boîte de champ personnalisé.
  • On crée un élément de formulaire avec la classe MyDate pour faire fonctionner le sélecteur de date, le nom tutsplus_expiry_date que nous utiliserons plus tard lors de l'enregistrement de la valeur du champ et la valeur $tutsplus_expiry_date.
  • On ferme l'élément de formulaire.

Maintenant nous avons le formulaire mais qui ne fera rien tant que nous ne créons par une fonction pour enregistrer les données que l'utilisateur ajoutera.

Sauvegarder les données lors de l'enregitsrement de l'article

Pour sauvegarder les données du formulaire, nous avons besoin de créer une fonction et ensuite de l'attacher au hook save_post.

Dans votre fichier d'extension, ajoutez ceci :

1
function tutsplus_save_expiry_date_meta( $post_id ) {
2
    
3
	// Check if the current user has permission to edit the post. */

4
	if ( !current_user_can( 'edit_post', $post->ID ) )
5
    return;
6
	
7
	if ( isset( $_POST['tutsplus_expiry_date'] ) ) {		
8
		$new_expiry_date = ( $_POST['tutsplus_expiry_date'] );
9
		update_post_meta( $post_id, 'expires', $new_expiry_date );		
10
	}
11
	
12
}
13
add_action( 'save_post', 'tutsplus_save_expiry_date_meta' );

On effectue les choses suivantes :

  • On vérifie sur l'utilisateur actuel à la capacité edit_post pour l'article actuel.
  • Si oui, on verifie si des données ont été entrée dans la boîte de champ personnalisé en utilisant isset.
  • Si c'est le cas, on crée une variable nommée $new_expiry_date et on lui donne la valeur qui a été entrée.
  • Enfin, on met à jour les métadonnées de l'article avec cette valeur.

Nous avons donc une boîte de champ personnalisé qui laisse nos utilisateurs ajouter du texte et l'enregister dans les métadonnées de l'article. Rendons ça plus sécurisé.

Ajouter un nonce pour la securité

Pour s'assurer que les métadonnées d'article sont bien éditée par ce formulaire nous allons ajouter un nonce.

Dans la fonction de rappel, avant le contenu de la fonction, ajoutons le code suivant :

1
wp_nonce_field( 'tutsplus_expiry_date_metabox_nonce', 'tutsplus_nonce' );

Ensuite, dans la fonction tutsplus_save_expiry_date_meta() qui enregistre les données, ajoutons ceci au début de la fonction :

1
if( !isset( $_POST['tutsplus_nonce'] ) ||
2
    !wp_verify_nonce( $_POST['tutsplus_nonce'],
3
	'tutsplus_expiry_date_metabox_nonce'
4
	) ) 
5
return;

Enregistrez maintenant votre extension et jettez un oeil à la page d'édition d'article. Vous verrez la boîte de champ personnalisé :

Edit Post screen with meta box addedEdit Post screen with meta box addedEdit Post screen with meta box added

C'est un bon début mais le problème est que, pour le moment, c'est simplement un champ de texte normal et qu'il n'y aucun moyen de s'assurer que vos utilisateurs y entrent des dates dans un format correct. Nous allons corriger ça en ajoutant le sélécteur de date jQuery UI.

Ajouter le sélecteur de date jQuery UI

La bonne nouvelle c'est que le sélecteur de date jQuery UI est déjà chargé avec Wordpress donc vous n'aurez pas à l'ajouter ou l'installer: il suffit juste de l'empiler dans une fonction.

Au début de votre fichier d'extension, ajoutez :

1
function tutsplus_load_jquery_datepicker() {    
2
	wp_enqueue_script( 'jquery-ui-datepicker' );
3
	wp_enqueue_style( 'jquery-style', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/themes/smoothness/jquery-ui.css' );
4
}
5
add_action( 'admin_enqueue_scripts', 'tutsplus_load_jquery_datepicker' );

Cela rajoute à la file d'attente à la fois le script lui-même et la feuille de style pour le script stockée sur Google APIs. Notez que vous devez connecter ce hook avec le hook admin_enqueue_scripts et non pas avec wp_enqueue_scripts ce qui l'ajouterez sinon à la liste des scripts chargés côté visiteurs.

Ensuite, vous avez à ajouter un script à la fonction de rappel qui génère votre formulaire. Après l'élément de formulaire et avant la balise fermante </form>, ajoutez ceci :

1
<script type="text/javascript">
2
    jQuery(document).ready(function() {
3
		jQuery('.MyDate').datepicker({
4
			dateFormat : 'dd-mm-yy'
5
		});
6
	});
7
</script>			

On attache à l’élément ayant la classe MyDate le script du sélecteur de date.

Votre fonction de rappel va désormais ressembler à ça :

1
function tutsplus_expiry_date_metabox_callback( $post ) { ?>
2
    
3
	<form action="" method="post">
4
		
5
		<?php 		
6
		// add nonce for security

7
		wp_nonce_field( 'tutsplus_expiry_date_metabox_nonce', 'tutsplus_nonce' );
8
		
9
		//retrieve metadata value if it exists

10
		$tutsplus_expiry_date = get_post_meta( $post->ID, 'expires', true );
11
		?>
12
		
13
		<label for "tutsplus_expiry_date"><?php __('Expiry Date', 'tutsplus' ); ?></label>
14
				
15
		<input type="text" class="MyDate" name="tutsplus_expiry_date" value=<?php echo esc_attr( $tutsplus_expiry_date ); ?> / >
16
		
17
		<script type="text/javascript">
18
			jQuery(document).ready(function() {
19
				jQuery('.MyDate').datepicker({
20
					dateFormat : 'dd-mm-yy'
21
				});
22
			});
23
		</script>			
24
	
25
	</form>
26
	
27
<?php }

Maintenant, regardons à quoi ressemble la boîte de champ personnalisé après que j'ai enregistré mon fichier d'extension :

Meta box with datepicker addedMeta box with datepicker addedMeta box with datepicker added

C'est beaucoup mieux ! Mais bien que vous puissiez désormais ajouter une date d'expiration à vos articles, cela ne change pas le fait qu'ils soient affichés ou non sur votre site. Changeons cela dès maintenant.

Changer la requête pour exclure les articles expirés

L'étape finale consiste à modifier la requête principale en utilisant le hook pre_get_posts.

Toujours dans votre fichier d'extension, ajoutez ce code :

1
function tutsplus_filter_expired_posts( $query ) {
2
    
3
    // doesn't affect admin screens

4
    if ( is_admin() )
5
        return;
6
    // check for main query	

7
	if ( $query->is_main_query() ) {
8
9
    	//filter out expired posts

10
        $today = date('d-m-Y');
11
        $metaquery = array(
12
            array(
13
                 'key' => 'expires',
14
                 'value' => $today,
15
                 'type' => 'DATE',
16
                 'compare' => '<'
17
			)
18
        );
19
        $query->set( 'meta_query', $metaquery );
20
	}
21
}
22
add_action( 'pre_get_posts', 'tutsplus_filter_expired_posts' );

On fait six choses :

  • Premièrement, on définit la fonction tutsplus_filter_expired_posts() avec $query en paramètre.
  • On vérifie si nous sommes dans une des pages d’administration puisque nous ne voulons pas exclure les articles expirés de celles-ci.
  • Ensuite, on vérifie si la requête principale est en cours.
  • Si c'est le cas, on définit la variable $today à la date d'aujourd'hui en utilisant le même format de date que le sélecteur de date utilise.
  • On définit $metaquery pour exclure les articles dont la date d'expiration est avant aujourd'hui en utilisant l'opérateur compare.
  • Enfin, on remet la requête à zéro en utilisant la variable $metaquery.

La fonction est rattachée au hook pre_get_posts qui va l'exécuter à chaque requête qui récupère des articles.

Sauvegardez votre fichier d'extension et testez le. Créez un article avec une date de publication d'il y a quelques jours et une date d'expiration à hier. Sauvegardez-le et allez sur la page principale de votre blog. Vous pourrez constater que l'article que vous venez juste de créer n'est pas là !

Résumé

Avoir la possibilité d'avoir des articles expirants automatiquement à une date donnée peut être très utile. Si le contenu d'un article n'est plus d'actualité ou que vous ne souhaitez pas que des personnes le voit après une date donnée, ajouter une date d'expiration vous permet de ne pas avoir à vous souvenir de le mettre à jour ou de l'effacer.

En ajoutant le sélecteur de date de jQuery, vous créez une boîte de champ personnalisé conviviale qui vous fait gagner du temps et évite de créer de la confusion.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.