Cómo obtener URLs amigables con add_query_arg en los enlaces permanentes
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.

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

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

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.
