
🔒 4 Façons de dépublier un article dans WordPress par programmation
Le site est tombé après une mise à jour d’extension, vous devez masquer d’urgence l’article problématique avant qu’il ne soit trop tard. Et une semaine plus tard, le remettre en ligne une fois le bug corrigé. Ou bien un client vous demande de retirer un article obsolète des résultats de recherche, sans le supprimer définitivement.
Changer manuellement le statut via le panneau d’administration fonctionne pour un ou deux articles. Mais quand il y en a des dizaines ou que la logique doit s’exécuter automatiquement, vous avez besoin d’une approche programmatique. WordPress vous offre quatre façons de dépublier un article via PHP: du brouillon sécurisé à la suppression complète.
Voici chaque méthode avec du code prêt à l’emploi, une explication et une indication sur le moment où l’utiliser.
💡 Aperçu rapide:
- Transformation d’un article en brouillon via
wp_update_postavec le statutdraft, la méthode la plus sûre et la plus réversible - Passage d’un article en privé (
private), visible uniquement par les administrateurs et les éditeurs - Envoi d’un article dans le futur via
post_date, l’article disparaît des résultats de recherche jusqu’à la date spécifiée - Suppression définitive d’un article via
wp_delete_post, un dernier recours avec avertissements et sauvegarde
Étape 1. Brouillon: dépublier un article sans perdre de données
Le scénario le plus courant: vous devez masquer temporairement un article tout en conservant l’intégralité du contenu, l’URL et la possibilité de le rétablir en un clic. Le passage en brouillon est l’option idéale.
Seul le champ post_status dans la table wp_posts est modifié. L’article lui-même, ses méta-données, ses fichiers joints et son URL restent inchangés. Lorsque vous décidez de le remettre en ligne, vous repassez le statut à publish.
Code pour changer le statut en draft. Ajoutez-le au fichier functions.php de votre thème enfant ou via l’extension Code Snippets:
1 /** 2 * Converts a post to draft by ID. 3 * 4 * @param int $post_id ID of the post to unpublish. 5 */ 6 function sd_unpublish_to_draft( $post_id ) { 7 wp_update_post( array( 8 'ID' => $post_id, 9 'post_status' => 'draft', 10 ) ); 11 } 12 13 // Example call: unpublish post with ID = 42 14 sd_unpublish_to_draft( 42 );
wp_update_post() met à jour un enregistrement dans la base de données. Nous passons uniquement l’ID et la nouvelle valeur de post_status, WordPress gère tout le reste automatiquement. Aucun autre champ n’est modifié.
Quand l’utiliser: masquage temporaire d’un article pour révision, désactivation automatique d’articles dont la pertinence a expiré (par exemple, des promotions), modération programmatique de contenu généré par les utilisateurs.
Étape 2. Article privé: masquer aux visiteurs, conserver pour les éditeurs
Le statut privé est un compromis entre public et masqué. L’article n’est pas visible par les visiteurs ordinaires, mais il est accessible aux administrateurs et aux éditeurs dans le panneau d’administration. Pratique pour les documents internes: instructions d’équipe, brouillons de contenu client, pages privées.
Différence avec un brouillon: un article privé est techniquement «publié» et peut avoir sa propre URL, mais WordPress vérifie les droits de l’utilisateur avant de l’afficher. Un visiteur sans la capacité read_private_posts verra une erreur 404.
Le code est similaire au précédent, seul le statut change:
1 /** 2 * Makes a post private — visible only to admins and editors. 3 * 4 * @param int $post_id Post ID. 5 */ 6 function sd_unpublish_to_private( $post_id ) { 7 wp_update_post( array( 8 'ID' => $post_id, 9 'post_status' => 'private', 10 ) ); 11 } 12 13 // Example call 14 sd_unpublish_to_private( 42 );
Remarque: si le site a des rôles utilisateur personnalisés avec des capacités spécifiques, vérifiez-les avant une utilisation massive. Par défaut, les articles privés sont visibles par les rôles editor et administrator.
Quand l’utiliser: contenu d’abonnement premium (en lien avec des extensions d’adhésion), documentation interne d’équipe, masquage d’articles pour une nouvelle validation avec un client avant republication.
Étape 3. Date future: dépublication différée
Une astuce intéressante: au lieu de changer le statut, vous pouvez «envoyer un article dans le futur», en fixant la date de publication à l’année 2050. L’article disparaît instantanément des résultats de recherche, car WordPress n’affiche que les articles dont la date est ≤ au moment présent.
Cette méthode ne modifie pas le post_status: l’article reste publish. Du point de vue de WordPress, il «n’a tout simplement pas encore eu lieu». Un avantage: si nécessaire, vous pouvez restaurer la date réelle et l’article réapparaîtra.
Le code utilise les champs post_date et post_date_gmt:
1 /** 2 * Hides a post by setting its publication date far into the future. 3 * 4 * @param int $post_id Post ID. 5 */ 6 function sd_unpublish_to_future( $post_id ) { 7 $future_date = '2050-12-31 23:59:59'; 8 9 wp_update_post( array( 10 'ID' => $post_id, 11 'post_date' => $future_date, 12 'post_date_gmt' => get_gmt_from_date( $future_date ), 13 ) ); 14 } 15 16 // Example call 17 sd_unpublish_to_future( 42 );
get_gmt_from_date() convertit l’heure locale en GMT, WordPress stocke les deux versions de la date. Ne négligez pas le champ GMT: sans lui, le comportement en cas de changement de fuseau horaire du site devient imprévisible.
Quand l’utiliser: publication de contenu «programmé», masquage temporaire d’actualités sans changer le statut, scénarios où post_status doit rester publish pour la rétrocompatibilité avec d’autres extensions.
Étape 4. Suppression: quand l’article n’est plus du tout nécessaire
wp_delete_post() est une opération irréversible. L’article est supprimé de la base de données, avec tous ses champs méta, ses relations de taxonomie et (en option) ses fichiers joints.
Ce n’est pas une «dépublication» au sens strict. Mais dans le cadre de la gestion programmatique de contenu, la suppression est le quatrième outil, le plus radical. Et il nécessite des garde-fous.
Avant d’exécuter, faites une sauvegarde complète de la base de données. Le script ci-dessous affiche d’abord une liste de ce qui sera supprimé, et seulement ensuite, la version de production.
1 /** 2 * Deletes a post. First — dry-run with info output, then — actual deletion. 3 * 4 * WARNING: irreversible operation. Backup before running. 5 * 6 * @param int $post_id Post ID. 7 * @param bool $force_delete true — delete permanently (skip trash), false — move to trash. 8 */ 9 function sd_delete_post_safe( $post_id, $force_delete = false ) { 10 $post = get_post( $post_id ); 11 12 if ( ! $post ) { 13 error_log( "Post with ID {$post_id} not found." ); 14 return; 15 } 16 17 // Dry-run: output info without deleting 18 error_log( sprintf( 19 'READY TO DELETE: ID=%d, title="%s", status=%s, attachments=%d', 20 $post->ID, 21 $post->post_title, 22 $post->post_status, 23 count( get_attached_media( '', $post_id ) ) 24 ) ); 25 26 // Uncomment the following line for actual deletion: 27 // wp_delete_post( $post_id, $force_delete ); 28 } 29 30 // Dry-run: only outputs info 31 sd_delete_post_safe( 12341, false );
Le paramètre $force_delete:
false, l’article va dans la Corbeille, il peut être restauré dans les 30 jours.true, suppression définitive, impossible à restaurer même via la base de données (sans sauvegarde).
La fonction journalise via error_log(), les messages apparaîtront dans wp-content/debug.log quand WP_DEBUG est activé. En production, remplacez cela par votre propre mécanisme de notification.
Quand l’utiliser: nettoyage automatique d’articles indésirables, suppression de contenu expiré (offres d’emploi, événements), rotation programmatique de contenu avec suppression complète des anciennes entrées.
Comparaison des quatre méthodes
Méthode | Statut de l’article | Réversibilité | Visibilité pour les lecteurs | Visibilité dans l’admin | Quand l’utiliser |
|---|---|---|---|---|---|
Brouillon |
| Totale | Masqué | Tous les rôles avec accès aux articles | Masquage temporaire, révision |
Privé |
| Totale | Masqué | Admins et éditeurs | Contenu interne, premium |
Date future |
| Totale | Masqué jusqu’à la date | Tout le monde | Publication programmée, calendrier |
Suppression | - | Uniquement depuis la Corbeille (30 jours) | - | Admins uniquement | Suppression complète, nettoyage |
⁉️🤔 Questions fréquentes
Quelle est la différence entre dépublier et supprimer?
La dépublication (brouillon/privé/futur) conserve l’article dans la base de données: le contenu, l’URL, les fichiers joints et l’historique SEO restent. La suppression (
wp_delete_post) efface complètement l’enregistrement. Pour un masquage temporaire, utilisez toujours un brouillon, c’est sûr et réversible en une seconde.
Quelle méthode ne nécessite pas de changer post_status?
L’envoi dans le futur via
post_date. L’article restepublish, mais WordPress considère qu’il «n’a pas encore eu lieu» et ne l’affiche pas aux visiteurs. Cela peut être important si d’autres extensions ou extraits de code dépendent du statutpublish.
Puis-je dépublier plusieurs articles à la fois?
Oui, enveloppez l’appel de la fonction dans une boucle sur un tableau d’IDs. Ajoutez
wp_die()ou une limite sur le nombre d’articles par exécution pour éviter de faire planter le site lors d’une opération de masse:array_slice($post_ids, 0, 50)pour un lot de 50.
Dois-je vider le cache après un changement de statut programmatique?
Absolument. WordPress vide le cache interne des articles lorsque
wp_update_post()est appelé, mais le cache externe (extensions comme WP Rocket, cache serveur, CDN) doit être vidé séparément. Ajoutez un appel àwp_cache_flush()ou le hookclean_post_cacheaprès le changement de statut.
Est-il sûr d’exécuter wp_delete_post en production?
Uniquement avec des garde-fous. Avant d’appeler: (1) vérifiez
current_user_can('delete_posts'), (2) demandez une confirmation via un jeton nonce distinct, (3) journalisez l’ID et le titre de l’article supprimé. Et surtout, une sauvegarde. Même dans la Corbeille, un article vit 30 jours, après quoi WordPress le supprime automatiquement.
Que choisir dans votre cas: l’essentiel
Les quatre méthodes couvrent presque tous les scénarios de gestion programmatique des publications. Le choix se résume à une question: avez-vous besoin de conserver l’article?
- Si vous devez masquer temporairement un article pour révision, optez pour le brouillon (
draft). Quelques lignes, zéro risque. - Si le contenu est destiné à un cercle restreint, statut privé (
private). Les éditeurs le voient, les visiteurs non. - Si vous devez masquer un article sans changer son statut, une date future (
post_dateréglée sur 2050). Une astuce maligne mais qui fonctionne. - Si l’article n’est définitivement plus nécessaire, suppression (
wp_delete_post). Mais d’abord, un test à blanc et une sauvegarde complète.
Commencez par une fonction wrapper dans functions.php pour une méthode, par exemple le brouillon. Une fois que vous aurez compris la logique de wp_update_post(), les trois autres méthodes se mettront en place en cinq minutes.
Et vous, quelle méthode utilisez-vous pour la gestion programmatique des articles? Écrivez dans les commentaires, c’est intéressant de comparer les approches.



