Cómo verificar si existe un menú en WordPress

8 oct 2013, 19:26:51
Vistas: 16.2K
Votos: 5

Actualmente estoy recuperando un menú de navegación basado en el título de la página padre, y si la página no tiene padre, uso su propio título.

global $post;
$page_title;

if ($post->post_parent) {
    $page_title = get_the_title($post->post_parent);
}  else {
    $page_title = get_the_title($post);
}

$sidebar_title = 'Sidebar - '.$page_title;
wp_nav_menu(array( 'menu' => $sidebar_title));

En lugar de verificar primero si existe un padre, me gustaría comprobar primero si una página tiene su propio menú único. Esto es lo que escribí pero no funciona:

global $post;
$page_title = get_the_title($post);
$sidebar_title = 'Sidebar - '.$page_title;

if ( !wp_nav_menu(array( 'menu' => $sidebar_title, 'echo' => false )) ) {

    $page_title = get_the_title($post->post_parent);
    $sidebar_title = 'Sidebar - '.$page_title;
}

wp_nav_menu(array( 'menu' => $sidebar_title ));

Resumen: ¿Cómo puedo verificar si existe un menú?

8
Comentarios

Por favor edita tu pregunta para agregar el código donde registras tus barras laterales dinámicas.

Chip Bennett Chip Bennett
8 oct 2013 19:37:13

No registré esto como una barra lateral dinámica. ¿Necesito hacerlo? Solo he estado nombrando mis archivos de barra lateral como sidebar-nombre.php y luego usando get_sidebar('nombre') cuando es necesario.

justlemons justlemons
8 oct 2013 20:13:03

Vale, ¿qué quieres decir cuando usas el término barra lateral? Puede significar al menos 3 cosas: 1) una barra lateral de contenido (HTML), 2) un área con widgets (dynamic_sidebar()), o 3) un archivo de parte de plantilla (get_sidebar()/sidebar.php).

Chip Bennett Chip Bennett
8 oct 2013 20:16:22

Disculpa la confusión. Me refería a un archivo template-part.

justlemons justlemons
8 oct 2013 20:19:16

Oh vaya, ahora me doy cuenta de lo confuso que fue. Estoy trabajando con los menús de navegación de WordPress. Simplemente resulta que lo estoy colocando en una barra lateral.

justlemons justlemons
8 oct 2013 20:25:20

De acuerdo, ahora ¿puedes compartir tu código de register_nav_menus()?

Chip Bennett Chip Bennett
8 oct 2013 20:38:35

Tampoco estoy usando esto. Solo estoy usando wp_nav_menu() y get_sidebar() en mis archivos de plantilla. Por ejemplo, el código que mencioné en mi publicación proviene de un archivo llamado sidebar-nav.php. Uso este sidebar en una plantilla de página personalizada usando get_sidebar('nav').

justlemons justlemons
8 oct 2013 20:53:57

Si no registras ubicaciones de menú en el Theme, entonces no estás usando wp_nav_menu() correctamente, y probablemente no podrás resolver esta pregunta. Por favor revisa el Codex para wp_nav_menu() y register_nav_menus().

Chip Bennett Chip Bennett
8 oct 2013 20:56:22
Mostrar los 3 comentarios restantes
Todas las respuestas a la pregunta 2
6
10

Asumiendo que tienes menús de navegación personalizados implementados correctamente:

  1. Registrar ubicaciones de menú en el tema:

    register_nav_menus( array(
        'parent_page' => "Página Principal",
        'page_a' => "Página A",
        'page_b' => "Página B", //etc
    ) );
    
  2. Llamar a wp_nav_menu() correctamente:

    wp_nav_menu( array(
        'theme_location' => 'page_a'
    );
    

...entonces puedes usar el condicional has_nav_menu() para determinar si una Ubicación de Tema tiene un menú asignado:

if ( has_nav_menu( 'page_a' ) ) {
    // hacer algo
}

En tu caso específico, podrías hacer algo como esto:

if ( has_nav_menu( 'page_a' ) ) {
    wp_nav_menu( array( 'theme_location' => 'page_a' ) );
} else {
    wp_nav_menu( array( 'theme_location' => 'parent_page' ) );
}
8 oct 2013 21:00:59
Comentarios

Gracias por tu respuesta. Este es el primer sitio web que he desarrollado usando Wordpress, y no estaba al tanto de la necesidad de registrar mis menús de navegación. Leí el material que sugeriste. Aún así, pude resolver mi problema sin registrarlos. Creo que funciona para mis propósitos ya que mi cliente no necesitará la capacidad de gestionar las ubicaciones de los menús de navegación.

Si crees que esto me causará problemas en el futuro, por favor házmelo saber.

justlemons justlemons
9 oct 2013 00:19:06

"mi cliente no necesitará la capacidad de gestionar las ubicaciones de los menús de navegación" - entonces ¿por qué tener menús de navegación en absoluto? (No: en serio.) ¿Por qué no simplemente usar wp_list_pages() o wp_page_menu()? Porque si el usuario no está definiendo menús de navegación, entonces literalmente no hay ninguna razón para usar wp_nav_menu().

Chip Bennett Chip Bennett
9 oct 2013 00:21:59

También: estoy confundido por el título de tu pregunta: ¿cómo saber si un menú existe?. Si el usuario no está definiendo menús, ¿cómo van a existir menús nunca? Sospecho que hay algo más, más profundo, que realmente estás tratando de lograr - y sospecho que probablemente haya una forma más fácil que la forma en que lo estás abordando actualmente. :)

Chip Bennett Chip Bennett
9 oct 2013 00:23:47

Aunque mi cliente no administrará la ubicación de los menús, aún tendrá la capacidad de agregar nuevos elementos a esos menús si así lo desea.

justlemons justlemons
9 oct 2013 00:25:37

Tengo varias páginas en el sitio y cada página principal tiene un menú de navegación único. Algunas páginas secundarias también tienen menús de navegación únicos, pero no todas. Para aquellas páginas secundarias que no tienen menús de navegación únicos, quiero que utilicen el menú de navegación de su página principal. Entonces, lo que estoy verificando es si el menú de navegación único existe para poder mostrarlo, y si la página no tiene un menú de navegación único, entonces quiero mostrar el menú de navegación de su página principal.

justlemons justlemons
9 oct 2013 00:35:19

Todavía creo que hay una manera más fácil de manejar lo que estás tratando de hacer. Si quieres entrar al chat, probablemente podríamos resolverlo...

Chip Bennett Chip Bennett
9 oct 2013 00:56:03
Mostrar los 1 comentarios restantes
0

Creo que estoy haciendo algo similar al OP: permitir que mi cliente (usuario administrador de WP) cree Menús (en WP-Admin > Apariencia > Menús), los cuales NO están asignados a una ubicación específica del tema, porque eso requeriría una relación estática/uno a uno.

En cambio, estos Menús se muestran dinámicamente (a través de un widget personalizado), basándose en el nombre del ancestro superior de la página actual. Si ese nombre coincide con el nombre de un Menú existente, se muestra el Menú (envuelto por el HTML estándar before/after del widget). Pero, si NO hay coincidencia, no se muestra nada.

Así que necesitaba verificar si el Menú existe, antes de comenzar la salida del widget.

$args = array(
    'menu' => $menu_name, // del ancestro superior de la página actual
    'echo' => 0,  // true o 0
    'theme_location' => '__fake', // valor falso, para evitar mostrar el primer menú real
    'fallback_cb' => false  // evitar mostrar el primer menú real
);
$menu = wp_nav_menu( $args );
if ($menu){ 
    # salida
    echo $before_widget; // Before
    echo $before_title . $title . $after_title; // Title
    echo $menu;  
    echo $after_widget; // After
}
8 dic 2015 05:58:27