it-swarm-ru.tech

Показать WP 3.0 Пользовательское меню в HTML Выберите с помощью автонавигации?

Как часть темы для клиента, я хочу иметь возможность показывать пользовательское меню (определено через администратора) в окне выбора, которое автоматически меняет страницы после изменения выбора .

Есть ли плагин (или удобный фрагмент кода), который сделает это?

3
Keith S.

Новая система меню WordPress удивительна и бесконечно разочаровывает, в зависимости от того, что вы пытаетесь сделать, и какой это день недели. :) Это отличная идея, но далеко не зрелая, поэтому, хотя я приветствую эту функцию, я буду счастливее, когда выйдет WordPress v3.3 или v3.4, и мы получим гораздо больше вариантов использования, непосредственно поддерживаемых API системы меню. ,.

Тем не менее, вы не уверены, существует ли существующий плагин для того, что вы ищете, нокак насчет кода, который вам нужен, чтобы написать собственный плагин?Или вы можете просто включить его в свою тему Файл functions.php; независимо от ваших предпочтений.

То, что я предоставляю, является полностью автономным примером, который вы можете сохранить как test.php в корневом каталоге вашего сайта, чтобы протестировать его. Если бы ваш домен был example.com, вы бы загрузили его для тестирования по адресу:

http://example.com/test.php

Вот как это выглядит в действии:

 Inactive drop down of Pages from WordPress 3.0 Menu 
(источник: mikeschinkel.com )
 Active drop down of Pages from WordPress 3.0 Menu 
(источник: mikeschinkel.com )

Из приведенного ниже кода должно быть легко включить функцию get_page_selector() в вашу тему и вызывать ее всякий раз, когда вам понадобится эта функциональность:

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

Так что вы можете спросить, как это работает?

Функция wp_get_nav_menu_items()

WordPress 3.0 сохраняет свои меню в таблице wp_posts как post_type типа nav_menu_item. wp_get_nav_menu_items() косвенно просто вызывает функцию get_posts(). Первый параметр wp_get_nav_menu_items() - это либо 1.) имя меню (которое я и использовал: "Мое меню выбора"), 2.) идентификатор пункта меню (т. Е. Пост пункта меню ID база данных) или 3.) фрагмент меню (фрагмент из термина таксономии меню; да, меню реализуются с использованием терминов таксономии с таксономией 'nav_menu'.)

 Menu Configuration in WordPress 3.0 
(источник: mikeschinkel.com )

Помимо первого параметра, он пересылает get_posts() большинству (если не всем?) $args, который вы передаете wp_get_nav_menu_items(), таким образом, вы можете рассматривать его как пользовательский тип записи (даже в более долгосрочном плане, когда они улучшают API меню, что, вероятно, не будет такая прекрасная идея. Но сегодня? Сделать сено, пока светит Солнце!)

Фильтрация элементов меню с помощью meta_key и meta_value

Основное использование WordPress постов для пунктов меню - это то, почему мы можем запрашивать meta_key и meta_value; WordPress использует серию meta_keys с префиксом _menu_item для дополнительной информации, необходимой для каждого пункта меню. _menu_item_object будет содержать page для каждого пункта меню, который соответствует типу записи WordPress "Page". (Если вы хотите включить элементы помимо страниц, вам нужно провести немного больше исследований, чем я здесь, но, по крайней мере, я дал вам инструменты, необходимые для проведения исследования самостоятельно.)

Вот снимок экрана с использованием Navicat для MySQL запроса, показывающего мета записи для нескольких nav_menu_items:

 Menu Item Configuration found in wp_postmeta with WordPress 3.0 
(источник: mikeschinkel.com )

Захват URL страницы с помощью get_post_link()

Далее я укажу, что получить URL-адрес страницы от функции get_post_link() и что я устанавливаю HTML <option>'s value в качестве URL-адреса ...

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

Использование Javascript onchange для перехода на нашу выбранную страницу

... чтобы я мог получить его из свойства value элемента 'page-selector'<select> и назначить его для location.href. Назначение location.href заставляет браузер немедленно перейти к новому URL, и вот, в двух словах, как это все делается:

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

Пустой value="" как опция по умолчанию

Вы можете заметить, что параметр по умолчанию "Выберите страницу" имеет пустое значение; это не ошибка, но вместо этого по замыслу. Когда он выбран и "onchange" запущен1 установка location.href в пустую строку не будет иметь никакого эффекта, а это именно то, что мы хотим, и это не требует от нас написания кода исключения. Альт!

<?php
    $selector[] = '<option value="">Select a Page</option>';
  1. Выбор "Выбрать страницу" триггер "onchange" может произойти только при обратной навигации браузера к странице, которая не вызывает перезагрузку страницы, где ранее был выбран другой параметр, но все же может произойти, поэтому мы должен решить это.
8
MikeSchinkel