Mostrar solo el padre actual y su submenú – wordpress
⏰ 10 minutos de lectura
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.
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
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:
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.
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() ?>
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’.
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
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.
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
Sí, te ayudaremos si nos muestras algún código que hayas probado.
– M Khalid Junaid
18/09/2013 a las 14:52