Question

Dans le cadre d'un thème pour un client, Je veux être en mesure de montrer un menu personnalisé (défini par l'administrateur) dans une zone de sélection qui change automatiquement les pages après modification de la sélection .

Y at-il un plugin (ou un extrait de code à portée de main) qui accomplira cela?

Était-ce utile?

La solution

nouveau système de menu de WordPress est à la fois merveilleux et infiniment frustrant , en fonction de ce que vous essayez de faire et quel jour de la semaine, il se trouve être. :) C'est une excellente idée, mais loin d'être mature si bien qu'il est une fonctionnalité que j'applaudis je serai plus heureux quand v3.3 ou v3.4 de WordPress DéRoule et nous obtenons beaucoup plus de cas d'utilisation directement pris en charge par l'API du système de menu .

Cela dit, pas sûr s'il y a un plugin existant pour faire ce que vous cherchez, mais Que diriez-vous du code dont vous avez besoin de vous écrire propre plugin? Ou vous pouvez simplement l'inclure dans votre Le thème de fichier functions.php; quelle que soit votre préférence.

Ce que je veux fournir un exemple entièrement autonome que vous pouvez enregistrer en tant que test.phpin le répertoire racine de votre site Web afin de le tester. Si votre domaine était example.com vous souhaitez charger de tester à:

  

http://example.com/test.php

Voici ce que l'air est comme dans l'action:


(source: mikeschinkel.com )
down drop active de pages de menu WordPress 3.0
(source: mikeschinkel.com )

À partir du code ci-dessous, il devrait être facile d'intégrer la fonction get_page_selector() dans 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);
}

Alors, vous pourriez vous demander comment cela fonctionne?

La fonction wp_get_nav_menu_items()

magasins WordPress 3.0 Menus dans le tableau de wp_posts comme type de post_type de nav_menu_item. Le wp_get_nav_menu_items() indirectement appelle simplement la fonction get_posts(). Le premier paramètre à wp_get_nav_menu_items() est: 1.) un nom de menu (qui est ce que je: « Mon Sélectionnez Menu » ), 2.) un ID d'élément de menu (c.-à-ID après la base de données de l'élément de menu ) ou 3.) une limace de menu (la limace de mandat de taxonomie du menu;. oui menus sont mis en œuvre en utilisant des termes de taxonomie avec une taxonomie des 'nav_menu')


(source: mikeschinkel.com )

Au-delà du premier paramètre vers l'avant sur get_posts() la plupart (sinon tous?) Du $args vous passez à wp_get_nav_menu_items() ainsi vous pouvez le traiter comme un type de poste personnalisé (même si à long terme lorsqu'ils améliorent l'API de menu qui probablement gagné « t être une bonne idée. Mais aujourd'hui? faire du foin tandis que le soleil brille!)

Articles de menu Filtrage avec meta_key et meta_value

utilisation sous-jacente de WordPress de messages pour les éléments de menu est la raison pour laquelle nous pouvons interroger pour meta_key et meta_value; WordPress utilise une série de meta_keys préfixé par _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 WordPress "Page" de type poste. (Si vous voulez inclure des éléments en plus de pages que vous vous aurez besoin de faire un peu plus de recherche que moi ici, mais au moins je vous ai donné les outils dont vous avez besoin pour faire la recherche vous-même.)

Voici une capture d'écran en utilisant Navicat for MySQL d'une requête montrant les enregistrements méta pour plusieurs nav_menu_items:


(source: mikeschinkel.com )

Saisissant URL la page avec get_post_link()

Ensuite, je vais souligner que l'obtenir URL de la page de la fonction get_post_link() et que je suis la mise en <option> de value HTML à l'URL ...

<?php
    $link = get_page_link($page_menu_item->object_id);
    $selector[] =<<<HTML
<option value="{$link}">{$page_menu_item->title}</option>
HTML;

Utilisation de onchange de Javascript pour naviguer à notre page sélectionnée

... Alors que je peux saisir de la propriété value de l'élément 'page-selector' de <select> et l'affecter à location.href. location.href Attribution provoque le navigateur pour naviguer immédiatement vers la nouvelle URL, et que, en un mot, est de savoir comment tout cela se fait:

<?php
  $selector[] =<<<HTML
<select id="page-selector" name="page-selector"
    onchange="location.href = document.getElementById('page-selector').value;">
HTML;

Un value="" vide comme l'option par défaut

Vous pouvez noter que le "Sélectionner une page" par défaut a une valeur vide; ce n'est pas une erreur, mais plutôt par la conception. Quand il est sélectionné et le "onchange" est déclenché 1 réglage location.href à une chaîne vide n'a pas d'effet, ce qui est exactement ce que nous voulons et ne nous oblige pas à écrire un code d'exception. Viola!

<?php
    $selector[] = '<option value="">Select a Page</option>';
  1. Une fois la sélection de « Sélectionner une page » déclencheur "onchange" ne peut se produire sur une navigation arrière du navigateur vers une page qui ne déclenche pas un rechargement de la page où une autre option avait déjà été sélectionné, mais il peut encore se produire si nous devons y remédier.
Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top