Как часть темы для клиента, я хочу иметь возможность показывать пользовательское меню (определено через администратора) в окне выбора, которое автоматически меняет страницы после изменения выбора .
Есть ли плагин (или удобный фрагмент кода), который сделает это?
Новая система меню WordPress удивительна и бесконечно разочаровывает, в зависимости от того, что вы пытаетесь сделать, и какой это день недели. :) Это отличная идея, но далеко не зрелая, поэтому, хотя я приветствую эту функцию, я буду счастливее, когда выйдет WordPress v3.3 или v3.4, и мы получим гораздо больше вариантов использования, непосредственно поддерживаемых API системы меню. ,.
Тем не менее, вы не уверены, существует ли существующий плагин для того, что вы ищете, нокак насчет кода, который вам нужен, чтобы написать собственный плагин?Или вы можете просто включить его в свою тему Файл functions.php
; независимо от ваших предпочтений.
То, что я предоставляю, является полностью автономным примером, который вы можете сохранить как test.php
в корневом каталоге вашего сайта, чтобы протестировать его. Если бы ваш домен был example.com
, вы бы загрузили его для тестирования по адресу:
http://example.com/test.php
Вот как это выглядит в действии:
(источник: mikeschinkel.com )
(источник: 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'
.)
(источник: 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
:
(источник: mikeschinkel.com )
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;
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>';
"onchange"
может произойти только при обратной навигации браузера к странице, которая не вызывает перезагрузку страницы, где ранее был выбран другой параметр, но все же может произойти, поэтому мы должен решить это.