Obtener Permalink sin dominio (es decir, obtener permalink relativo)

28 ago 2012, 16:09:19
Vistas: 48.4K
Votos: 17

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.

5
Comentarios

¿Dónde exactamente estás probando este código...?? ¿Estás usando global $post antes de tu código anterior?

Joshua Abenazer Joshua Abenazer
28 ago 2012 16:31:12

@JoshuaAbenazer Estoy usando el código tal cual está en mi archivo header.php — parece que esa es la forma incorrecta de hacerlo. Editaré mi pregunta para reflejar lo demás que he intentado, para que puedas ayudarme mejor.

its_me its_me
28 ago 2012 16:35:29

¿Puedo preguntar por qué querrías esto?

Tom J Nowell Tom J Nowell
28 ago 2012 16:37:36

@TomJNowell Hola. Necesito usar un dominio diferente para este marcado: <link rel="alternate" hreflang="en-IN" href="http://in.example.com/2012/01/post-title/" /> — pero el enlace permanente real es así: http://example.com/2012/01/post-title/. (Leer esto te dará una mejor idea de lo que estoy haciendo).

its_me its_me
28 ago 2012 16:41:14

Si quieres ir por el camino de WP, debes darte cuenta de que get_permalink() es para obtener enlaces de instancias de la clase WP_Post (entradas, páginas, tipos de contenido personalizados, ...)... para archivos, etiquetas, etc. - solo categorías en general - instancias de la clase WP_Term - es get_term_link(), para la página de inicio es home_url()

jave.web jave.web
18 mar 2018 21:49:33
Todas las respuestas a la pregunta 3
4
17

Yo uso

str_replace(home_url(), '', get_permalink());

Si la raíz del sitio no es /

1 nov 2013 00:40:57
Comentarios

No, no funciona cuando WordPress está en un subdirectorio...

Nabil Kadimi Nabil Kadimi
27 dic 2014 10:17:41

¿Qué quieres decir con que WordPress está en un subdirectorio?

Jim Maguire Jim Maguire
26 jul 2017 04:53:17

@JimMaguire http://example.com/no-es-el-directorio-raiz/

Walf Walf
8 nov 2017 08:17:47

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.

senectus senectus
19 nov 2021 14:05:16
6
13

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.

28 ago 2012 16:46:26
Comentarios

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

its_me its_me
28 ago 2012 16:51:42

@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?

Christine Cooper Christine Cooper
10 jun 2014 21:36:39

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 =]

Tom J Nowell Tom J Nowell
10 jun 2014 23:34:07

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

Jim Maguire Jim Maguire
26 jul 2017 04:54:54

@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.

jave.web jave.web
18 mar 2018 21:59:49

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 )

jave.web jave.web
18 mar 2018 22:14:35
Mostrar los 1 comentarios restantes
0

Esto funciona para mí:

function force_relative_url ($url)
{
    return preg_replace ('/^(http)?s?:?\/\/[^\/]*(\/?.*)$/i', '$2', '' . $url);
}

Para usarlo en un enlace permanente:

$relative_permalink = force_relative_url (get_permalink ($post->ID));
22 abr 2016 18:05:07