Mostrar solo el padre actual y su submenú – wordpress

10 minutos de lectura

avatar de usuario
varun

Tengo una navegación principal y todos los padres tienen hijos. P.ej:

Page A: About Us
child1
child2

Page B : Our services
Child 3
Child 4

Necesito incluir un submenú horizontal en una página. Pero mi problema es que, si actualmente estamos en la página A, todos los elementos secundarios de la página A solo se mostrarán en la página. Si estamos en la página A, debería verse así:

Page A
Child 1
Child 2

Así, cuando vamos a la página B, solo se muestra el elemento secundario de la página 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);

Intenté escribir el código anterior, lo que resultó en todos los elementos principales con sus hijos.

¿Alguien me puede ayudar en esto?

En breve, Quiero obtener todos los niños (submenú) de Sobre nosotros entrada de menú. (es decir, quiero child1 & child2 como una lista con <a> etiquetas)

  • Sí, te ayudaremos si nos muestras algún código que hayas probado.

    – M Khalid Junaid

    18/09/2013 a las 14:52

avatar de usuario
Atif Tariq

Por favor escribe este código en functions.php del tema

<?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;
}
}

Luego, puede mostrarlo en su tema usando wp_nav_menu (como lo haría normalmente), pero también pasando un indicador de sub_menu para activar la función personalizada de sub_menu:

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

  • Le puse un poco de sangría a tu código para facilitar la lectura. Sería bueno si explicara el valor de retorno (¿nuevo?) Cuando el indicador sub_menu se pasa a wp_nav_menu .

    – Félix

    18 de enero de 2017 a las 21:12

  • Por favor, no robe código sin hacer referencia al autor original. christianvarga.com/…

    – BugHunterUK

    21 de junio de 2020 a las 0:45

Cuando en una página primero obtiene todas las páginas, luego puede obtener la ID de la página actual, obtener los elementos secundarios en una matriz y recorrer esta matriz de esta manera:

<?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
    }
?>

EDITAR: Esto no tiene nada que ver con los menús estructurados que creas en el backend, tiene que ver con crear una página secundaria de otra página directamente en la sección de edición de la página.

Esto lo está haciendo todo

<?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; ?>

Gracias por todas las soluciones!

Escribí una función para ayudar con esto, ya que la mayoría de los ejemplos que encontré incluyen los hijos de la página, pero no el padre en sí. Simplemente agregue esta función a su functions.php expediente:

<?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>';
}

Luego, para usarlo en una página, simplemente llámalo así:

<?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() ?>

avatar de usuario
Nagendra Rao

Lo primero que debe hacer es hacer que sus páginas ‘child1’ ‘child2’ sean páginas secundarias de la página ‘Acerca de nosotros’.

Haga clic aquí para obtener más información sobre la creación de subpáginas.

Una vez que tenga las páginas estructuradas, puede usar esta función, (enlace a documentos)

<?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' 
); ?>

Lo mismo ocurre con su página “Nuestros servicios”. Espero que esto resuelva su problema. ¡Háganos saber si tiene algún problema y bienvenido a stackoverflow!

  • De forma predeterminada, wp_list_pages muestra todas las páginas y subpáginas. Pero solo necesito subpáginas. Por lo tanto, title_li debe contener los títulos de hijos de su padre. Entonces, primero necesito recuperar las identificaciones de los padres actuales. Se agregó un código que hace todo esto. El problema está resuelto ahora. Gracias por la ayuda y una cálida bienvenida.

    – varun

    19 de septiembre de 2013 a las 6:19

avatar de usuario
gabriel klein

Una solución rápida y “sucia”.

He creado el siguiente archivo…/wp-content/plugins/gabriel-submenu.php

Con este contenido:

<?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' );


?>

Luego en mis publicaciones tengo:

[gabsubmenu id=93]

Donde id es el id de la página principal.

  • De forma predeterminada, wp_list_pages muestra todas las páginas y subpáginas. Pero solo necesito subpáginas. Por lo tanto, title_li debe contener los títulos de hijos de su padre. Entonces, primero necesito recuperar las identificaciones de los padres actuales. Se agregó un código que hace todo esto. El problema está resuelto ahora. Gracias por la ayuda y una cálida bienvenida.

    – varun

    19 de septiembre de 2013 a las 6:19

avatar de usuario
Félix

Menú personalizado y sus submenús

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 } ?>

Encuentre más información y ejemplos en https://developer.wordpress.org/reference/functions/wp_get_nav_menu_items/ .

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad