我正在创建一个包含“章节”和“子章节”的页面,所有子章节都显示在章节页面上,而每个子章节都可以进行注释。为了更好的理解,我将描述结构:
我具有以下页面结构:
- Chapter 1
- Chapter 2
- Chapter 3
对于每个章节,都有一个带有多个条目(帖子)的分层自定义帖子类型“ sub_chapters”:
- Subchapter 1
- Subchapter 1.1
- Subchapter 1.2
- Subchapter 2
- Subchapter 3
页面第1章的作用类似于“概述”页面,并从所有子章获取内容。像这样:
Chapter 1 Title
- Subchapter 1 Content
- Subchapter 1 Comments
- Subchapter 1.1 Content
- Subchapter 1.1 Comments
- Subchapter 1.2 Content
- Subchapter 1.2 Comments
- Subchapter 2 Content
- Subchapter 2 Comments
- Subchapter 3 Content
- Subchapter 2 Comments
到目前为止,这种方法还可以,但是现在我想通过锚点链接将这些子章节自动附加到wordpress菜单中。
自动附加
在我的模板中,每个子章节都会获得一个ID,该ID是从该条目的条目构建的。 (例如id="subchapter-1-introduction"
)
我的wp_nav_menu仅包含3个页面:
- Chapter 1
- Chapter 2
- Chapter 3
我想创建一个菜单链接,它(括号内的网址):
- Chapter 1 (/chapter1/)
- Subchapter 1 Introduction (/chapter1/#subchapter1-introduction)
- Subchapter 1.1 (/chapter1/#subchapter1-1)
- Subchapter 2 (/chapter1/#subchapter2)
- Subchapter 3 (/chapter1/#subchapter3)
- Chapter 2 (/chapter1/)
...
- Chapter 3 (/chapter1/)
现在,我尝试使用过滤器wp_get_nav_menu_items
构建此结构,并更改WP nav菜单结构。但是我只能在页面下方建立1个等级。我无法建立层次结构。
没有自动附加
所以我想好了,我们不希望添加自动菜单,最好使用自定义的助行器。因为我还需要诸如current-menu-item
之类的wordpress菜单类。
我在Wordpress后端菜单部分中添加了页面/ cpt结构。这给了我一个不错的菜单,但是现在永久链接不能像预期的那样使用锚标签(如上所述)
我试图像这样从start_el
更改Walker_Nav_Menu
函数:
if ( $depth > 0) {
// create link to page with anchor
$atts['href'] = $permalinkFromParentPage . '/#' $slugFromSubChapter .
} else {
// were on level 0, only the page link
$atts['href'] = ! empty( $item->url ) ? $item->url : '';
}
但是在这种情况下,我不知道要获取$ permalinkFromParentPage,因为在start_el
中,我仅了解有关实际菜单项的信息。
我该如何解决,还是有更好的解决方案?我知道我可以使用自定义链接,但是子章节过多,因此我希望在“自动”菜单上附加wordpress菜单类。
答案 0 :(得分:1)
将这些功能添加到主题的“ functions.php”中(假设“章节”作为自定义帖子类型)。
class Walker_Dynamic_Submenu extends Walker_Nav_Menu {
function end_el(&$output, $item, $depth=0, $args=array()) { // function for first level posts
if( 100 == $item->ID ){ // replace with your menu item ID
global $post;
$chapters = get_posts(array('post_type'=>'chapter','posts_per_page'=>-1, 'post_parent' => 0));
if(!empty($chapters)) {
$output .= '<ul class="sub-menu">';
foreach($chapters as $post): setup_postdata($post);
$output .= '<li><a href="'.get_permalink().'">'.get_the_title().'</a>';
$output .= get_child_posts(get_the_ID());
$output .= '</li>';
endforeach; wp_reset_postdata();
$output .= '</ul>';
}
}
$output .= "</li>\n";
}
}
function get_child_posts($parent = 0) { // function to retrieve child posts
global $post;
$chapterschild = get_posts(array('post_type'=>'chapter','posts_per_page'=>-1, 'post_parent' => $parent));
if(!empty($chapterschild)) {
$outputchild .= '<ul class="sub-menu">';
foreach($chapterschild as $post): setup_postdata($post);
$outputchild .= '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
$outputchild .= get_child_posts(get_the_ID());
endforeach; wp_reset_postdata();
$outputchild .= '</ul>';
}
return $outputchild;
}
,并将其附加到wp_nav_menu()
之类的, 'walker' => new Walker_Dynamic_Submenu
-wp_nav_menu( array( 'theme_location' => 'top', 'menu_id' => 'top-menu', 'walker' => new Walker_Dynamic_Submenu ) );
上。