web-dev-qa-db-fra.com

Utiliser des codes courts dans les menus WP dans WP 3.1 (via nav_menu_objects)?

J'ai trouvé ce nouveau plugin

http://wpsmith.net/wordpress/creating-multiple-custom-menus-in-wordpress-3-1

qui utilise un nouveau hook 3.1 (wp_nav_menu_objects) pour supprimer des éléments de menu de navigation spécifiques du tableau d’éléments de menu de navigation avant leur analyse par la classe de randonneur, si un utilisateur n’est pas connecté. Le plugin utilise un code CSS spécifique. -class en tant qu'identifiant pour décider des éléments à supprimer.

Je me suis donc demandé s'il ne serait pas possible d'utiliser des codes abrégés dans les descriptions des éléments de menu-navigation, afin de disposer d'un ensemble avancé de conditions conditionnelles relatives à l'affichage d'éléments de menu spécifiques (comme l'affichage à la page x, don ne s'affiche pas sur la page y, ni particulièrement utile: l'inclusion automatique de pages/catégories enfants, etc. en les insérant dans le tableau nav_menu_item avant que le tableau ne soit analysé par le marcheur)

Mais en ajoutant

add_filter(‘wp_nav_menu_objects’, ‘do_shortcode’);

provoque le chargement incorrect de la page. Pas une erreur de page vierge, mais la page cesse de s'afficher juste après le menu de navigation contenant div. Existe-t-il un moyen d'utiliser la fonctionnalité shortcode native WP à cette fin? Ou serait-il nécessaire de créer un analyseur shortcode personnalisé dans la fonction analysant le contenu de l'élément de navigation?

Merci pour toutes les idées!

2
youngmicroserf

Le problème est que do_shortcode() attend une chaîne dans ses premiers paramètres alors que wp_nav_menu_objects est passé avec un tableau d'objets de menu.

Si vous deviez écrire votre propre fonction wrapper dans do_shortcode, quelque chose comme ça ...

function my_nav_menu_objects_shortcode_mangler($items) {
    foreach ($items as $item) {
        $item->classes = explode(' ', do_shortcode(implode(' ', (array)$item->classes)));
    }
    return $items;
}

peut travailler. Vous devez connaître la structure des objets du menu de navigation ($ item) en regardant la source dans wp-includes/nav-menu-template.php, puis en déduire les propriétés qu'il est préférable de modifier et comment (quel format ont-elles, comment les convertir en chaîne afin vous pouvez exécuter un shortcode dessus, etc.).

Il me semble cependant que d'autres moyens de mettre en œuvre une telle logique pourraient être meilleurs que de pirater la fonctionnalité de shortcode dans celle-ci.

Notez également qu'en utilisant ce modèle, vous ne pouvez pas avoir un shortcode dans une propriété de votre élément de menu et vous attendez à ce qu'il modifie la sortie d'un autre ... comme vous ne pouvez pas avoir de shortcode dans le libellé de votre élément de menu et espérez qu'il ajoute ou supprime css Des classes. Ça ne marche pas comme ça.

1
wyrfel

Qu'advient-il si vous modifiez la priorité à, par exemple, 11?

add_filter(‘wp_nav_menu_objects’, ‘do_shortcode’, 11);

Voici comment le filtre est ajouté au contenu dans shortcodes.php. Voir: http://codex.wordpress.org/Function_Reference/do_shortcode

0
aendrew