Dans le cadre d'un thème pour un client, je souhaite pouvoir afficher un menu personnalisé (défini via l'administrateur) dans une zone de sélection qui change automatiquement de page après le changement de sélection .
Existe-t-il un plugin (ou un extrait de code pratique) qui y parviendra?
Le nouveau système de menus deWordPress est à la fois merveilleux et infiniment frustrant, selon ce que vous essayez de faire et le jour de la semaine. :) C'est une bonne idée, mais loin d'être mature, c'est une fonctionnalité que j'applaudis, mais je serai plus heureux lorsque la v3.3 ou v3.4 de WordPress sortira et que nous aurons beaucoup plus de cas d'utilisation directement pris en charge par l'API du système de menus. .
Cela dit, je ne sais pas s’il existe déjà un plugin pour faire ce que vous cherchez, maiset le code dont vous avez besoin pour écrire votre propre plugin?Ou vous pourriez simplement l’inclure dans votre thème functions.php
fichier; quelle que soit votre préférence.
Ce que je fournis est un exemple entièrement autonome que vous pouvez enregistrer en tant que test.php
dans le répertoire racine de votre site Web afin de le tester. Si votre domaine était example.com
, vous chargeriez de tester à:
http://example.com/test.php
Voici à quoi ça ressemble en action:
(source: mikeschinkel.com )
(source: mikeschinkel.com )
À partir du code ci-dessous, il devrait être facile d’incorporer la fonction get_page_selector()
à votre thème et de l’appeler chaque fois que vous avez besoin de cette fonctionnalité:
<?php
include "wp-load.php";
echo 'Jump to:';
echo get_page_selector('My Select Menu');
function get_page_selector($menu) {
$page_menu_items = wp_get_nav_menu_items($menu,array(
'meta_key'=>'_menu_item_object',
'meta_value'=>'page',
));
$selector = array();
if (is_array($page_menu_items) && count($page_menu_items)>0) {
$selector[] =<<<HTML
<select id="page-selector" name="page-selector"
onchange="location.href = document.getElementById('page-selector').value;">
HTML;
$selector[] = '<option value="">Select a Page</option>';
foreach($page_menu_items as $page_menu_item) {
$link = get_page_link($page_menu_item->object_id);
$selector[] =<<<HTML
<option value="{$link}">{$page_menu_item->title}</option>
HTML;
}
$selector[] = '</select>';
}
return implode("\n",$selector);
}
Vous vous demandez peut-être comment cela fonctionne?
wp_get_nav_menu_items()
WordPress 3.0 stocke ses menus dans la table wp_posts
sous le type post_type
de nav_menu_item
. La wp_get_nav_menu_items()
appelle indirectement la fonction get_posts()
. Le premier paramètre de wp_get_nav_menu_items()
est soit 1.) un nom de menu (ce que j’ai utilisé: "Mon menu de sélection" ), 2.) un ID d’élément de menu (c.-à-d. Le post de cet élément de menu ID
de la base de données). ou 3.) un slug de menu (le slug du terme de taxonomie du menu; oui, les menus sont mis en œuvre en utilisant des termes de taxonomie avec une taxonomie de 'nav_menu'
.)
(source: mikeschinkel.com )
Au-delà du premier paramètre, il est transmis à get_posts()
à la plupart (si ce n’est à tous?) Du $args
que vous passez à wp_get_nav_menu_items()
. Vous pouvez donc le traiter comme un type de publication personnalisé (même s’il est plus long terme quand ils améliorent l’API de menu qui ne sera probablement pas Une bonne idée, mais aujourd'hui, faites du foin pendant que le soleil brille!)
meta_key
et meta_value
L'utilisation sous-jacente de posts pour les éléments de menu par WordPress explique pourquoi nous pouvons interroger meta_key
et meta_value
; WordPress utilise une série de meta_keys
avec le préfixe _menu_item
pour les informations supplémentaires dont il a besoin pour chaque élément de menu. _menu_item_object
contiendra page
pour chaque élément de menu qui correspond à un type WordPress "Page" post. (Si vous souhaitez inclure des éléments autres que Pages, vous devrez faire un peu plus de recherches que ce que j'ai fait ici, mais au moins je vous ai donné les outils nécessaires pour faire la recherche vous-même.)
Voici une capture d'écran utilisant Navicat for MySQL d'une requête montrant les méta-enregistrements de plusieurs nav_menu_items
:
(source: mikeschinkel.com )
get_post_link()
Ensuite, je ferai remarquer que l'URL de la page est obtenue à partir de la fonction get_post_link()
et que je règle le value
du HTML <option>
sur ...
<?php
$link = get_page_link($page_menu_item->object_id);
$selector[] =<<<HTML
<option value="{$link}">{$page_menu_item->title}</option>
HTML;
onchange
de Javascript pour accéder à la page sélectionnée... afin que je puisse le récupérer dans la propriété value
de l'élément 'page-selector'
<select>
et l'attribuer à location.href
. L'affectation de location.href
force le navigateur à accéder immédiatement à la nouvelle URL, et voici comment cela se passe:
<?php
$selector[] =<<<HTML
<select id="page-selector" name="page-selector"
onchange="location.href = document.getElementById('page-selector').value;">
HTML;
value=""
vide comme option par défautVous remarquerez peut-être que l'option "Sélectionner une page" default a une valeur vide; ce n'est pas une erreur mais à la place, par conception. Quand il est sélectionné et que le "onchange"
est déclenché1 définir location.href
sur une chaîne vide n'aura aucun effet, c'est exactement ce que nous voulons et cela ne nous oblige pas à écrire un code d'exception. Viola!
<?php
$selector[] = '<option value="">Select a Page</option>';
"onchange"
ne peut se produire que dans le navigateur, lorsque vous naviguez dans une page qui ne déclenche pas le rechargement de la page lorsqu'une autre option avait été sélectionnée, mais cela peut quand même arriver. devrait y répondre.