Cambiar URL de elementos del menú

12 mar 2014, 17:47:04
Vistas: 18.1K
Votos: 2

Estoy creando un sitio web de una sola página y solo uso anclas (#) en los elementos del menú principal.

Ahora, necesito incluir una segunda página en el sitio web y mantener el mismo menú.

Estoy usando el tema roots. Luego, estoy construyendo el menú usando:

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

¿Pero cómo cambiar las URLs de los elementos de, por ejemplo, #contact a mywebsite.com.br/#contact solo en esta segunda página?

2
Comentarios

Por favor muestra algo de código. ¿Cómo estás construyendo tus enlaces? ¿Manualmente? ¿Usando una función personalizada? ¿Usando wp_nav_menu?

gdaniel gdaniel
12 mar 2014 17:54:45

Primero, estoy usando el tema roots. Luego, estoy construyendo el menú usando wp_nav_menu(array('theme_location' => 'primary_navigation'));

marcelo2605 marcelo2605
12 mar 2014 17:56:33
Todas las respuestas a la pregunta 3
3

En tu plantilla puedes verificar si estás en la página de inicio o no y luego mostrar un menú diferente.

Por ejemplo:

if(is_front_page() || is_home()){

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

}else{

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

}

También tendrías que registrar una segunda ubicación de menú en el archivo functions.php (si no se ha hecho todavía).

Para registrar una nueva ubicación de menú:

function register_my_menus() {

    register_nav_menus(array( 
        'secondary-location' => __('Ubicación Secundaria'),
    ));

}

add_action( 'init', 'register_my_menus' );

La desventaja es que tendrías que administrar dos menús en el backend. Eso podría ser un problema si el menú cambia con frecuencia, porque tendrías que actualizar dos menús.

En su lugar, podrías filtrar el wp_nav_menu y alterar la URL antes de que se imprima el menú. Por ejemplo, esto iría en functions.php

function change_menu($items){

if(!is_front_page()){

  foreach($items as $item){


    $item->url = get_bloginfo("url") . "/" .  $item->url;


  }

}

  return $items;

}

add_filter('wp_nav_menu_objects', 'change_menu');

El código anterior filtra el wp_nav_menu_object. Agrega la URL completa si no estás en la página de inicio del sitio web. De lo contrario, simplemente devuelve el menú regular. Usando este método no tendrías que crear un segundo menú en el administrador.

12 mar 2014 18:05:18
Comentarios

Gracias. Entonces, ¿usando wp_nav_menu no puedo agregar una cadena a la URL?

marcelo2605 marcelo2605
12 mar 2014 18:41:38

Acabo de actualizar mi respuesta. Puedes usar un filtro para modificar la URL antes de que se imprima.

gdaniel gdaniel
12 mar 2014 18:43:17

Eso es tan útil, incluso para mis necesidades completamente diferentes, ¡gracias @gdaniel!

physalis physalis
25 nov 2014 00:27:42
0

Si tu menú contiene enlaces personalizados tipo ancla Y enlaces a páginas (por ejemplo, a esa segunda página, inicio, aviso legal o lo que sea) la función change_menu de gdaniels romperá esos enlaces a páginas cuando no estés en la página de inicio. Ese es el problema que boywonder estaba experimentando, ya que la función 'change_menu' antepone la URL del sitio a todos los enlaces del menú. Pero con la función 'lb_menu_anchors' de boywonder terminarás con recargas de página en la portada al cambiar entre enlaces ancla. Para evitar esto, lb_menu_anchors solo debe ejecutarse cuando la página actual no sea la página de inicio:

function lb_menu_anchors($items, $args) {
// ¿La página actual NO es la portada?
  if(!is_front_page()){
    // recorrer los objetos del menú (los enlaces)
    foreach ($items as $key => $item) {
        // comprobar si el enlace empieza por '#'
        if ($item->object == 'custom' && substr($item->url, 0, 1) == '#') {
            // si es así, anteponer site_url al enlace
            $item->url = site_url() . $item->url ;
        }
    }
    // devolver enlaces editados
    return $items;
  }
  else {
    // devolver enlaces sin editar si la página actual ES la portada
    return $items;
  }
  }

add_filter('wp_nav_menu_objects', 'lb_menu_anchors', 10, 2);

Gracias por todos vuestros comentarios

6 mar 2018 16:25:02
0

Había estado usando una versión modificada de la solución de gdaniel, pero recientemente me encontré con un problema donde, al usar enlaces personalizados en el menú para apuntar a enlaces externos, la URL del sitio se anteponía al enlace externo.

El código a continuación debería funcionar si necesitas modificar enlaces de anclaje y no modificar enlaces externos.

function lb_menu_anchors($items, $args) {
    foreach ($items as $key => $item) {
        if ($item->object == 'custom' && substr($item->url, 0, 1) == '#') {
            $item->url = site_url() . $item->url;
        }
    }

    return $items;
}
add_filter('wp_nav_menu_objects', 'lb_menu_anchors', 10, 2);

Todo el crédito va para laubsterboy y faye: https://laubsterboy.com/blog/2014/09/wordpress-menu-anchor/ https://laubsterboy.com/blog/2014/09/wordpress-menu-anchor/#comment-35170

1 jun 2017 12:00:33