keiths
  • 0
Учитель

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

  • 0

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

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

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

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

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

    http://example.com/test.php

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

    Неактивное выпадающее меню страниц из меню WordPress 3.0
    (источник: mikeschinkel.com ) (источник: mikeschinkel.com )
    Активное выпадающее меню страниц из меню WordPress 3.0

    Из приведенного ниже кода должно быть легко включить 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' .)

    Конфигурация меню в 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. (Если вы хотите включить элементы помимо страниц, вам нужно будет провести немного больше исследований, чем я сделал здесь, но, по крайней мере, я дал вам инструменты, необходимые для самостоятельного исследования.)

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

    Конфигурация пункта меню найдена в wp_postmeta с WordPress 3.0
    (источник: mikeschinkel.com )

    Получение URL-адреса страницы с помощьюget_post_link()

    Далее я укажу, что получаю URL-адрес страницы из get_post_link() функции и что я устанавливаю HTML <option> как 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" срабатывает установка 1location.href для пустой строки, это не будет иметь никакого эффекта, а это именно то, что нам нужно, и нам не нужно писать код исключения. Виола!

    <?php
        $selector[] = '<option value="">Select a Page</option>';
    
    1. Выбор триггера «Выбрать страницу»"onchange" может произойти только при обратной навигации браузера на страницу, которая не вызывает перезагрузку страницы, где ранее был выбран другой параметр, но это все еще может произойти, поэтому мы должны решить эту проблему.
    • 0
    • Святое дерьмо! 🙂 Спасибо за урок, Майк. Думаю, в моем случае это сработает. На данный момент я не знаю, можно ли обернуть его в плагин, но кто знает… он может просто оказаться там. Если это так, вы, конечно, получите признание… 🙂 Спасибо и за редактирование заголовка… Я был немного измотан, когда писал его, поэтому я не совсем ясно думал… 🙂

      • 0
    • Хммм… видимо, здесь что-то не так… когда я добавляю функцию в свой файл functions.php, я получаю следующее: Ошибка синтаксического анализа: синтаксическая ошибка, неожиданное ‘]’, ожидание T_STRING или T_VARIABLE или T_NUM_STRING в /media /storage/swd/wp-content/themes/theme2/functions.php в строке 55 строка 55 — это строка $selector[] в foreach…

      • 0
    • @Keith S.: У вас уже есть какие-либо пункты меню для страниц, определенных на вашем сайте? Мой код не защитил от отсутствия элементов меню для страниц (но я только что обновил код, чтобы решить эту проблему). Убедились ли вы, что использовали правильное название меню с вашего сайта? Вы удостоверились, что HTML; строки НЕ СДЕЛАНЫ? , т.е. что они выравниваются по левому краю без пробелов слева от HTML ? Есть вероятность, что ваш сайт работает на PHP4? (Я не знаю, будет ли это иметь значение, но может быть.) Если у вас возникла ошибка вырезания и вставки, вот код, откуда вам будет проще его скопировать. gist.github.com/550217

      • 0
    • У меня были настроены пункты меню, я пробовал всевозможные отступы, но, в конце концов, я бы сделал это (что отлично работает… и для протокола, я запускаю php 5.3 на своем сервере разработки)… пасти.textmate.org/private/haynxduumjwxn8jdjtktq

      • 0
    • @Keith S. — Похоже, вы только что сбросили фильтр на post_type == ‘page’, который не требовался, по иронии судьбы, я сделал это, чтобы упростить ситуацию. Но так как это работает для вас без, дерзайте!

      • 0

Оставить ответ

You must login to add an answer.