web-dev-qa-db-ja.com

カスタムの投稿タイプのシングルをメインのナビゲーションメニューのサブメニューに自動的に配置する

私は周りを見回していて、私がやりたいことがいくつか可能であるかもしれないというヒントを見ています、しかしそれはちょうど私のためにクリックしていません。

カスタム投稿タイプrt_doctorsがあります。私はそれを作ろうとしているので私のメインメニューには医師の動的リストがあるでしょう。

Nav Menuに、私の医師のカスタム投稿タイプのインデックス/アーカイブページにリンクしているメニュー項目の医師、そしてそれぞれの医師の単一の投稿にリンクしているサブメニュー項目のリストからぶら下がって欲しいのですが。彼ら自身。

カスタムウォーカーを使う必要があるかもしれませんが、私はそれを理解していないようです。

これは私がテストとして追加したコードです:(私のcptはアーカイブページとして製品を作っているのでProducts2と呼ばれるページを作成しました。私もProductsだけで試しました(cptが作られる前から作成しました)も)

class Walker_rt_Submenu extends Walker_Nav_Menu {
    function end_el(&$output, $item, $depth=0, $args=array()) {
        if( 'Products2' == $item->title ){
            $output .= '<ul><li>Dynamic Subnav</li></ul>';
        }
        $output .= "</li>\n";  
    }
}
wp_nav_menu(
    array(
        'theme_location' => 'primary',
        'walker' => new Walker_rt_Submenu
    )
);

しかし、私はこのエラーが出ます:

Call to a member function get_page_permastruct() on null in /home/randomnoises/public_html/wp-includes/link-template.php on line 355 

私はテストのテーマとして26を使用しています。

1
rudtek

Walker_Nav_Menuはあなたがこれに使うものではありません。

代わりに、wp_get_nav_menu_itemsフィルタを使用してください。開始する前に、投稿のリストの親になりたいメニュー項目/ページがどれであるかをコードで識別できるようにするための何らかの方法が必要です。これはCSSクラスで行うことができます - 管理パネルで親メニュー項目にCSSクラスを与えて、それを 'doctors-parent-item'と呼びましょう。

add_filter( 'wp_get_nav_menu_items', 'my_theme_doctors_menu_filter', 10, 3 );

function my_theme_doctors_menu_filter( $items, $menu, $args ) {
  $child_items = array(); // here, we will add all items for the single posts
  $menu_order = count($items); // this is required, to make sure it doesn't Push out other menu items
  $parent_item_id = 0; // we will use this variable to identify the parent menu item

  //First, we loop through all menu items to find the one we want to be the parent of the sub-menu with all the posts.
  foreach ( $items as $item ) {
    if ( in_array('doctors-parent-item', $item->classes) ){
        $parent_item_id = $item->ID;
    }
  }

  if($parent_item_id > 0){

      foreach ( get_posts( 'post_type=rt_doctors&numberposts=-1' ) as $post ) {
        $post->menu_item_parent = $parent_item_id;
        $post->post_type = 'nav_menu_item';
        $post->object = 'custom';
        $post->type = 'custom';
        $post->menu_order = ++$menu_order;
        $post->title = $post->post_title;
        $post->url = get_permalink( $post->ID );
        array_Push($child_items, $post);
      }

  }

  return array_merge( $items, $child_items );
}

あなたのメニューは、CSSクラス 'doctors-parent-item`を与えたメニューアイテムの下のサブメニューにあるすべてのrt_doctorsをディスパイアするでしょう。

2
Dan.