Pregunta

Como parte de un tema para un cliente, Quiero ser capaz de mostrar un menú personalizado (que se define a través de la administración) en un cuadro de selección que cambia automáticamente las páginas después de cambiar la selección .

¿Hay un plugin (o un fragmento de código práctico) que lograr esto?

¿Fue útil?

Solución

nuevo sistema de menú de WordPress es a la vez maravilloso e infinitamente frustrante , dependiendo de lo que está tratando de hacer y qué día de la semana que pasa a ser. :) Es una gran idea, pero lejos de madurar lo que si bien es una característica Aplaudo estaré más feliz cuando v3.3 o v3.4 de WordPress lanza y tenemos muchos más casos de uso soportados directamente por la API del sistema de menús .

Dicho esto, no estoy seguro si hay una ya existente plugin para hacer lo que está buscando, pero ¿qué tal el código que necesita para escribir propio plugin? o usted podría incluir en su El tema de archivo functions.php; Sea cual sea su preferencia.

Lo que estoy proporcionando es un ejemplo totalmente autónomo que se puede guardar como test.phpin el directorio raíz de su sitio web con el fin de probarlo. Si su dominio eran example.com que le cargue a prueba en:

http://example.com/test.php

Esto es lo que se vea como en la acción de:

Inactivo caída hacia abajo de páginas de WordPress 3.0 Menú
(fuente: mikeschinkel.com )
abajo gota activo de páginas de WordPress 3.0 Menú
(fuente: mikeschinkel.com )

Desde el código de abajo debe ser fácil de incorporar la función get_page_selector() en su tema y llamarlo siempre necesita esta funcionalidad:

<?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);
}

Así que usted podría preguntarse cómo funciona?

La función wp_get_nav_menu_items()

WordPress 3.0 almacena de menús en la mesa wp_posts tipo post_type de nav_menu_item. El wp_get_nav_menu_items() indirectamente, sólo llama a la función get_posts(). El primer parámetro a wp_get_nav_menu_items() puede estar: 1.) un nombre de menú (que es lo que solía: "Mi seleccionar el menú" ), 2.) un identificador de elemento de menú (es decir ID posterior del elemento de menú la base de datos ) o 3.) una babosa menú (la babosa de término de taxonomía del menú; Sí. menús se implementan utilizando términos de la taxonomía con una taxonomía de 'nav_menu')

Configuración de menús en WordPress 3.0
(fuente: mikeschinkel.com )

Más allá del primer parámetro se remite a get_posts() la mayoría (si no todos?) De la $args se pasa a wp_get_nav_menu_items() por lo tanto se puede tratar como un tipo de mensaje personalizado (a pesar de que a largo plazo cuando mejoran la API de menú que probablemente ganó 't ser una gran idea. Pero hoy en día? heno Make mientras brilla el sol!)

Filtrado de elementos de menú con meta_key y meta_value

El uso subyacente WordPress' de los puestos de los elementos del menú es por eso que podemos consultar para meta_key y meta_value; WordPress utiliza una serie de meta_keys con el prefijo _menu_item por la información adicional que necesita para cada elemento del menú. _menu_item_object contendrá page para cada elemento de menú que corresponde a un WordPress "Página" tipo de puesto. (Si desea incluir elementos, además de las páginas que visites tendrá que hacer un poco más investigación que hice aquí, pero al menos he dado las herramientas que necesita para hacer la investigación usted mismo.)

Aquí hay una captura de pantalla con Navicat for MySQL de una consulta que muestra los registros de metadatos para varios nav_menu_items:

Elemento de menú Configuración encuentra en wp_postmeta con WordPress 3.0
(fuente: mikeschinkel.com )

Agarrando de la URL de la página con get_post_link()

A continuación voy a señalar que obtener la URL de la página de la función get_post_link() y que estoy estableciendo <option> del value HTML para la URL ...

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

Uso de onchange JavaScript para navegar a nuestra página seleccionada

... De modo que pueda agarrarlo de la propiedad value del elemento 'page-selector' <select> y asignarlo a location.href. Asignación location.href hace que el navegador navegar inmediatamente a la nueva URL, y que, en pocas palabras, es cómo se hace todo:

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

Una value="" vacío como la opción por defecto

Se puede observar que el "Seleccionar una página" opción por defecto tiene un valor vacío; eso no es un error, pero no por el diseño. Cuando se selecciona y se activa el "onchange" 1 location.href establecer una cadena vacía no tendrá ningún efecto, que es exactamente lo que queremos y no nos obliga a escribir un código de excepción. Viola!

<?php
    $selector[] = '<option value="">Select a Page</option>';
  1. Tener selección de "Seleccionar una página" "onchange" gatillo sólo puede suceder en una navegación de regreso navegador a una página que no desencadenar una recarga de la página, donde previamente había sido seleccionada otra opción, pero puede todavía pasará por lo que debemos abordarlo.
Licenciado bajo: CC-BY-SA con atribución
scroll top