Я разработчик 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
для отображения этих виджетов.