挂接到walker_NAV_MENU_START_EL以插入子页面列表

时间:2016-10-22 作者:Josh

What I want

如果使用WordPress中的“菜单”工具将“类别”添加到菜单中,我希望我的主题自动添加一个子菜单,其中包含指向该类别中所有帖子的链接。

<ul>
    <li><a href="link">Page 1</a></li>
    <li><a href="link">Page 2</a></li>
    <li><a href="link">Category X</a>
        //Automatically insert list of links to all posts in Category X
        <ul>
            <li><a href="link">Post 1</a></li>
            <li><a href="link">Post 2</a></li>
        </ul>
    </li>
    <li><a href="link">Category Y</a>
        //Automatically insert list of links to all posts in Category Y
        <ul>
            <li><a href="link">Post 1</a></li>
            <li><a href="link">Post 2</a></li>
            <li><a href="link">Post 3</a></li>
            <li><a href="link">Post 4</a></li>
        </ul>
    </li>
</ul>

What I\'ve tried

在我的functions.php 我创建了一个函数并将其连接到walker_nav_menu_start_el 行动通过$item 变量输入到函数中,我能够识别当前菜单项是否为类别以及它是什么类别。但我在为该类别中的所有帖子创建带有帖子标题的链接列表时遇到了问题。

起初我想我可以用get_posts 函数和foreach循环,但因为我没有输出,所以我只是构建一个输出变量,以传递回walker_nav_menu_start_el 操作,它只是输出当前帖子的详细信息,而不是它循环通过的每个帖子的详细信息。这是我尝试的代码:

function hw_submenu( $output, $item ) {
   if( $item->object == \'category\' ) {

      $hw_output = \'<ul>\';
      $subposts = get_posts( array(
         \'posts_per_page\' => -1,
         \'category\' => $item->object_id
      ) );
      if ( $subposts ) {
         foreach ( $subposts as $post ) :
            setup_postdata( $post );
            $hw_output .= "<li><a href=\'" . the_permalink() . "\'\'>" . the_title(\'\', \'\', false) . "</a></li>";
         endforeach; 
         wp_reset_postdata();
      }

      $output .= $hw_output . "</ul>";
   }    

   return $output;
}
add_action( \'walker_nav_menu_start_el\', \'hw_submenu\', 10, 2);
这是一个示例菜单输出:

<ul>
    <li><a href="link">Page 1</a></li>
    <li><a href="link">Page 2</a></li>
    <li><a href="link">Category X</a>
        //Automatically inserts list of links to the post I\'m currently viewing
        <ul>
            <li><a href="link">Post I\'m currently viewing</a></li>
            <li><a href="link">Post I\'m currently viewing</a></li>
        </ul>
    </li>
    <li><a href="link">Category Y</a>
        //Automatically inserts list of links to the post I\'m currently viewing
        <ul>
            <li><a href="link">Post I\'m currently viewing</a></li>
            <li><a href="link">Post I\'m currently viewing</a></li>
            <li><a href="link">Post I\'m currently viewing</a></li>
            <li><a href="link">Post I\'m currently viewing</a></li>
        </ul>
    </li>
</ul>
如何让每个类别在菜单中列出其帖子?我能用这个动作钩吗?或者我应该看一个定制的步行者?

1 个回复
最合适的回答,由SO网友:Josh 整理而成

我可以通过使用get_the_title 使用post ID而不是使用the_title. 然后我决定尝试使用$subpost->post_title 这也奏效了。我想这比get_the_title 因为它不必再次“获取”数据,所以它只使用我们已经获取的数据。我不知道为什么$subpost->post_title 将起作用,并且the_title 不会。很想听听人们对此有什么见解。

工作代码:

function hw_submenu( $output, $item ) {
   if( $item->object == \'category\' ) {

      $hw_output = \'<ul>\';
      $subposts = get_posts( array(
         \'posts_per_page\' => -1,
         \'category\' => $item->object_id
      ) );
      if ( $subposts ) {
         foreach ( $subposts as $subpost ) :
            setup_postdata( $subpost );
            $hw_output .= "<li><a href=\'" . get_the_permalink($subpost->ID) . "\'\'>" . $subpost->post_title . "</a></li>";
         endforeach; 
         wp_reset_postdata();
      }

      $output .= $hw_output . "</ul>";
   }    

   return $output;
}
add_filter( \'walker_nav_menu_start_el\', \'hw_submenu\', 10, 2);

相关推荐

在WP搜索表单中是否有类似`wp_Dropdown_Categories()`的输入复选框选项?

我有自定义的帖子类型,当前正在使用wp_dropdown_categories() 在WP搜索表单中的功能,以便人们能够按薪资级别和工作类型进行筛选。是否有一个等效函数,以便用户可以使用输入复选框元素而不是<select> 元素,以便他们在进行搜索时可以选择多个工作类型或薪资水平?我似乎在开发者文档中找不到任何东西。我正在寻找的是允许复选框替换使用下面代码中的select选项的下拉元素的东西。<form method="get" action="<?p