Soporte » WordPress Avanzado » Condicional para publicar un enlace en un menú determinado

  • Hola compañer@s WordPresseros.

    Hace poco desarrollando un sitio me encontré una función bastante sencilla que publica el típico enlace en el menú dando la bienvenida al usuario. Como el que podemos ver en la barra de herramientas de WordPress.
    El problema es que la función publica el enlace en todos los menús de la web.
    Haciendo una chapucilla para salir del paso oculté con CSS los que no quería que se viesen.
    Os dejo la función en custión.

    add_action( 'wp_nav_menu_items', 'my_custom_menu_item');
    function my_custom_menu_item($items) {
        if ( is_user_logged_in() ) {
            $user=wp_get_current_user();
            $name=$user->display_name;
            $items .= '<li id="menu-item-zzz" class="logged-in right menu-item menu-item-type-post_type"><a href="https://celebrando.es/cuenta/"><strong>Hola, '.$name.'</strong></a></li>';
        }
        return $items;
    }

    Alguna idea de como publicarla sólo en el menú que yo quiera. En concreto es el secundario (secondary).

    Gracias mil por vuestro tiempo!

    La página con la que necesito ayuda: [accede para ver el enlace]

Viendo 7 respuestas - 1 de 7 (de 7 total)
  • Si añades el segundo parámetro de la función, ahí puedes acceder a la información del menú que se esté tratando y tomar la decisión oportuna.

    Por ejemplo (no probado, solo puesto aquí como ejemplo):

    add_action( 'wp_nav_menu_items', 'my_custom_menu_item', 10, 2 );
    function my_custom_menu_item( $items, $args ) {
    
        if ( is_user_logged_in() && $args->theme_location == 'secondary' ) {
    
            $user=wp_get_current_user();
    
            $name=$user->display_name;
    
            $items .= '<li id="menu-item-zzz" class="logged-in right menu-item menu-item-type-post_type"><a href="https://celebrando.es/cuenta/"><strong>Hola, '.$name.'</strong></a></li>';
    
        }
    
        return $items;
    
    }

    En $args puedes encontrar la misma información que se pasa a wp_nav_menu().

    De lujo! Lo he probado en una web de pruebas y ha ido a la primera con el tema Genesis Sample.
    Pero en la web original, que usa otro Child Theme de Genesis, no funciona. ¿Puede ser por que hayan renombrado el menú? Si es así, ¿como puedo averiguar que slug o que nombre tiene el menú secundario?

    Gracias de nuevo

    En el código anterior, la variable $args contiene todos los datos referentes al menú, ahí lo puedes ver todo. Puedes hacer el típico var_dump( $args ) y ver pantalla todos los valores que contiene.

    O ir a los archivos del theme y buscar donde registra los menus a ver que nombre les da.

    Se me ocurre más opciones, pero con esas creo que te pueden ser suficientes, si no, dinos a ver.

    He encontrado esto en el functions.php, pero no creo que sea a lo que te refieres.
    add_theme_support ( 'genesis-menus', array ( 'secondary' => __( 'Before Header Menu', 'workstation-pro' ), 'primary' => __( 'Header Menu', 'workstation-pro' ) ) );
    Dado que es un child theme de Genesis no hay mucho mas del functions.php y alguno para los estilos por defecto y el customizador. Así que los registros de menús se harán en el tema padre. Y en este los nombra como Primary y Secondary.

    No sé hacer el var_dump( $args ) estoy aprendiendo en esto de la programación a base de pegarme con las cosas y no voy muy fino. Lo siento.

    Entonces a ver que otra opción se me ocurre … ¿sabrías como mirar el código HTML del checkbox donde asignas el menú a una localización/posición del theme? Hay también se puede ver.

    De todas formas, con el código que has puesto deduzco que las posiciones del menú son secondary o primary, no se me ocurre por qué no te funciona en el child theme pero si en el theme normal.

    Si vas a «Apariencia->Menús», seleccionas un menú que quieres editar, y pulsas en el botón «Elegir», la URL en el navegador debe ser algo así:

    wp-admin/nav-menus.php?action=edit&menu=XXX

    Fíjate en XXXy puedes hacer algo así:

    add_action( 'wp_nav_menu_items', 'my_custom_menu_item', 10, 2 );
    function my_custom_menu_item( $items, $args ) {
    
        if ( is_user_logged_in() && $args->menu->term_id == XXX ) {
    
            $user=wp_get_current_user();
    
            $name=$user->display_name;
    
            $items .= '<li id="menu-item-zzz" class="logged-in right menu-item menu-item-type-post_type"><a href="https://celebrando.es/cuenta/"><strong>Hola, '.$name.'</strong></a></li>';
    
        }
    
        return $items;
    
    }

    A ver si te vale esta opción.

    He creado una web de pruebas y funcionan las dos opciones que me has dado a la perfección. Tiene que ser algo del tema. En cuandto pongo el segundo condicional no muestra nada. He rebisado el código HTML y ni si quiera está.

    Gracias por tu colaboración, pero no se que es. Intentaré investigar el tema, pero no tiene mucho. Es un tema sencillo de la gente de StudioPress.

    De nuevo Gracias!

Viendo 7 respuestas - 1 de 7 (de 7 total)
  • El debate ‘Condicional para publicar un enlace en un menú determinado’ está cerrado a nuevas respuestas.