Obtener Permalink sin dominio (es decir, obtener permalink relativo)
Este es el código que estoy usando:
<?php echo str_replace( home_url(), '', get_permalink($post->ID) ); ?>
Lo que hace es mostrar el permalink como una URL relativa, es decir, solo el slug. Por ejemplo, si el permalink es http://example.com/2012/01/post-title/
, la URL relativa generada por el código se vería como /2012/01/post-title/
.
Problema: Todas las Entradas y Páginas muestran el permalink correcto, lo cual es genial. Pero todas las demás páginas (incluyendo Inicio, Búsqueda y Archivos) muestran la URL relativa de la primera entrada y no la de las páginas respectivas. ¿Alguna idea de por qué? ¿Qué estoy haciendo mal aquí?
Referencia: Obtener permalink de página sin wpurl
EDICIÓN: Esto es lo que también he intentado:
En functions.php
function get_relative_permalink( $url ) {
$url = get_permalink();
return str_replace( home_url(), "", $url );
}
En header.php
<link rel="alternate" hreflang="en-IN" href="http://in.example.com/<?php echo get_relative_permalink(); ?>" />
El mismo problema ocurre con esto también. Pero este muestra un error no tan informativo.

No es necesario usar str_replace o preg_replace, simplemente pasa el enlace permanente a wp_make_link_relative().
La función integrada es mucho más simple y también maneja elegantemente las barras al final, situaciones donde home_url y site_url son diferentes y varios otros casos especiales.

Usa $_SERVER['REQUEST_URI']
en lugar de get_permalink()
para obtener la URL actual. get_permalink
te dará la dirección completa de la entrada actual, no la dirección de la URL visitada.
Por ejemplo, para example.com/test/page echo $_SERVER['REQUEST_URI'];
mostrará /test/page
Ten en cuenta que esto no incluye el hashtag, ya que esa parte nunca se envía al servidor, y tampoco incluye parámetros del tipo ?foo=bar
, esos están en el array $_GET
.

¡Funciona perfectamente!!! Pequeña corrección — al segundo código le falta una comilla. echo $_SERVER['REQUEST_URI'];
— ¡y gracias!

@TomJNowell Si no me equivoco, $_SERVER['REQUEST_URI'] te dará la URL actual, lo cual puede ser un problema si es una publicación paginada, lo que significa que /test/page/2 será capturada mientras que usar get_permalink() sería la solución para este problema. ¿Tiene sentido lo que digo?

Lo cual es similar al problema original del autor, tendría que hacer algunas pruebas, pero siempre puedes agregar tu propia respuesta y si funciona la votaré a favor =]

¿Por qué se aceptó esta respuesta? ¡Ni siquiera responde remotamente a la pregunta del OP!

@JimMaguire definitivamente está relacionado con lo que preguntó el OP, sin embargo el autor de la respuesta olvidó mencionar que devuelve básicamente TODO después del dominio hasta el hash (que no se envía al servidor por diseño). Así que es solo un punto de partida, no la solución final.

Obtén una solución más completa: a) divide la cadena con explode()
usando ?
y conserva solo la primera parte [0]
para eliminar una posible consulta GET b) ejecuta un reemplazo con expresiones regulares (preg_replace()
) para eliminar cualquier posible "parámetro de URL amigable", más comúnmente page/N/
- número de página y otros parámetros posibles pueden cambiar, por eso se usa regex... ej. preg_replace( '/\/page\/\d+\//', '/', $url )
