我想我是在尝试做一些不寻常的事情,因为我在任何地方都找不到它
我想根据相关页面的内容创建一个子菜单
例如,在我的菜单中有一个名为“TOP”的菜单项。该项目有一个子页面,称为“第1章”
在“第1章”的页面上有很多内容,其中包含H1或H2标记中分隔的值。
我的目标是将H1和H2标记(包括它们的值)加载到“第1章”的子菜单中。
我想用wp_nav_menu
函数并向其添加一个walker。问题是我不知道从哪里或如何开始(尤其是步行者)。显然,我已经在样式表中创建了页面和子菜单,如下所示:
div class="nav">
<?php wp_nav_menu( array( \'theme_location\' => \'menu\') );?>
</div>
但现在我需要加载内容。我希望任何人都能帮助我解决这个“问题”,从哪里开始。
所以我找到了一种只获取所有“H1”标签内容的方法。这仅适用于当前正在查看的页面。
function getTextBetweenTags($tag, $html, $strict=0)
{
/*** a new dom object ***/
$dom = new domDocument;
/*** load the html into the object ***/
$dom->loadHTML($html);
/*** discard white space ***/
$dom->preserveWhiteSpace = false;
/*** the tag by its tag name ***/
$content = $dom->getElementsByTagname($tag);
/*** the array to return ***/
$out = array();
foreach ($content as $item)
{
/*** add node value to the out array ***/
$out[] = $item->nodeValue;
}
/*** return the results ***/
return $out;
}
global $post;
$post_id = $post->ID;
$html = get_post_field(\'post_content\', $post_id);
$content = getTextBetweenTags(\'h1\', $html);
$i=0;
echo \'<ul>\';
if($content[0]){
foreach( $content as $item )
{
echo \'<li><a href="#\'.$i++.\'">\'.utf8_decode($item).\'</a></li>\';
}
}else{
echo\'<li>\'.get_the_title().\'</li>\';
}
echo \'</ul>\';
新编辑-所以我选择了定制的Walker。现在,我从网上找到的教程中学习了一个助行器。此助行器的描述来自
wp_nav_menu
并将其置于实际标题下方。这是步行者:
class custom_walker extends Walker_Nav_Menu{
//start of the sub menu wrap
function start_lvl(&$output, $depth) {
$output .= \'<div class="drop">
<div class="holder">
<div class="container">
<ul class="list">\';
}
//end of the sub menu wrap
function end_lvl(&$output, $depth) {
$output .= \'
</ul>
</div>
</div>
<div class="bottom"></div>
</div>\';
}
//add the description to the menu item output
function start_el(&$output, $item, $depth, $args) {
global $wp_query;
$indent = ( $depth ) ? str_repeat( "\\t", $depth ) : \'\';
$class_names = $value = \'\';
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
$class_names = join( \' \', apply_filters( \'nav_menu_css_class\', array_filter( $classes ), $item ) );
$class_names = \' class="\' . esc_attr( $class_names ) . \'"\';
$output .= $indent . \'<li id="menu-item-\'. $item->ID . \'"\' . $value . $class_names .\'>\';
$attributes = ! empty( $item->attr_title ) ? \' title="\' . esc_attr( $item->attr_title ) .\'"\' : \'\';
$attributes .= ! empty( $item->target ) ? \' target="\' . esc_attr( $item->target ) .\'"\' : \'\';
$attributes .= ! empty( $item->xfn ) ? \' rel="\' . esc_attr( $item->xfn ) .\'"\' : \'\';
$attributes .= ! empty( $item->url ) ? \' href="\' . esc_attr( $item->url ) .\'"\' : \'\';
$item_output = $args->before;
$item_output .= \'<a\'. $attributes .\'>\';
$item_output .= $args->link_before . apply_filters( \'the_title\', $item->title, $item->ID ) . $args->link_after;
$item_output .= \'<br /><span class="sub">\' .
$post_id = $post->ID;
$html = get_post_field(\'post_content\', $post_id);
$content = getTextBetweenTags(\'h2\', $html);
$i=0;
echo \'<div style="background:#000000;"><ul>\';
if($content[0]){
foreach( $content as $item )
{
echo \'<li><a href="#\'.$i++.\'">\'.utf8_decode($item).\'</a></li>\';
}
}
echo \'<ul></div>\'
. \'</span>\';
$item_output .= \'</a>\';
$item_output .= $args->after;
$output .= apply_filters( \'walker_nav_menu_start_el\', $item_output, $item, $depth, $args );}}
我更换了
$description
应使用自定义代码显示H2标记之间的内容。
这是可行的,但问题是。我创建了一个具有黑色背景的div,这样就可以清楚地看到加载了哪个部分。div块位于菜单的顶部,而不是下方。我不能确定wich block是哪个子菜单项。
当前脚本为每个子菜单项创建内容。这很好,但是它只显示它所在页面的内容。所以我改变了$post->ID
到$item->ID
但这只给了我导航元素的ID。这样做的好处是,它显示菜单元素下面的内容。
我想我在这方面做得对,但需要朋友们的帮助:-)
M
-编辑这是当前start_el
作用
function start_el(&$output, $item, $depth, $args) {
global $wp_query;
$indent = ( $depth ) ? str_repeat( "\\t", $depth ) : \'\';
$class_names = $value = \'\';
$classes = empty( $item->classes ) ? array() : (array) $item->classes;
$class_names = join( \' \', apply_filters( \'nav_menu_css_class\', array_filter( $classes ), $item ) );
$class_names = \' class="\' . esc_attr( $class_names ) . \'"\';
$output .= $indent . \'<li id="menu-item-\'. $item->ID . \'"\' . $value . $class_names .\'>\';
$attributes = ! empty( $item->attr_title ) ? \' title="\' . esc_attr( $item->attr_title ) .\'"\' : \'\';
$attributes .= ! empty( $item->target ) ? \' target="\' . esc_attr( $item->target ) .\'"\' : \'\';
$attributes .= ! empty( $item->xfn ) ? \' rel="\' . esc_attr( $item->xfn ) .\'"\' : \'\';
$attributes .= ! empty( $item->url ) ? \' href="\' . esc_attr( $item->url ) .\'"\' : \'\';
$current_post = get_post( $item->object_id );
$item_output = $args->before;
$item_output .= \'<a\'. $attributes .\'>\';
$item_output .= $args->link_before . apply_filters( \'the_title\', $item->title, $item->ID ) . $args->link_after;
$item_output .= \'<br /><span class="sub">\'.
$doc = new DOMDocument();
$doc->LoadHTML( $post->post_content );
$titles = $doc->getElementsByTagName(\'h1\');
foreach ($titles as $a_title) {
$single_title = $doc->saveHTML( $a_title );
}
\'</span>\';
$item_output .= \'</a>\';
$item_output .= $args->after;
$output .= apply_filters( \'walker_nav_menu_start_el\', $item_output, $item, $depth, $args );
}