如何自动将自定义帖子类型条目附加为wp_nav_menu子级别

时间:2018-08-18 12:31:16

标签: php wordpress

我正在创建一个包含“章节”和“子章节”的页面,所有子章节都显示在章节页面上,而每个子章节都可以进行注释。为了更好的理解,我将描述结构:

我具有以下页面结构:

- 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菜单类。

1 个答案:

答案 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 ) );上。