Ajouter le support des catégories dans vos pages WordPress

Mis à jour le :

Les catégories sous WordPress sont actives pour vos articles mais comme n’importe quelle taxonomie vous pouvez en disposer pour d’autres types de contenus comme les pages.

Cette technique permet de croiser l’information : une même catégorie peut classer à la fois des articles et des pages, puis les lister ensemble dans son archive. Elle ne modifie pas l’adresse des pages pour autant : même avec une structure de permaliens qui contient %category%, une page garde son adresse habituelle.

Commencez par créer un mu-plugin puis collez ces lignes de code à l’intérieur :

/* Activer le support des catégories pour les pages */
function wpc_cat_pages() {
	register_taxonomy_for_object_type('category', 'page');
}
add_action('init', 'wpc_cat_pages');

Une fois le fichier déposé dans votre répertoire /wp-content/mu-plugins/, retournez dans votre back-office WordPress : le sous-menu Pages > Catégories apparaît, ainsi qu’une colonne Catégories dans la liste des pages.

Écran Pages > Toutes les pages de WordPress avec le code de l’article actif : dans le menu latéral, Pages est déplié sur Toutes les pages, Ajouter une page et Catégories ; la liste compte trois pages publiées de Claire Martin, Création de sites et Maintenance classées dans Prestations, Guide de démarrage dans Ressources, avec une colonne Catégories entre Auteur/autrice et Commentaires et une liste de filtre par catégorie (Toutes) au-dessus du tableau.
Le sous-menu Catégories sous Pages et la colonne Catégories de la liste des pages

Le fonctionnement habituel opère, il suffit d’éditer une page pour lui assigner une catégorie : dans l’éditeur de blocs, le panneau Catégories s’affiche dans l’onglet Page de la colonne latérale. Aucun réglage supplémentaire n’est nécessaire, car la taxonomie category est déjà déclarée avec show_in_rest à true, la condition pour qu’une taxonomie apparaisse dans l’éditeur de blocs.

Éditeur de blocs de WordPress sur la page de démonstration « Maintenance », avec le code de l’article actif : la barre latérale est ouverte sur l’onglet Page (pas l’onglet Bloc) et, sous les réglages de la page, le panneau Catégories est déplié avec Prestations cochée, Ressources non cochée et le lien Ajouter une catégorie.
Le panneau Catégories dans la colonne latérale de l’éditeur d’une page

Vous pouvez étendre cela à d’autres types de contenus personnalisés en répétant la ligne 3 avec l’identifiant de chaque type : la fonction register_taxonomy_for_object_type() n’accepte qu’un type à la fois et, si vous lui passez un tableau, elle renvoie false sans rien faire ni afficher d’erreur. Pour un type de contenu déclaré par une extension, accrochez plutôt votre fonction au crochet init avec une priorité de 20, comme je l’explique dans le tutoriel pour utiliser les catégories et les étiquettes avec vos Custom Post Types.

Afficher vos pages dans les archives de catégories

Classer une page dans une catégorie ne suffit pas à l’afficher sur le site : l’archive d’une catégorie ne liste que les articles, même quand des pages y sont rattachées. Ajoutez les pages à la requête principale de ces archives avec le crochet pre_get_posts, dans le même mu-plugin :

function wpc_add_pages_to_category_archives( $query ) {
	if ( is_admin() || ! $query->is_main_query() ) {
		return;
	}

	if ( $query->is_category() ) {
		$query->set( 'post_type', array( 'post', 'page' ) );
	}
}
add_action( 'pre_get_posts', 'wpc_add_pages_to_category_archives' );

Le test is_main_query() limite la modification à la requête principale de la page : les autres listes de contenus ne sont pas touchées, pas plus que l’administration grâce à is_admin(). Avec un thème à blocs, le bloc Boucle de requête du modèle d’archive reprend cette requête principale tant que son réglage Type de requête est sur Par défaut.

Pour rapprocher encore les pages des articles, vous pouvez ajouter un champ extrait aux pages.

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…

10 réponses

  1. Avatar de Jepigi
    Jepigi

    Bonjour,
    Merci pour ce code (et tout le reste d’ailleurs !)
    Lors de la derniere MAJ de WP et du theme ASTRA ce code génère une erreur « l’éditeur a rencontré une erreur inattendue »
    Le code était inséré dans un child theme et fonctionnait parfaitement avant.
    Cette erreur apparait aussi pour des plugins qui proposent la même fonction, par exemple le plugin « Post Tags and Categories for Pages »
    Une idée sur la façon de rendre ce code compatible ?
    Merci !

    1. Avatar de Jepigi
      Jepigi

      Rebonjour,
      Apres investigation il apparait que cette ligne de code rentre en conflit avec les pages sur lesquelles figurent un formulaire de contact CF7.
      A suivre…

  2. Avatar de EDANE TONNY
    EDANE TONNY

    Bonjour et merci pour ce tuto Formidable. S’lement moi j’ne dispose pas encore d’un pass premium pour installer des plugins. Y’aurait il une solution pour moi?

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

      Il n’y a pas de pass premium sur un site WordPress sauf si vous faites référence à wordpress.com.

  3. Avatar de GL
    GL

    Excellent, merci

  4. Avatar de Pascal
    Pascal

    Bonjour
    En ayant ce snippet d’activé et sachant que mes permaliens sont réglés sur /%category%/%postname% comment se fait il que quand je crée une page et lui attribue une catégorie, cette catégorie n’est pas automatiquement incluse dans l’URL ?
    Merci

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

      Bonjour Pascal, le tutoriel montre comment ajouter le support des catégories pour les pages mais cela ne suffit pas pour modifier la gestion des permaliens sur les pages. C’est plus complexe et je ne l’ai pas traité ici. Une extension comme Permalinks Customizer pourrait faire l’affaire.

  5. Avatar de Herve
    Herve

    Merci, ça marche parfaitement.

  6. Avatar de Jeremie
    Jeremie

    Merci Aurélien, c’est super!
    J’ai une question:
    Pour configurer et afficher la catégorie d’un post on créé une page : « category.php »
    Pour un post type qui serait « produit » on créé la page: « taxonomy-categorie_produit.php »
    Et pour les catégorie de pages comment faut-il appeler la page d’appel?
    Est-ce « taxonomy-categorie_page.php » ?

    Merci d’avance
    🙂

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

      C’est inexact, on génère un fichier sous la forme taxonomy_nom_taxonomie.php et non avec le nom du type de contenu. Ensuite, il faut avoir recours à une fonction via pre_get_posts pour injecter des types de contenus additionnels dans category.php si nécessaire. En effet, par défaut cela ne reprendra que les articles.