Cómo agregar un enlace personalizado a un menú con una URL que sea relativa a la URL del blog

11

Parte de mi trabajo es crear sitios web de Wordpress. Normalmente trabajo en mi computadora portátil hasta que tenga algo lo suficientemente bueno como para ser cargado en el servidor de prueba donde el cliente lo revisa.

Creo un VirtualHost para cada nuevo proyecto, así que siempre estoy trabajando con una instalación de Wordpress en un dominio que parece http://local.example.com/ , pero cuando el sitio se carga en el servidor de prueba (no controlado por mí), el dominio Puede terminar siendo algo así como http://testserver.com/arbitrary/path/example/ .

El problema es que si agrego un enlace personalizado a un menú que apunta a, por ejemplo, /events/ , funcionaría bien localmente creando un enlace a http://local.example.com/events/ , pero en el servidor de prueba, el enlace apuntará a http://testserver/events/ , que obviamente no es correcto.
Lo que quiero es proporcionarle al enlace personalizado una URL que funcione tanto en mi entorno local como en el servidor de prueba.

Ya manejo el problema de cambiar las opciones home y siteurl Wordpress de la siguiente manera:

  • cambiando esas configuraciones en la base de datos local
  • creando un volcado de la base de datos
  • actualizar la base de datos en el servidor
  • restaurar las opciones locales.

No quiero usar las URL completas para los enlaces personalizados y tener que reemplazarlas con la URL del servidor cada vez que necesito actualizar la base de datos del servidor.

Para enlaces dentro del contenido de la publicación, hay un complemento que soluciona el problema al agregar dos códigos cortos: enlace , pero no he podido encontrar algo similar para los enlaces personalizados.

    
pregunta Willington Vega 11.03.2011 - 21:45

5 respuestas

7

También estaba buscando una solución para esto y encontré una sencilla.

Esto es lo que necesitas colocar en el campo de URL:

/index.php/internal-site-name

¡Funciona bien!

Saludos cordiales Chris

    
respondido por el Christian Hatz 02.09.2016 - 20:54
2

El uso de la etiqueta <base href=" "> en el meta de cabecera dará una url básica a todos los anclajes relativos en la página.

Referencia:
enlace
12.4 Información de ruta: el elemento BASE

Enlaces personalizados relativos en wordpress:
Si desea que la URL del sitio sea la URL base de todos los anclajes, agregue esto a theme / header.php dentro de <head> :

<base href="<?php echo site_url(); ?>/">

Sé que podría llegar tarde para ti, pero podría ayudar a otra persona.

    
respondido por el David Pacheco 03.05.2017 - 17:59
1

En una URL personalizada en la configuración del Menú es posible usar enlaces relativos a [blogurl]. El secreto es iniciar la URL relativa con un solo / . Cuando una / inicia la URL personalizada, el sistema no antepone el típico http:// y luego se genera el blogURL actual en la URL de destino en el momento de la ejecución.

EJEMPLO
Si desea ir a su página de inicio, simplemente coloque / como la URL personalizada

Si desea ir a la página de índice en la carpeta bbforums , coloque /bbforums como la URL personalizada.

Esto le permite mover un sitio a un dominio de prueba sin tener que codificar el nuevo blogURL en todos los enlaces personalizados para los menús.

Por ejemplo:
Si mi blog es http://example.com y quiero probarlo en un subdominio http://test.example.com , el sitio se puede mover entre la prueba y la producción sin problemas de menú usando la convención de URL relativa mencionada anteriormente. He probado con éxito este enfoque utilizando el complemento XCloner para mover el sitio.

    
respondido por el user41251 02.11.2013 - 03:44
1

Primero debe instalar este complemento para los códigos cortos de URL.

Agregue este código a su archivo functions.php en su tema:

class description_walker extends Walker_Nav_Menu {
    function start_el( &$output, $item, $depth, $args ) {
        global $wp_query;
        $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

        $class_names = $value = '';

        $classes = empty( $item->classes ) ? array() : (array) $item->classes;

        $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
        $class_names = ' class="'. esc_attr( $class_names ) . '"';

        $output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $class_names .'>';

        $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) . '"' : '';
        $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) . '"' : '';
        $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) . '"' : '';

        // echo $item->url;
        $string = explode( '::', $item->url, 3 );
        if ( $string[1] ) {
            $string[1] = str_replace( '-', ' ', $string[1] );
            $item->url = do_shortcode( "[$string[1]]" ); 
        }

        $attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';

        $prepend = '<strong>';
        $append = '</strong>';
        $description  = ! empty( $item->description ) ? '<span>' . esc_attr( $item->description ) . '</span>' : '';

        if ( $depth != 0 ) {
            $description = $append = $prepend = "";
        }

        $item_output  = $args->before;
        $item_output .= '<a'. $attributes . '>';
        $item_output .= $args->link_before . $prepend . apply_filters( 'the_title', $item->title, $item->ID ) . $append;
        $item_output .= $description . $args->link_after;
        $item_output .= '</a>';
        $item_output .= $args->after;

        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
    } 
}

Luego debes llamar a la función wp_nav_menu desde los archivos de plantillas:

$arg = array( 
    'menu'        => "main-menu", 
    'echo'        => true, 
    'fallback_cb' => 'wp_page_menu', 
    'depth'       => 0, 
    'walker'      => new description_walker() 
); 
wp_nav_menu( $arg );

Eso es todo. Luego vaya a la sección de menú de fondo.

Por ejemplo, si quiero asignar la URL de la página a un enlace personalizado, lo agregaré así:

http://::blogurl-id='1302'::

Ahora puede ir al front-end y verificar que el shortcode funciona.

    
respondido por el Manimaran 16.03.2012 - 14:57
0

Puede usar el filtro nav_menu_link_attributes para inspeccionar y modificar el atributo href para cada elemento del menú antes de que se genere.

En este ejemplo, buscamos cualquier atributo href que comience con un / , y anteponemos la URL del sitio de prueba en ese caso:

function wpd_nav_menu_link_atts( $atts, $item, $args, $depth ){
    if( '/' == substr( $atts['href'], 0, 1 ) ){
        $atts['href'] = 'http://testserver.com/example' . $atts['href'];
    }
    return $atts;
}
add_filter( 'nav_menu_link_attributes', 'wpd_nav_menu_link_atts', 20, 4 );

Puede crear un complemento simple con este código y activarlo solo en su servidor de prueba, o crear algún tipo de indicador que aplique condicionalmente este filtro cuando el entorno del sitio de prueba esté presente.

    
respondido por el Milo 03.05.2017 - 18:44

Lea otras preguntas en las etiquetas