Intereting Posts
Пользовательский шаблон страницы не вызывается Buddypress – добавление пользовательских сообщений для участников Звуковая ссылка WordPress не работает Обнаруживать, какое поле пользователя мета обновляется при обновлении профиля пользователя Получение списка пользовательских типов сообщений Выбор не более 12 заказов во всех выбранных параметрах iframe не отображается в сообщении (с включенным плагином «Разрешить php в сообщениях») WP Insert Post Если пользователь обновляет отмену новой публикации Максимальное изменение размера загружаемого файла в php.ini игнорируется. Как удалить ограничение размера загрузки? Постоянная ссылка: Пользовательские URL-адреса wp_enqueue_scripts не работает в пользовательской теме Почему результаты поиска пользователей ошибочно разбиты на страницы? Сохранение в post_excerpt или post_content Дайте условие пункту меню wordpress, чтобы изменить его предложение для каждой целевой страницы, которую я создаю Миграция сообщений и фотографий из блога в другой

wp_nav_walker, который взаимодействует с виджетами для настройки мега-меню

Я разработчик WordPress новичка, работающий над проектом темы WordPress, который требует мега-меню как часть основной навигации.

Я закончил работу с интерфейсом, и теперь я пытаюсь изучить класс wp_nav_walker чтобы расширить его в соответствии с моим требованием, но не знаю, как начать работу.

Моя идея:

  • Чтобы заполнить мега-меню с помощью виджетов , поскольку виджеты , как представляется, являются единственным способом сделать предварительный материал (например, сообщения AJAX-загрузки из категорий) в меню

  • Чтобы добавить флажок под каждым пунктом меню первого уровня, чтобы включить / отключить для него мега-меню

Проблема в том, как я могу заставить ее поддерживать виджеты?

Я просмотрел несколько бесплатных плагинов, таких как Widgetize Navigation Menu , но это немного продвинутый материал, и мне было сложно их настроить, чтобы сделать простой.

Любая помощь будет принята с благодарностью.

Основываясь на вашем комментарии, что меню mashable.com – это то, что вы собираетесь делать, я буду предполагать, что вы хотите структурировать свой HTML- ul.menu > li > a + ul.submenu + ul.featured-content подобный этому (то есть ul.menu > li > a + ul.submenu + ul.featured-content ). Тем не менее, это действительно детали реализации, которые вы можете уточнить для своего варианта использования.

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

 class WPSE177330_Walker extends Walker_Nav_Menu { // Don't need to modify start_lvl() // Don't need to modify end_lvl() // Don't (necessarily) need to modify start_el() /** * Outputs the closing for the element. * * @param string $output Passed by reference. Used to append additional content. * @param object $item Page data object. Not used. * @param int $depth Depth of page. Not Used. * @param array $args An array of arguments. @see wp_nav_menu() */ public function end_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) { // Setup indent $indent = ( $depth ) ? str_repeat( "\t", $depth ) : ''; // Capture all top level items and append the featured content if ( $depth < 1 ) { if ( 'taxonomy' == $item->type ) { // Get your top posts in the category using $item info // Assemble output // Add it to output $output .= $indent . $featured_content; } else { // What to do with top level menu items that aren't taxonomies } } else { // What to do if depth is greater than 1 // Default behavior $output .= "</li>\n"; } } } 

Убедитесь, что вы возились с $item чтобы получить именно то, что вы хотите. Вот print_r из $item из $item меню категории с именем «Foo», чтобы дать вам некоторое представление о том, что искать, чтобы настроить все, что вам нужно.

 WP_Post Object ( [ID] => 7 [post_author] => 1 [post_date] => 2015-02-07 15:29:42 [post_date_gmt] => 2015-02-07 20:29:42 [post_content] => [post_title] => [post_excerpt] => [post_status] => publish [comment_status] => open [ping_status] => open [post_password] => [post_name] => 7 [to_ping] => [pinged] => [post_modified] => 2015-02-07 15:29:42 [post_modified_gmt] => 2015-02-07 20:29:42 [post_content_filtered] => [post_parent] => 0 [guid] => http://sandbox.localhost/?p=7 [menu_order] => 1 [post_type] => nav_menu_item [post_mime_type] => [comment_count] => 0 [filter] => raw [db_id] => 7 [menu_item_parent] => 0 [object_id] => 3 [object] => category [type] => taxonomy [type_label] => Category [url] => http://sandbox.localhost/category/foo/ [title] => Foo [target] => [attr_title] => [description] => [classes] => Array ( [0] => [1] => menu-item [2] => menu-item-type-taxonomy [3] => menu-item-object-category ) [xfn] => [current] => [current_item_ancestor] => [current_item_parent] => ) 

Я написал это так, чтобы он не использовал виджетов, как вы сказали, что в комментариях вы были открыты. Я считаю, что это более чистая реализация, так как она позволяет вам настраивать вещи один раз и не мешает вашим виджетам с кучей виджета, специфичного для меню. Если вы хотели использовать виджеты вместо этого (как вы изначально предлагали), возможно, для немного большей гибкости, чем вы можете использовать с жестко закодированным решением, вы можете регистрировать виджеты для каждого элемента меню верхнего уровня, а затем использовать ту же концепцию пользовательского Расширение Walker_Nav_Menu для отображения этих виджетов.