Intereting Posts
WP Pagenavi показывает только первые две страницы без ошибок Редактирование / удаление пользовательских типов сообщений через веб-страницу (не admin) Пользовательский поиск WordPress by post_type Multidatabase для входа / woocommerce Тематический независимый плагин с использованием шаблона по умолчанию Процесс пользовательского входа Получить категорию slug и отобразить ее на query_post WordPress не соблюдает иерархию шаблонов (выбирает index.php вместо single.php или page.php) Перезаписывать сообщения / страницы через импорт Использование javascript на моем сайте для создания вложенных вкладок Функции вложенности в функциях Switch_to_blog () вне wordpress Как создать вторую страницу сообщений, которую клиент может обновить как отобразить сегодня наиболее просматриваемые должности заказ по пользовательским мета-представлениям Как добавить теги (пользовательская таксономия) для публикации класса css?

Разделите wp_list_pages, чтобы настроить его

Я пытаюсь «разбить», (думаю, что взорваться – правильная терминология), wp_list_pages, чтобы добавить в него некоторый код списка определений (dl, dt, dd).

Вот код html, который я пытаюсь вывести:

<div id="nav"> <ul id="drop-nav"> <li><a href="#">About Us</a> <div class="subnav"> <div class="subnavTop"> <ul class="subnavContent"> <li> <dl> <dt><a href="#">Help Desk</a></dt> <dd><a href="#">Email your question</a></dd> <dd><a href="#">Text a question</a></dd> </dl> <dl> <dt><a href="#">Life stories</a></dt> <dt><a href="#">Statistics</a></dt> <dd><a href="#">World Statistics</a></dd> <dd><a href="#">UK Statistics</a></dd> <dd><a href="#">South West Statistics</a></dd> <dd><a href="#">Research projects</a></dd> </dl> </li> </ul> </div> </div> </li> <li><a href="#">Talk to us</a></li> </ul> <br style="clear: left" /> </div> 

Вот мой текущий вывод html-кода:

 <div id="nav"> <ul id="drop-nav"> <li><a href="#">About Us</a> <div class="subnav"> <div class="subnavTop"> <ul class="subnavContent"> <li class="page_item page-item-15"><a href="#">Child of About</a> <ul class='children'> <li class="page_item page-item-28"><a href="#">Grandchild of About</a></li> </ul> </li> </ul> </div> </div> </li> <li><a href="#">Talk to us</a></li> </ul> <br style="clear: left" /> </div> 

Что генерируется с использованием следующего кода из моего header.php (не помню, на каком сайте я нашел это):

 <div id="nav"> <ul id="drop-nav"> <?php // Query the database for all top-level page IDs, and store them in the $menuPages array under the [ID] sub-array $menuPages = $wpdb->get_results("SELECT ID FROM $wpdb->posts WHERE post_parent=0 AND post_type='page' AND post_status='publish' ORDER BY menu_order ASC"); // For each element in the $menuPages array, get the value from the [ID]-subarray to create the top-level menu and it's children foreach($menuPages as $menuItem){ $menuItemTitle = get_the_title($menuItem->ID); $menuItemClass = strtolower(trim($menuItemTitle)); $menuItemClass = preg_replace('/[^a-z0-9-]/', '-', $menuItemClass); $menuItemClass = preg_replace('/-+/', "-", $menuItemClass); $menuItemPermalink = get_permalink($menuItem->ID); if (isset($menuItemTitle) && $menuItemTitle != 'Home'){ _e('<li class="'.$menuItemClass.'">'.PHP_EOL); _e('<a href="'.$menuItemPermalink.'">'.$menuItemTitle.'</a>'.PHP_EOL); // Run wp_list_pages to fetch any children, and put the HTML <LI> list results into $menuItemChildren as a string $menuItemChildren = wp_list_pages('title_li=&echo=0&depth=1&sort_column=menu_order&child_of='.$menuItem->ID); // If results were returned, $menuItemChildren is now a string with HTML in it, so create a drop-down and echo out the HTML if($menuItemChildren){ _e('<div class="subnav">'.PHP_EOL); _e('<div class="subnavTop">'.PHP_EOL); _e('<ul class="subnavContent">'.PHP_EOL); echo $menuItemChildren . PHP_EOL; _e('</ul>'.PHP_EOL); _e('</div>'.PHP_EOL); _e('</div>'.PHP_EOL); } _e('</li>'.PHP_EOL); } } ?> </ul> <br style="clear: left" /> </div> 

Честно говоря, это путает меня жизнь. Я вижу, что он должен работать, просто не уверен, как заставить его работать. Мне как-то нужно изменить каждую дочернюю страницу / элемент на a, внуки на «s», все это хорошо украшено.

Надеюсь, это имеет смысл. Любые идеи / помощь очень ценятся, С.

(Код используется для динамического создания «мега-меню»)

/ * Обновленный код класса Walker ниже 08-03-11, как изначально предоставлено wyrfel – много спасибо * /

 class My_Walker_Page extends Walker { var $tree_type = 'page'; var $db_fields = array ('parent' => 'post_parent', 'id' => 'ID'); function start_lvl(&$output, $depth) { $indent = str_repeat("\t", $depth); switch ($depth) { case 0: $output .= "<div class=\"subnav\">\n"; $output .= "<div class=\"subnavTop\">\n"; $output .= $indent."<ul class='subnavContent'>\n"; $output .= "<li>\n<dl>\n"; break; case 1: break; default: break; } } function end_lvl(&$output, $depth) { $indent = str_repeat("\t", $depth); switch ($depth) { case 0: $output .= "\n</dl>\n</li>\n"; $output .= "</ul>\n"; $output .= "</div>\n"; $output .= "</div>\n"; break; case 1: break; default: break; } } function start_el(&$output, $page, $depth, $args, $current_page) { if ( $depth ) $indent = str_repeat("\t", $depth); else $indent = ''; extract($args, EXTR_SKIP); $css_class = array('page_item', 'page-item-'.$page->ID); if ( !empty($current_page) ) { $_current_page = get_page( $current_page ); _get_post_ancestors($_current_page); if ( isset($_current_page->ancestors) && in_array($page->ID, (array) $_current_page->ancestors) ) $css_class[] = 'current_page_ancestor'; if ( $page->ID == $current_page ) $css_class[] = 'current_page_item'; elseif ( $_current_page && $page->ID == $_current_page->post_parent ) $css_class[] = 'current_page_parent'; } elseif ( $page->ID == get_option('page_for_posts') ) { $css_class[] = 'current_page_parent'; } $css_class = implode(' ', apply_filters('page_css_class', $css_class, $page)); $page_link = '<a href="' . get_permalink($page->ID) . '" title="' . esc_attr( wp_strip_all_tags( apply_filters( 'the_title', $page->post_title, $page->ID ) ) ) . '">' . $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after . '</a>'; $top_class = strtolower(trim($page->post_title)); $top_class = preg_replace('/[^a-z0-9-]/', '-', $top_class); $top_class = preg_replace('/-+/', "-", $top_class); switch ($depth) { case 0: $output .= $indent . '<li class="' . $top_class . '">'.$page_link . PHP_EOL; break; case 1: $output .= $indent . '<dt>'.$page_link.'</dt>' . PHP_EOL; break; default: $output .= $indent . '<dd>'.$page_link.'</dd>' . PHP_EOL; break; } if ( !empty($show_date) ) { if ( 'modified' == $show_date ) $time = $page->post_modified; else $time = $page->post_date; $output .= " " . mysql2date($date_format, $time); } } function end_el(&$output, $page, $depth) { switch ($depth) { case 0: $output .= "</li>\n"; break; case 1: break; default: break; } } } 

Это один из тех вопросов, когда надежный ответ нелегкий. Эта функция оснащена классом Walker_Page и вы можете заменить ее собственным ходоком (расширенным от Walker_Page или просто Walker ), передав его имя в аргументе walker в wp_list_pages() .

В двух словах это очень гибкий способ сделать это, но не очень удобно и легко понять, особенно когда вы не возитесь с пешеходами регулярно.

Я не могу проверить это прямо сейчас, но я попробовал написать тебе ходунок. Это не делает то, что вам нужно, поскольку атрибуты класса / id верхнего уровня трудно изменить, но все, что ниже этого, должно быть прекрасным (или я надеюсь).

 class My_Walker_Page extends Walker { var $tree_type = 'page'; var $db_fields = array ('parent' => 'post_parent', 'id' => 'ID'); function start_lvl(&$output, $depth) { $indent = str_repeat("\t", $depth); switch ($depth) { case 0: $output .= $indent."<ul id=\"drop_nav\">\n"; break; case 1: $output .= "<div class=\"subnav\">\n"; $output .= "<div class=\"subnavTop\">\n"; $output .= $indent."<ul class='subnavContent'>\n"; $output .= "<li>\n<dl>\n"; break; default: break; } } function end_lvl(&$output, $depth) { $indent = str_repeat("\t", $depth); switch ($depth) { case 0: $output .= "\n".$indent."</ul>\n"; break; case 1: $output .= "\n</dl>\n</li>\n"; $output .= "</ul>\n"; $output .= "</div>\n"; $output .= "</div>\n"; break; default: break; } } function start_el(&$output, $page, $depth, $args, $current_page) { if ( $depth ) $indent = str_repeat("\t", $depth); else $indent = ''; extract($args, EXTR_SKIP); $css_class = array('page_item', 'page-item-'.$page->ID); if ( !empty($current_page) ) { $_current_page = get_page( $current_page ); _get_post_ancestors($_current_page); if ( isset($_current_page->ancestors) && in_array($page->ID, (array) $_current_page->ancestors) ) $css_class[] = 'current_page_ancestor'; if ( $page->ID == $current_page ) $css_class[] = 'current_page_item'; elseif ( $_current_page && $page->ID == $_current_page->post_parent ) $css_class[] = 'current_page_parent'; } elseif ( $page->ID == get_option('page_for_posts') ) { $css_class[] = 'current_page_parent'; } $css_class = implode(' ', apply_filters('page_css_class', $css_class, $page)); $page_link = '<a href="' . get_permalink($page->ID) . '" title="' . esc_attr( wp_strip_all_tags( apply_filters( 'the_title', $page->post_title, $page->ID ) ) ) . '">' . $link_before . apply_filters( 'the_title', $page->post_title, $page->ID ) . $link_after . '</a>'; switch ($depth) { case 0: $output .= $indent . '<li class="' . $css_class . '">'.$page_link; break; case 1: $output .= $indent . '<dt class="' . $css_class . '">'.$page_link; break; default: $output .= $indent . '<dd class="' . $css_class . '">'.$page_link; break; } if ( !empty($show_date) ) { if ( 'modified' == $show_date ) $time = $page->post_modified; else $time = $page->post_date; $output .= " " . mysql2date($date_format, $time); } } function end_el(&$output, $page, $depth) { switch ($depth) { case 0: $output .= "</li>\n"; break; case 1: $output .= "</dt>\n"; break; default: $output .= "</dd>\n"; break; } } } 

Вы должны быть в состоянии просто сделать:

 $args = array( 'title_li' => '', 'sort_column' => 'menu_order', 'walker' => new My_Walker_Page(), ); wp_list_pages($args);