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


16

Parte de mi trabajo es crear sitios web de Wordpress. Por lo general, trabajo en mi computadora portátil hasta que tengo algo lo suficientemente bueno como para cargarlo en el servidor de prueba donde el cliente lo revisa.

Creo un VirtualHost para cada nuevo proyecto, por lo 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í http://testserver.com/arbitrary/path/example/.

El problema es que si agrego un enlace personalizado a un menú que apunta, 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á http://testserver/events/, lo que obviamente no es correcto.
Lo que quiero es darle al enlace personalizado una URL que funcione tanto en mi entorno local como en el servidor de prueba.

Ya manejar el problema de cambiar el homey siteurlopciones de Wordpress por:

  • cambiar esa configuración en la base de datos local
  • creando un volcado de la base de datos
  • actualizar la base de datos en el servidor
  • Restaurando las opciones locales.

No quiero usar 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 los enlaces dentro del contenido de la publicación, hay un complemento que resuelve el problema agregando dos códigos cortos: http://wordpress.org/extend/plugins/url-shortcodes/ , pero no he podido encontrar algo similar para los enlaces personalizados .


55
Willington, no puedo ayudarte a una url que funciona en cualquier lugar. Lo que puedo hacer es señalarle spectacu.la/search-and-replace-for-wordpress-databases . He estado usando la búsqueda y reemplazo de David durante bastante tiempo y funciona bien para cambiar, por ejemplo, las URL, incluso cuando se encuentran en datos serializados. Así es como lo hago: solo enlaces codificados y convertir después de mover la base de datos a otro dominio. Buena suerte, Peter
Peter

Hasta ahora, la única forma en que he encontrado que me muevo con éxito de un entorno de desarrollo a un entorno en vivo es después de hacer el volcado de SQL para hacer una búsqueda y reemplazar todo el archivo, no solo cambiar las opciones de inicio y siteurl. He tenido archivos donde la URL estaba allí más de 1000 veces. (todavía no sé cómo logró llegar tan alto :))
Rob Williams

@ Peter, @ Rob gracias a todos por responder, tenía miedo de que buscar y reemplazar fuera la única solución, pero quería preguntar primero. Echaré un vistazo a ese guión.
Willington Vega

Lo mejor es usar un script como el que sugerí. Tenga en cuenta que una búsqueda y reemplazo de texto en un volcado de db arruinará los datos serializados (especialmente encontrados en wp_options) si y cuando la longitud de las cadenas de búsqueda y reemplazo no es la misma, ya que esos datos se almacenan en el db con una especificación de longitud . Éxito, Peter
Peter

Respuestas:


9

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

Esto es lo que necesita colocar en el campo URL:

/index.php/internal-site-name

ingrese la descripción de la imagen aquí

¡Funciona bien!

Saludos cordiales Chris


1
Esto funciona pero también cambia la url para incluir index.php. En el caso de una aplicación de una sola página con # enlaces, primero actualizará la página y luego lo llevará al destino (solo la primera vez). Aun así, una buena idea
Catalin Deaconescu

Usé

4

Puede usar el nav_menu_link_attributesfiltro para inspeccionar y modificar el atributo href para cada elemento del menú antes de que salga.

En este ejemplo, buscamos cualquier atributo href que comience con a /, 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 esté presente el entorno del sitio de prueba.


¡Esa es la mejor manera que encontré! Pero, por favor, @Milo, cambie la tercera línea con esta url base de wordpress más inteligente (obtenga el sitio_url de wordpress): $ atts ['href'] = site_url (). $ atts ['href'];
gtamborero

2

El uso de la <base href=" ">etiqueta en el meta del encabezado dará una URL base a todos los anclajes relativos en la página.

Referencia:
https://www.w3.org/TR/html4/struct/links.html
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 al tema / header.php dentro de <head>:

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

Sé que podría llegar tarde pero podría ayudar a alguien más.


Parece prometedor. Lo probaré e informaré.
Eric Hepperle - CodeSlayer2010

No funciona con rutas como a ehepperle.com/sites/in-progress/some-wp-site-root/menos que establezca explícitamente la raíz del sitio. La velocidad de desarrollo web no mejora notablemente con la baseetiqueta, ya que cuando migra a otro sitio, tendrá que redefinir qué base es. Sin embargo, puedo ver el valor en la reducción de la longitud de los valores href.
Eric Hepperle - CodeSlayer2010

La idea es buena, pero parece que Wordpress ignora la ruta base cuando usa rutas relativas en los menús personalizados de wp (por ejemplo: / contact)
gtamborero

1

En una URL personalizada en la configuración del menú, es posible utilizar enlaces relativos a [blogurl]. El secreto es comenzar la URL relativa con un solo /. Cuando un único / inicia la URL personalizada, el sistema no antepondrá el típico http://y luego el blogURL actual se generará en la URL de destino en el momento de la ejecución.

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

Si desea ir a la página de índice en la carpeta bbforums, colóquela /bbforumscomo 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 está http://example.comy quiero probarlo en un subdominio, http://test.example.comel sitio se puede mover entre prueba y producción sin problemas de menú utilizando la convención de URL relativa mencionada anteriormente. He probado con éxito este enfoque utilizando el complemento XCloner para mover el sitio.


66
Esto no funciona para las URL de blog que tienen barras diagonales, por ejemplo example.com/blog . Seguir el elemento del menú '/' lo llevaría a example.com .
Jimpanzee

1

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

Agregue este código a su functions.phparchivo 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 debe llamar a la wp_nav_menufunción 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. Luego vaya a la sección del menú de fondo.

Por ejemplo, si quiero dar 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 funcione.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.