В рамках темы для клиента я хочу иметь возможность отображать пользовательское меню (определяемое через администратора) в поле выбора, которое автоматически меняет страницы после изменения выбора.
Есть ли плагин (или удобный фрагмент кода), который это сделает?
Новая система меню WordPress одновременно удивительна и бесконечно разочаровывает, в зависимости от того, что вы пытаетесь сделать и в какой день недели это происходит. 🙂 Это отличная идея, но далека от зрелости, поэтому, хотя я приветствую эту функцию, я буду счастливее, когда выйдет v3.3 или v3.4 WordPress, и мы получим гораздо больше вариантов использования, напрямую поддерживаемых API системы меню..
Тем не менее, не уверен, что существует существующий плагин для того, что вы ищете, но как насчет кода, необходимого для написания собственного плагина? Или вы можете просто включить его в
functions.php
файл вашей темы; независимо от ваших предпочтений.Я предоставляю полностью автономный пример, который вы можете сохранить как
test.php
в корневом каталоге вашего веб-сайта, чтобы протестировать его. Если бы ваш домен былexample.com
таким, вы бы загрузили его для тестирования по адресу:Вот как это выглядит в действии:
(источник: mikeschinkel.com ) (источник: mikeschinkel.com )
Из приведенного ниже кода должно быть легко включить
get_page_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. (Если вы хотите включить элементы помимо страниц, вам нужно будет провести немного больше исследований, чем я сделал здесь, но, по крайней мере, я дал вам инструменты, необходимые для самостоятельного исследования.)Вот снимок экрана с использованием Navicat для MySQL запроса, показывающего метазаписи для нескольких
nav_menu_items
:(источник: mikeschinkel.com )
Получение URL-адреса страницы с помощью
get_post_link()
Далее я укажу, что получаю URL-адрес страницы из
get_post_link()
функции и что я устанавливаю HTML<option>
какvalue
URL-адрес…Использование Javascript
onchange
для перехода на нашу выбранную страницу… Чтобы я мог взять его из
value
свойства'page-selector'
<select>
элемента и присвоитьlocation.href
. Присвоениеlocation.href
заставляет браузер немедленно перейти к новому URL-адресу, и вот как все это делается:Пусто
value=""
как опция по умолчаниюВы могли заметить, что параметр по умолчанию «Выбрать страницу» имеет пустое значение; это не ошибка, а по замыслу. Когда он выбран и
"onchange"
срабатывает установка 1location.href
для пустой строки, это не будет иметь никакого эффекта, а это именно то, что нам нужно, и нам не нужно писать код исключения. Виола!"onchange"
может произойти только при обратной навигации браузера на страницу, которая не вызывает перезагрузку страницы, где ранее был выбран другой параметр, но это все еще может произойти, поэтому мы должны решить эту проблему.Святое дерьмо! 🙂 Спасибо за урок, Майк. Думаю, в моем случае это сработает. На данный момент я не знаю, можно ли обернуть его в плагин, но кто знает… он может просто оказаться там. Если это так, вы, конечно, получите признание… 🙂 Спасибо и за редактирование заголовка… Я был немного измотан, когда писал его, поэтому я не совсем ясно думал… 🙂
Хммм… видимо, здесь что-то не так… когда я добавляю функцию в свой файл functions.php, я получаю следующее: Ошибка синтаксического анализа: синтаксическая ошибка, неожиданное ‘]’, ожидание T_STRING или T_VARIABLE или T_NUM_STRING в /media /storage/swd/wp-content/themes/theme2/functions.php в строке 55 строка 55 — это строка $selector[] в foreach…
@Keith S.: У вас уже есть какие-либо пункты меню для страниц, определенных на вашем сайте? Мой код не защитил от отсутствия элементов меню для страниц (но я только что обновил код, чтобы решить эту проблему). Убедились ли вы, что использовали правильное название меню с вашего сайта? Вы удостоверились, что
HTML;
строки НЕ СДЕЛАНЫ? , т.е. что они выравниваются по левому краю без пробелов слева отHTML
? Есть вероятность, что ваш сайт работает на PHP4? (Я не знаю, будет ли это иметь значение, но может быть.) Если у вас возникла ошибка вырезания и вставки, вот код, откуда вам будет проще его скопировать. gist.github.com/550217У меня были настроены пункты меню, я пробовал всевозможные отступы, но, в конце концов, я бы сделал это (что отлично работает… и для протокола, я запускаю php 5.3 на своем сервере разработки)… пасти.textmate.org/private/haynxduumjwxn8jdjtktq
@Keith S. — Похоже, вы только что сбросили фильтр на post_type == ‘page’, который не требовался, по иронии судьбы, я сделал это, чтобы упростить ситуацию. Но так как это работает для вас без, дерзайте!