Cómo obtener URLs amigables con add_query_arg en los enlaces permanentes

20 dic 2013, 10:55:20
Vistas: 18K
Votos: 10

Con add_query_arg() es fácil añadir parámetros adicionales a una URL y también es sencillo crear una regla de reescritura. Hasta aquí todo bien. Pero el problema es el reemplazo de URL que hace WordPress.

Cuando tengo una URL como:

www.misitio.com/?page_id=1&myvar=test

y escribo esta URL en la barra de direcciones del navegador con los enlaces permanentes activados. Este enlace se convertirá en:

www.ejemplo.com/nombredepagina/?myvar=test

PERO: lo que me gustaría obtener es:

www.ejemplo.com/nombredepagina/test

Finalmente, me gustaría usar código como:

<a href="<?php add_query_arg( 'myvar', 'test', get_permalink() ) ?>"> .... </a>

que resultaría en:

www.ejemplo.com/nombredepagina/test

¿Cómo se puede lograr esto? He pasado horas leyendo documentación y no he podido encontrar una solución.

1
Comentarios

Me gustaría saber cómo se hace esto. +1 a la pregunta.

henrywright henrywright
27 dic 2013 23:04:20
Todas las respuestas a la pregunta 3
0

Acabo de enfrentarme a la misma situación y me encontré con esta pregunta mientras buscaba en Google.

Parece que esto no es posible. El núcleo de WordPress simplemente añade cadenas a la URL si los enlaces permanentes bonitos están habilitados, mira https://core.trac.wordpress.org/browser/tags/3.9.1/src/wp-includes/link-template.php#L571

Para cualquiera interesado en esto: Puedes hacer algo como esto en tu código:

if ( '' != get_option('permalink_structure') ) {
    // usando enlaces permanentes bonitos, añadir a la URL
    $read = user_trailingslashit( get_permalink() . 'test' ); // www.ejemplo.com/nombredepagina/test
  } else {
    $read = add_query_arg( 'test', '', get_permalink() ); // www.ejemplo.com/nombredepagina/?test
  }

Esta solución también fue recomendada por Jon Cave en un comentario en el blog oficial de make: https://make.wordpress.org/plugins/2012/06/07/rewrite-endpoints-api/#comment-686

10 jul 2014 20:14:30
1

La solución en Wordpress sería añadir reglas de reescritura para conseguir algo como esto:

    add_action( 'init', 'my_rewrite_add_rewrites' );
    function my_rewrite_add_rewrites()
    {
        add_rewrite_rule( 'calendar/([0-9]{4})/?$', 'index.php?post_type=events&year=$matches[1]', 'top' );
        add_rewrite_rule( 'calendar/([0-9]{4})/page/?([0-9]{1,})/?$', 'index.php?post_type=events&year=$matches[1]&paged=$matches[2]', 'top' );
    }

lee más: https://codex.wordpress.org/Rewrite_API/add_rewrite_rule

16 feb 2017 11:05:53
Comentarios

Deberías haberlo hecho más complicado para votar en contra...

Vishal Kumar Sahu Vishal Kumar Sahu
25 mar 2017 07:07:40
0

WordPress no te permitirá hacer esto fácilmente. De hecho, las reglas de reescritura son tu única opción para lograr este tipo de cosas en WordPress, y las reglas de reescritura pueden volverse realmente desordenadas cuando tu sitio crece, porque los plugins y temas (y tú también) pueden agregar reglas de reescritura personalizadas sobre las reglas existentes en tu instalación (multi)sitio.

La solución de @swissspidy funcionará si ya tienes una regla de reescritura para tu clave (myvar) y estás usando enlaces permanentes en la primera condición, y luego recurres a cadenas de consulta tradicionales en ausencia de esas condiciones. La solución de @Johnathan Joosten muestra cómo las reglas de reescritura pueden volverse muy, muy complejas en WordPress (imagina hacer eso para todas tus claves y valores de cadenas de consulta...)

Me encontré con este problema varias veces antes mientras trabajaba en algunos proyectos de mediano tamaño para mis clientes y pude lograr algo similar usando un plugin llamado Obfusquer. Según el sitio web, enmascara todas las cadenas de consulta de WordPress con claves secretas definidas por el usuario y también proporciona ganchos para requisitos personalizados avanzados.

Curiosamente, no está listado en el repositorio de plugins de WordPress, y creo que necesitarás una suscripción (que considero realmente asequible ya que una sola licencia funcionará incluso en instalaciones multisitio) pero aquí hay un enlace a él si necesitas enmascarar/ocultar cadenas de consulta en instalaciones de WordPress. También tienen documentación aquí.

Ahora uso este plugin en casi todos mis proyectos de WordPress, espero que ayude con tus necesidades. Saludos.

27 nov 2019 12:23:06