php 仅显示当前父菜单及其子菜单 - wordpress

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18875400/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 18:22:11  来源:igfitidea点击:

Display current parent and its sub-menu only - wordpress

phpwordpress

提问by varun

I have a main navigation and all parents have children. Eg:

我有一个主导航,所有的父母都有孩子。例如:

Page A: About Us
child1
child2

Page B : Our services
Child 3
Child 4

I need to include a horizontal sub-menu on a page. But my problem is, if currently we are on page A, all the child items of page A only to be displayed on page. If we are on Page A, it should looks like:

我需要在页面上包含一个水平子菜单。但我的问题是,如果当前我们在页面 A 上,则页面 A 的所有子项只会显示在页面上。如果我们在页面 A 上,它应该是这样的:

Page A
Child 1
Child 2

Like this, when we go to Page B, the child of page B only to be displayed.

像这样,当我们转到页面 B 时,页面 B 的子页面才被显示。

      <?php 
  $args = array(
   'theme_location'  => '',
   'menu'            => '13',  //nav menu id, which has about-us as a menu.
   'container'       => 'div',
   'container_class' => '',
   'container_id'    => '',
   'menu_class'      => 'menu',
   'menu_id'         => '',
   'echo'            => true,
   'fallback_cb'     => 'wp_page_menu',
   'before'          => '',
   'after'           => '',
   'link_before'     => '',
   'link_after'      => '',
   'items_wrap'      => '<ul id="%1$s" class="%2$s">%3$s</ul>',
   'depth'           => 0,
   'walker'          => ''
);
  $menu_items = wp_nav_menu($args);//wp_get_nav_menu_items(13);

I tried writing above code, which resulted in all the parent items with their children.

我尝试编写上面的代码,这导致所有父项都带有它们的子项。

Can someone help me on this?

有人可以帮我吗?

In short,I want to get all the children(sub-menu) of About usmenu entry.(i.e. I want child1 & child2 as a list with <a>tags)

简而言之,我想获取关于我们菜单项的所有子菜单(子菜单)。(即我想要 child1 和 child2 作为带有<a>标签的列表)

采纳答案by varun

This is doing it all

这是在做这一切

<?php
global $wp_query;
if( empty($wp_query->post->post_parent) ) {
$parent = $wp_query->post->ID;
} else {
$parent = $wp_query->post->post_parent;
} ?>
<?php if(wp_list_pages("title_li=&child_of=$parent&echo=0" )): ?>
<div>
<ul>
<?php wp_list_pages("title_li=&child_of=$parent" ); ?>
</ul>
</div>
<?php endif; ?>

Thanks for all the solutions !

感谢所有的解决方案!

回答by Atif Tariq

Please write this code in theme's functions.php

请在主题的functions.php中编写此代码

<?php

// add hook
add_filter( 'wp_nav_menu_objects', 'my_wp_nav_menu_objects_sub_menu', 10, 2 );

// filter_hook function to react on sub_menu flag
function my_wp_nav_menu_objects_sub_menu( $sorted_menu_items, $args ) {
  if ( isset( $args->sub_menu ) ) {
    $root_id = 0;
    // find the current menu item
    foreach ( $sorted_menu_items as $menu_item ) {
      if ( $menu_item->current ) {
        // set the root id based on whether the current menu item has a parent or not
      $root_id = ( $menu_item->menu_item_parent ) ? $menu_item->menu_item_parent : $menu_item->ID;
      break;
    }
  }
  // find the top level parent
  if ( ! isset( $args->direct_parent ) ) {
    $prev_root_id = $root_id;
    while ( $prev_root_id != 0 ) {
      foreach ( $sorted_menu_items as $menu_item ) {
        if ( $menu_item->ID == $prev_root_id ) {
          $prev_root_id = $menu_item->menu_item_parent;
          // don't set the root_id to 0 if we've reached the top of the menu
          if ( $prev_root_id != 0 ) $root_id = $menu_item->menu_item_parent;
            break;
          }
        }
      }
    }

    $menu_item_parents = array();
    foreach ( $sorted_menu_items as $key => $item ) {
      // init menu_item_parents
      if ( $item->ID == $root_id ) $menu_item_parents[] = $item->ID;

      if ( in_array( $item->menu_item_parent, $menu_item_parents ) ) {
      // part of sub-tree: keep!
        $menu_item_parents[] = $item->ID;
      } else if ( ! ( isset( $args->show_parent ) && in_array( $item->ID, $menu_item_parents ) ) ) {
      // not part of sub-tree: away with it!
      unset( $sorted_menu_items[$key] );
    }
  }
return $sorted_menu_items;
} else {
  return $sorted_menu_items;
}
}

Then you can display it in your theme using wp_nav_menu (just like you normally would), but also passing in a sub_menu flag to activate the custom sub_menu function:

然后您可以使用 wp_nav_menu 将其显示在您的主题中(就像您通常会那样),但也可以传入 sub_menu 标志以激活自定义 sub_menu 功能:

<?php
wp_nav_menu( array(
  'theme_location' => 'primary',
  'sub_menu' => true
) );
?>

回答by jakobhans

When on a page you first get all the pages, then you can get the current page ID, get the children in an array and loop through this array like this:

当在页面上时,您首先获取所有页面,然后您可以获得当前页面 ID,获取数组中的子项并循环遍历此数组,如下所示:

<?php
    // First get all the pages in your site
    $wp_query = new WP_Query();
    $all_pages = $wp_query->query(array('post_type' => 'page'));

    // Then get your current page ID and children (out of all the pages)
    $current_page_id = get_the_id();
    $current_page_children = get_page_children($current_page_id, $all_pages);

    // Loop through the array of children pages
    foreach ($current_page_children as $child_page) {
        // Echo whatever you want from the pages
    }
?>

EDIT: This has nothing to do with the structured menus you make in the backend, it has to do with making a page child of another page directly in the page edit section.

编辑:这与您在后端制作的结构化菜单无关,它与直接在页面编辑部分中制作另一个页面的页面子级有关。

回答by Jonathan

I wrote a function to help with this, since most examples I found include the page children, but not the parent itself. Just add this function to your functions.phpfile:

我写了一个函数来帮助解决这个问题,因为我发现的大多数例子都包括页面子级,但不包括父级本身。只需将此功能添加到您的functions.php文件中:

<?php

// Display sub menu
function the_sub_menu()
{
    global $post;

    // Open list
    echo '<ul class="sub_menu">';

    // Sub page
    if($post->post_parent) {

        // Load parent
        $parent = get_post($post->post_parent);

        // Add parent to list
        echo '<li><a href="' . get_permalink($parent->ID) . '">' . $parent->post_title . '</a></li>';

        // Add children to list
        wp_list_pages('title_li=&child_of=' . $post->post_parent);

    // Parent page
    } else {

        // Add parent to list
        echo '<li class="current_page_item"><a href="' . get_permalink($post->ID) . '">' . $post->post_title . '</a></li>';

        // Add children to list
        wp_list_pages('title_li=&child_of=' . $post->ID);
    }

    // Close list
    echo '</ul>';
}

Then, to use it on a page, simply call it like this:

然后,要在页面上使用它,只需像这样调用它:

<?php get_header() ?>

    <?php while (have_posts()): the_post() ?>

        <!-- Include the sub menu! -->
        <?php the_sub_menu() ?>

        <article>
            <?php the_content() ?>
        </article>

    <?php endwhile ?>

<?php get_footer() ?>

回答by Rao

First thing you need to do is to make your 'child1' 'child2' pages as child pages of 'About Us' page.

您需要做的第一件事是将您的“child1”“child2”页面作为“关于我们”页面的子页面。

Click here to find out more on creating sub pages.

单击此处了解有关创建子页面的更多信息

Once you have the pages structured, you can use this function, (link to docs)

页面结构化后,您可以使用此功能,(链接到文档

<?php wp_list_pages( $args );  

 $args = array(
    'depth'        => 0,
    'show_date'    => '',
    'date_format'  => get_option('date_format'),
    'child_of'     => N,   //N here should be replaced by your About-us page ID. 
    'exclude'      => '',
    'include'      => '',
    'title_li'     => __('About Us'),   //here you can mention any title you like for the list that's echoed by this function
    'echo'         => 1,
    'authors'      => '',
    'sort_column'  => 'menu_order, post_title',
    'link_before'  => '',
    'link_after'   => '',
    'walker'       => '',
    'post_type'    => 'page',
    'post_status'  => 'publish' 
); ?>

Same goes for your 'Our services' page, Hope this resolves your problem. Do let us know if you face any problem & welcome to stackoverflow!

您的“我们的服务”页面也是如此,希望这能解决您的问题。如果您遇到任何问题,请告诉我们并欢迎使用 stackoverflow!

回答by Gabriel Klein

A fast and "dirty" solution.

一个快速而“肮脏”的解决方案。

I have created the following file .../wp-content/plugins/gabriel-submenu.php

我创建了以下文件 .../wp-content/plugins/gabriel-submenu.php

With this content:

有了这个内容:

<?php
/**
 * @package Gabriel_SubMenu
 * @version 0.1
 */
/*
Plugin Name: Gabriel SubMenu
Plugin URI: http://www.nuage.ch
Description: My plugin to display a submenu
Author: Gabriel Klein
Version: 0.1
Author URI: http://www.nuage.ch
*/

function gab_submenu_content($a) {

        $d = array(
                'theme_location' => 'main_menu',
                'child_of'       => $a['id'],
                'echo'           => false,
                'sort_column'    => 'menu_order'
        );

        return wp_nav_menu( $d );

}

add_shortcode('gabsubmenu','gab_submenu_content' );


?>

Then in my posts I have:

然后在我的帖子中,我有:

[gabsubmenu id=93]

[gabsubmenu id=93]

Where id is the id of the parent page.

其中 id 是父页面的 id。

回答by yogesh kumar Panchal

Custom Menu and its Submenus

自定义菜单及其子菜单

function thewebpixel_header_menu(){ ?>
<a href="#" id="mobile-menu-trigger"> <i class="fa fa-bars"></i> </a>
<ul class="sf-menu fixed" id="menu">
    <?php
        $args = array(
        'order'                  => 'ASC',
        'orderby'                => 'menu_order',
        'post_type'              => 'nav_menu_item',
        'post_status'            => 'publish',
        'output'                 => ARRAY_A,
        'output_key'             => 'menu_order',
        'nopaging'               => true,
        'update_post_term_cache' => false );

        $items = wp_get_nav_menu_items( 'main', $args );
        $parents = array();
        foreach($items as $item )
          $parents[] = $item->menu_item_parent;

        function check_has_child($parents, $menu_id){

            if(in_array($menu_id, $parents))                     
              return "YES";
        else
          return "NO";  
         }       

        $flag = 0;
        $count = 0;
        foreach($items as $item ) { ?>
    <?php if( !$item->menu_item_parent ){ 
        if($count != 0 && $count != 5 && $flag == 2){ 
              echo '</ul></div></div></li>';
              $count=0; 
              $flag=0;
              }  

          if(check_has_child($parents, $item->ID ) == "YES")
          {
            $liclass = '';
            $aclass = 'class="sf-with-ul"';                 
          }else{

            $liclass = 'dropdown';
            $aclass = '';            
            }          
          ?> 
    <li class="<?php echo $liclass; ?>"><a <?php echo $aclass; ?> href="<?php echo $item->url;?>"><span><?php echo
        $item->title;?></span></a>
        <?php } ?>   
        <?php  if( $item->menu_item_parent){ if($flag != 2)$flag = 1;  ?>
        <?php if($flag == 1) {                                 
            $flag = 2;
            echo '<div class="sf-mega">';
             } 

            if($count == 0 ){
            echo '<div class="sf-mega-section"><ul>';
            }
            $count++;
            ?>                                                
    <li><a href="<?php echo $item->url; ?>">
        <i class="fa fa-angle-right"></i>
        <?php echo $item->title; ?>
        </a>
    </li>
    <?php
        if($count == 5){
          echo '</ul></div>';
          $count=0;
        }

        } ?>    
    <?php if( !$item->menu_item_parent && check_has_child($parents, $item->ID ) == "NO" ){ ?></li> <?php } ?>
    <?php }  ?>
</ul>
<?php } ?>

Find more information and examples at https://developer.wordpress.org/reference/functions/wp_get_nav_menu_items/.

https://developer.wordpress.org/reference/functions/wp_get_nav_menu_items/查找更多信息和示例。