WordPress – comment afficher des liens vers des pages « privées » dans wp_nav_menu ?

Publié par Jean-Michel le

Dans mon site WordPress, j’ai l’obligation d’afficher privateles liens dans la navigation principale (via wp_nav_menu) même si l’utilisateur n’est pas connecté (j’ai juste besoin d’afficher le lien, pas de changer qui peut voir le contenu réel).

Je peux le faire ailleurs, en wp_list_pages andspécifiant le ou les post_status que je veux afficher, mais je ne vois pas comment appliquer cela à wp_nav_menu.

Cela marche:

wp_list_pages(array(
    'title_li'      => '',
    'child_of'      => $page->ID,
    'post_status'   => 'published,private'
));

Existe-t-il un moyen de faire quelque chose de similaire avec cela?

wp_nav_menu(array(
    'menu'              => 'primary',
    'theme_location'    => 'primary',
    'container'         => FALSE,
    'walker'            => new MegaMenuWalker
    'depth'             => 2));

Mes recherches jusqu’à présent montrent un tas de façons de post-traiter les résultats pour filtrer les pages privées (ou brouillons) à l’aide du wp_get_nav_menu_itemscrochet, mais je n’ai pas encore trouvé quelque chose pour faire l’inverse.

Lire également:  Wordpress : Comment créer une traduction spécifique à un thème de buddypress ?

Je suppose que je pourrais faire une requête personnalisée pour saisir des éléments de cette façon, mais cela ne me permettrait pas d’utiliser mon déambulateur personnalisé.

De manière alléchante, il y a wp_get_nav_menu_items( $menu, $args )ce qui me permet de spécifier l’argument post_status, mais je dois appliquer mon propre rendu plutôt que de pouvoir utiliser le marcheur … à moins qu’il n’y ait un moyen d’utiliser le marcheur en dehors du contexte de wp_nav_menu?

Solution n°1 trouvée

À partir de la réponse acceptée, les pages privées n’apparaissent pas dans le générateur de menus par défaut. Voici un moyen de contourner ce problème.

Solution n°2 trouvée

Voici un court extrait pour afficher les pages privées dans le constructeur de menu :

add_filter( 'nav_menu_meta_box_object', 'show_private_pages_menu_selection' );
/**
* Add query argument for selecting pages to add to a menu
*/
function show_private_pages_menu_selection( $args ){
    if( $args->name == 'page' ) {
        $args->_default_query['post_status'] = array('publish','private');
    }
    return $args;
}

Ajoutez ceci à un plugin personnalisé ou à votre thème functions.php, et vous pourrez ajouter une page privée dans n’importe quel menu.

Lire également:  Wordpress : Comment coder une page spéciale personnalisée

Solution n°3 trouvée

La wp_nav_menufonction parcourt uniquement les liens dans le menu souhaité et ne les récupère pas. Comme on peut le voir dans le code source ( line 270), la fonction qui récupère les liens n’obtient que le nom/id/etc. du menu et pas d’autres arguments.

Du manuel :

Affiche un menu de navigation créé dans le panneau Apparence ? Menus.

Étant donné un paramètre theme_location, la fonction affiche le menu affecté à cet emplacement. Si un tel emplacement n’existe pas ou qu’aucun menu ne lui est assigné, le paramètre fallback_cb déterminera ce qui est affiché.

S’il n’est pas donné de paramètre theme_location, la fonction affiche

  • le menu correspondant à l’ID, au slug ou au nom donné par le paramètre de menu ;
  • sinon, le premier menu non vide ; sinon (ou si le menu donné par menu est vide), sortie de la fonction donnée par le paramètre fallback_cb (wp_page_menu(), par défaut) ;
  • sinon rien.

Par conséquent, vous devez ajouter ces pages privées au menu à l’aide du panneau d’administration WP ou créer votre propre fonction qui récupère les pages et crée un menu (veuillez noter : pas un nav_walkercar il utilise simplement les données et ne les récupère pas ).

Catégories : Wordpress

Jean-Michel

Jean-Michel est en charge de la partie blog du site. Il met en place la stratégie de contenu et répond aux questions fréquentes sur Wordpress.

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *