youngmicroserf
  • 0
Новичок

Использование шорткодов в WP-меню в WP 3.1 (через nav_menu_objects)?

  • 0

Я нашел этот новый плагин

http://wpsmith.net/wordpress/creating-multiple-custom-menus-in-wordpress-3-1

который использует новый хук 3.1 (wp_nav_menu_objects) для удаления определенных элементов nav-menu-item из массива nav-menu-item до того, как они будут проанализированы классом Walker, если пользователь не вошел в систему. Плагин использует определенный CSS -class как идентификатор, чтобы решить, какие элементы удалить.

Поэтому мне было интересно, нельзя ли использовать шорткоды в описаниях элементов навигационного меню, чтобы иметь расширенный набор условий в отношении отображения определенных элементов меню (например, отображение на странице x, не не отображать на странице y или, что особенно полезно: автоматическое включение дочерних страниц/категорий и т. д. путем вставки их в массив nav_menu_item до того, как массив будет проанализирован ходоком)

Но добавление

add_filter(‘wp_nav_menu_objects’, ‘do_shortcode’);

вызывает некорректную загрузку страницы. Не ошибка пустой страницы, но страница перестает отображаться сразу после контейнера div меню навигации. Есть ли способ использовать для этой цели встроенную функцию шорткода WP? Или было бы необходимо создать собственный парсер шорткода в функции, анализирующей содержимое элемента навигации?

Спасибо за любые идеи!

Share
  1. Проблема в том, do_shortcode() что в первых параметрах ожидается строка, в то время как wp_nav_menu_objects get передает массив объектов меню.

    Итак, вам нужно написать свою собственную функцию-оболочку do_shortcode, что-то вроде этого…

    function my_nav_menu_objects_shortcode_mangler($items) {
        foreach ($items as $item) {
            $item->classes = explode(' ', do_shortcode(implode(' ', (array)$item->classes)));
        }
        return $items;
    }
    

    может работать. Вам нужно узнать о структуре объектов навигационного меню ($item), просмотрев исходный код, wp-includes/nav-menu-template.php а затем выяснить, какие свойства лучше всего изменить и как (какой формат они имеют, как преобразовать это в строку, чтобы вы может запустить шорткод поверх него и т.д.).

    Однако мне кажется, что другие способы реализации такой логики могут быть лучше, чем взлом функциональности шорткода.

    Также обратите внимание, что, используя эту модель, вы не можете иметь шорткод в одном свойстве вашего пункта меню и ожидать, что он изменит вывод другого… как вы не можете иметь шорткод в метке вашего пункта меню и надеяться, что он добавит или удалит css классы. Просто так не работает.

    • 0
  2. Что произойдет, если вы измените приоритет, скажем, на 11?

    add_filter(‘wp_nav_menu_objects’, ‘do_shortcode’, 11);
    

    Вот как фильтр добавляется к the_content в шорткодах.php. См.: http://codex.wordpress.org/Function_Reference/do_shortcode.

    • 0
  3. На самом деле было бы лучше изменить этот код, который использует описания меню.

    • 0

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

You must login to add an answer.