Supprimer ou exclure les pages et catégories vides d’un menu WordPress

Mathieu Chartier CMS (WordPress...) 10 commentaires

Créer un site avec le CMS WordPress n'est pas toujours facile, surtout lorsque nous avons encore peu de pages ou d'articles à publier. Qui n'a jamais rêvé d'un thème très reluisant ou design comme on peut en voir sur ThemeForest par exemple ? Souvent, les thèmes prêts à l'emploi vendent du rêve avec leurs contenus d'exemple, mais lorsque nous achetons puis créons notre site web, force est de constater que les catégories et pages semblent bien vides, car nous avons souvent beaucoup moins de rédactionnel à proposer à nos débuts...

Extensions WordPress Mathieu Chartier

La technique habituelle veut que nous ajoutions au fur et à mesure nos nouvelles pages et nouvelles catégories d'articles dans les menus du site WordPress. Le souci est qu'il faut souvent ne pas oublier ce gros détail, sous peine de ne pas publier nos nouveaux contenus.

Solution pour exclure les pages et catégories vides d'un menu WordPress

Nous allons donc trouver un palliatif à cela en créant directement notre menu final, en ajoutant une fonction dans le fichier functions.php de notre thème WordPress, et en la laissant agir gentiment. Son rôle est de vérifier l'existence ou non d'articles dans les catégories, et si ces dernières sont vides, elles ne sont pas affichées dans le menu. Cela est très pratique pour ne plus avoir à penser à son menu WordPress, il suffit de le créer une fois pour toute, sans avoir à y retoucher...^^

En ce qui concerne les pages, j'avoue qu'il s'agit d'un bonus dans la fonction qui m'a semblé intéressant tant il nous arrive d'avoir des pages "vides" en attente de contenu. Souvent, on retrouve la phrase à bannir "Page en construction", mais il est encore préférable de créer des pages vides (uniquement un titre), de les ajouter au menu, et d'attendre qu'elles s'affichent automatiquement quand elles auront des textes, images, vidéos...

La fonction WordPress à ajouter

Je ne vais pas vous faire trépigner davantage, voici la fonction complète qui permet d'afficher dans les menus uniquement les contenus non vides (pages et catégories). Vous pouvez télécharger la fonction ci-dessous ou la recopier dans votre fichier functions.php du thème, selon vos préférences...

Télécharger “Fonction d'exclusion des pages et catégories vides d'un menu WordPress”exclusion-categories-pages-vides.zip – Téléchargé 1042 fois – 810,00 o

// Exclusion des catégories vides dans un menu
function exclure_cat_pages_menu_vides($menu_items, $menu, $args) {
	if(!is_admin()) {
		// Récupère l'ensemble des catégories et pages
		$categories = get_categories(array('taxonomy' => 'category'));
		$pages = get_pages();

		// On teste chaque item du menu pour récupérer tout ce qui ne correspond pas à une catégorie et une page vide
		foreach($menu_items as $item) {
			// Si l'item de menu est une catégorie, on teste...
			if($item->post_type == "nav_menu_item" && $item->object == "category") {
				foreach($categories as $category) {
					if($category->cat_ID == $item->object_id) {
						$items_non_vides[] = $item;
						break;
					}
				}
			} elseif($item->post_type == "nav_menu_item" && $item->object == "page") { // Si l'item est une page, on teste...
				foreach($pages as $page) {
					if($page->ID == $item->object_id) {
						if(!empty($page->post_content)) {
							$items_non_vides[] = $item;
							break;
						}
					}
				}				
			} else { // Sinon, il s'agit d'un autre type à conserver (post-format, custom...)
				$items_non_vides[] = $item;
			}
		}
		
		// Retourne le menu avec les catégories non vides uniquement
		return $items_non_vides;
	} else {
		// Retourne le menu d'origine dans le backoffice
		return $menu_items;
	}
}
add_filter('wp_get_nav_menu_items', 'exclure_cat_pages_menu_vides', null, 3);

Pour aller plus loin, sachez qu'il serait possible d'appliquer le même type de fonctionnalité pour presque tous les contenus existants, tels que des items de portfolio, des liens personnalisés, des post-formats, etc. Nous pourrions aussi choisir quel menu cibler pour que la fonction ne s'applique pas à tous les menus (grâce aux données contenues dans $menu_items).

Il est également possible d'exclure des IDs de pages, des catégories (...) grâce aux arguments des fonctions get_categories() et get_pages(). Ici, un seul paramètre est utilisé, mais il y en a plein d'autres dans le codex de WordPress.

Le résultat en images...

J'ai utilisé cette fonction sur ce blog, donc je peux vous montrer mon menu d'il y a quelques semaines, il ne contenait pas encore l'onglet "Brèves" côté utilisateur. J'ai ajouté le bloc d'instructions if(is_admin()) { ... } dans la fonction pour que le menu complet apparaisse dans le backoffice. Ainsi, vous pourrez voir la différence entre le menu affiché et celui réellement créé dans l'interface d'administration...

Menu avec suppression des catégories vides et pages vides sur WordPress

Menu complet dans l'admin WordPress avec suppression des pages et catégories vides

Cette fonction se révèle très pratique et évite d'omettre des items de menu au fur et à mesure... Vous pouvez également la supprimer (ou la commenter) une fois que votre menu complet apparaît dans votre site web ou votre blog, cela améliora vos performances (en évitant des calculs inutiles).

Sachez que l'idée d'origine n'est pas de moi, mais d'un client qui ressentait ce besoin, j'ai donc programmé cette fonction dans le but de répondre à sa demande. J'avoue qu'elle s'avère plus pratique que je ne l'aurais imaginé.