¿Cómo obtener la URL de la página actual mostrada?

25 jul 2017, 14:37:59
Vistas: 619K
Votos: 139

Quiero agregar código PHP personalizado para asegurarme de que cada vez que una página de mi sitio se cargue en mi navegador, la URL de esa página se muestre en pantalla. Puedo usar echo get_permalink(), pero esto no funciona en todas las páginas. Algunas páginas (por ejemplo, mi página de inicio) muestran varios posts, y si uso get_permalink() en estas páginas, la URL de la página mostrada no se devuelve (creo que devuelve la URL del último post en el loop). Para estas páginas, ¿cómo puedo obtener la URL?

¿Puedo adjuntar get_permalink() a un hook específico que se ejecute antes de que se ejecute el loop? ¿O puedo de alguna manera salir del loop, o reiniciarlo una vez que esté completo?

Gracias.

5
Comentarios

¿Puedes proporcionar algo de contexto sobre lo que quieres hacer con esta URL? ¿Estás tratando de crear URLs compartibles? ¿Ensamblar URLs personalizadas para enlaces/acciones?

Tom J Nowell Tom J Nowell
25 jul 2017 15:19:05

@TomJNowell Me gustaría encolar un script JS específico, pero solo en ciertas páginas (en este caso, esas páginas son la página de inicio de mi sitio en varios idiomas: https://www.example.com/, https://www.example.com/fr/, https://www.example.com/es/, etc). El archivo JS servirá para añadir hipervínculos a varios títulos que aparecen solo en la página de inicio.

cag8f cag8f
25 jul 2017 19:03:54

¿por qué no usar simplemente is_home() o is_page( 'fr' ) etc y encolar el script solo si es verdadero?

Tom J Nowell Tom J Nowell
25 jul 2017 19:15:39

@TomJNowell Bueno, ahora mi código es if ( home_url( $wp->request ) == home_url() ) { wp_enqueue_script();} Esto parece ejecutarse en cada página de inicio, independientemente del idioma. ¿Es eso lo que estabas sugiriendo?

cag8f cag8f
26 jul 2017 08:32:52

¿Por qué no usar $_SERVER['REQUEST_URI'] y compañía? Mira esta pregunta: https://stackoverflow.com/q/6768793/247696

Flimm Flimm
29 may 2019 16:07:35
Todas las respuestas a la pregunta 15
11
235

get_permalink() solo es realmente útil para páginas individuales y entradas, y solo funciona dentro del bucle.

La forma más simple que he visto es esta:

global $wp;
echo home_url( $wp->request )

$wp->request incluye la parte de la ruta de la URL, por ejemplo /ruta/hacia/pagina y home_url() muestra la URL configurada en Ajustes > Generales, pero puedes añadirle una ruta, así que en este código estamos añadiendo la ruta de la solicitud a la URL principal.

Ten en cuenta que esto probablemente no funcionará con los Enlaces Permanentes configurados como Simples, y omitirá las cadenas de consulta (la parte ?foo=bar de la URL).

Para obtener la URL cuando los enlaces permanentes están configurados como simples, puedes usar $wp->query_vars en su lugar, pasándolo a add_query_arg():

global $wp;
echo add_query_arg( $wp->query_vars, home_url() );

Y podrías combinar estos dos métodos para obtener la URL actual, incluyendo la cadena de consulta, independientemente de la configuración de enlaces permanentes:

global $wp;
echo add_query_arg( $wp->query_vars, home_url( $wp->request ) );
25 jul 2017 15:00:07
Comentarios

Si los enlaces permanentes están configurados como simples: echo '//' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];.

Max Yudin Max Yudin
25 jul 2017 15:18:26

@Jacob Intenté eso, pero parece que solo devuelve la URL de mi página de inicio. Como puedes ver en la parte superior izquierda de esta página (https://dev.horizonhomes-samui.com/properties/hs0540/), donde he insertado el código para echo home_url( $wp->request ). Me aseguré de incluir global $wp también. Los enlaces permanentes no están en 'Simple', sino configurados como 'Nombre de la entrada'. Tampoco veo errores de PHP relevantes en el registro. Esta página en particular es parte de mi sitio de desarrollo, que está bloqueado para visitantes. No estoy seguro si eso importa o no. edición: En realidad, espera un momento, podría ser error del usuario. Un momento...

cag8f cag8f
25 jul 2017 19:14:17

@Jacob edición 2: OK, tu código funciona efectivamente. Mi problema era que estaba incluyendo el código en functions.php 'desnudo', es decir, no dentro de ninguna función conectada a un gancho. Así que tu código estaba devolviendo la URL de la página de inicio, independientemente de la página que se mostrara en mi navegador. Una vez que moví el código dentro de una función --una función conectada a un gancho de WP (wp_enqueue_scripts), efectivamente devolvió la URL de la página mostrada. ¿Sabes la razón de ese comportamiento? Tal vez necesito crear una nueva pregunta para eso.

cag8f cag8f
25 jul 2017 19:20:36

@cag8f Si el código está "desnudo" en functions.php entonces lo estás ejecutando antes de que todas las propiedades del objeto $wp hayan sido configuradas. Cuando lo envuelves en una función conectada a un hook apropiado, estás retrasando su ejecución hasta un punto adecuado en la ejecución del código de WordPress.

Andy Macaulay-Brook Andy Macaulay-Brook
5 abr 2018 14:28:33

Todos estos métodos son excelentes e ideas geniales para trabajar con WordPress. Podrías agregar trailingslashit() a ellos también, dependiendo de tus necesidades.

Jake Jake
18 oct 2019 01:56:44

$wp->request es nulo para mí

Steve Moretz Steve Moretz
12 ago 2021 11:49:18

Por favor, consulta el segundo comentario de cag8f.

Jacob Peattie Jacob Peattie
12 ago 2021 12:24:20

Esto funciona bien, pero no tiene en cuenta la barra diagonal al final de la URL. Considera usar $post_permalink = home_url( $_SERVER['REQUEST_URI'] ); en su lugar.

appcropolis appcropolis
24 ago 2021 18:47:36

Algo para tener en cuenta también es que esto podría ser un archivo CSS o JS también (o realmente cualquier solicitud al servidor)

sMyles sMyles
9 nov 2021 16:59:14

@MaxYudin por favor no uses $_SERVER ya que no está habilitado en algunos hostings.

Ravi Soni Ravi Soni
4 feb 2022 20:40:56

Ten cuidado cuando uses $wp->query_vars con la página que tiene una URL personalizada creada desde add_rewrite_rule(), la consulta normal de WP con consulta personalizada quedará expuesta. Ejemplo: /mycustompage/subscribe?pagename=mycustompage&mycustom_subpage=subscribe. Mientras que en todos estos casos, la URL que aparece en el navegador es simplemente /mycustompage/subscribe.

vee vee
14 dic 2023 19:24:38
Mostrar los 6 comentarios restantes
5
31

Puede utilizar el siguiente código para obtener la URL completa actual en WordPress:

global $wp;
$current_url = home_url(add_query_arg(array(), $wp->request));

Esto mostrará la ruta completa, incluyendo los parámetros de consulta.

5 abr 2018 13:11:57
Comentarios

Hola - si echas un vistazo a https://developer.wordpress.org/reference/functions/add_query_arg/ verás que tu código no preserva realmente los parámetros de consulta existentes.

Andy Macaulay-Brook Andy Macaulay-Brook
5 abr 2018 13:55:07

Para preservar los parámetros de consulta necesitarías reemplazar el array() vacío con $_GET. Es decir: home_url(add_query_arg($_GET,$wp->request));

Brad Adams Brad Adams
14 jun 2018 15:48:43

No funcionará si WordPress está instalado en un subdirectorio

ManzoorWani ManzoorWani
26 nov 2018 14:01:21

@BradAdams ¡la respuesta no me funcionaba hasta que vi tu comentario sobre el array vacío. ¡Gracias!

730wavy 730wavy
9 dic 2022 03:08:19

el código del comentario de Brad Adams desafortunadamente no agrega una barra diagonal al final de la solicitud por lo que tu enlace permanente terminaría como /foo en lugar de /foo/

DrLightman DrLightman
20 mar 2024 15:49:18
5
22

¿Por qué no simplemente usar?

get_permalink( get_the_ID() );

Eso es para páginas individuales.

Para páginas de categorías, usa esto:

get_category_link( get_query_var( 'cat' ) );

Script simple para obtener la URL actual de cualquier página:

// obtener URL actual
$current_url = get_permalink( get_the_ID() );
if( is_category() ) $current_url = get_category_link( get_query_var( 'cat' ) );
echo $current_url;
22 oct 2019 02:18:38
Comentarios

+1 todas las otras respuestas son demasiado complicadas, esta es simplemente la solución más sencilla

Mark Mark
16 abr 2020 16:37:26

Esta es la forma más fácil. +1

Syafiq Freman Syafiq Freman
23 may 2020 21:30:39

no funciona con las categorías del blog en mi sitio

Iggy Iggy
21 jun 2020 17:04:46

Solo funciona para entradas y páginas individuales.

Andy Macaulay-Brook Andy Macaulay-Brook
12 mar 2021 16:17:18

Esto no incluye los parámetros de URL.

GeorgeP GeorgeP
19 abr 2022 15:14:08
1
20

En mi caso, este código funcionó bien:

// Obtiene la URL actual combinando la URL base del sitio con la URI solicitada
$current_url = home_url($_SERVER['REQUEST_URI'])

Espero que esto ayude a alguien, probé todas las respuestas pero esta fue la útil.

10 dic 2020 13:00:23
Comentarios

Esta solución no funciona para instalaciones en subdirectorios. Cuando el home_url es s.b/hm y REQUEST_URI es /hm/current_url/ entonces el valor se convierte en https://s.b/hm/hm/current_url. El directorio de instalación se repite.

bobbingwide bobbingwide
2 feb 2024 19:05:10
3
12

El siguiente código mostrará la URL actual:

global $wp;
echo home_url($wp->request)

Puedes usar el siguiente código para obtener la URL completa junto con los parámetros de consulta.

global $wp;  
$current_url = home_url(add_query_arg(array($_GET), $wp->request));

Esto mostrará la ruta completa, incluyendo los parámetros de consulta. Esto preservará los parámetros de consulta si ya están presentes en la URL.

28 dic 2018 08:02:27
Comentarios

Este fragmento omite wp-admin/plugins.php en mi URL actual, es solo la ruta raíz y las cadenas de consulta.

Ryszard Jędraszyk Ryszard Jędraszyk
3 ago 2019 04:25:10

¡Cerca! Faltaba la barra diagonal final, y por lo tanto causa una redirección rápida para agregarla cuando WP la analiza, lo que genera una pequeña penalización SEO, así que la agregué abajo. Hasta ahora esto crea la URL exacta

global $wp; $current_url = home_url(add_query_arg(array($_GET), $wp->request . '/'));

Shane McCurdy Shane McCurdy
19 mar 2021 04:32:13

@ShaneMcCurdy Supongo que también podrías usar trailingslashit() (ver el comentario de Jake arriba)

Gwyneth Llewelyn Gwyneth Llewelyn
26 may 2021 18:19:20
0

Las soluciones aquí son todas buenas pero no eran consistentes entre entornos de servidor local y remoto. Así que desarrollé una solución más simple y limpia que funciona mejor independientemente de la configuración de enlaces permanentes de WordPress.

// Función para obtener la URL actual
function getCurrentUrl() {
    $protocol = is_ssl() ? 'https://' : 'http://'; // Detecta si es conexión segura
    return ($protocol) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}
$currentUrl = getCurrentUrl();
echo $currentUrl; // Muestra la URL actual

La salida incluirá los parámetros de consulta URL y los slugs.

30 may 2021 12:15:41
2
// Función para obtener la ubicación actual
function current_location()
{
    // Verifica si la conexión es segura (HTTPS)
    if (isset($_SERVER['HTTPS']) &&
        ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) ||
        isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
        $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
        $protocol = 'https://';
    } else {
        $protocol = 'http://';
    }
    // Retorna la URL completa actual
    return $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}

// Muestra la ubicación actual
echo current_location();
29 nov 2018 12:32:56
Comentarios

¿Puedes explicar cómo y por qué este código resuelve la pregunta?

kero kero
29 nov 2018 13:29:05

En mi opinión, es la solución más flexible. Funciona en cualquier página de WordPress (incluso en wp-admin, wp-login.php, páginas de archivo, etc.). Solo hay que tener en cuenta que no incluye ningún parámetro URL

Philipp Philipp
1 abr 2019 19:09:31
3
global $wp;
// Analiza la solicitud actual
$wp->parse_request();
// Obtiene la URL actual del sitio
$current_url = home_url($wp->request);
13 ene 2021 03:34:10
Comentarios

Siempre trata de incluir un poco de explicación con tu respuesta para que el autor de la pregunta obtenga una mejor comprensión de lo que está sucediendo. De esta manera todos terminamos aprendiendo y la comunidad crece. :-)

Tony Djukic Tony Djukic
13 ene 2021 04:13:39

Sí, ocho años después todavía estoy desconcertado sobre cómo funciona esto, y dónde deberías usarlo (¿sin nada? ¿dentro de un hook? ¿un filtro? ¿el loop?... no tenemos idea).

Gwyneth Llewelyn Gwyneth Llewelyn
26 may 2021 18:17:10

Me gusta que ejecutar wp::parse_request() funcione para capturar endpoints en la URL. Eso es simplemente ingenioso.

Howdy_McGee Howdy_McGee
28 sept 2021 23:40:27
0

Esto es lo que funcionó para mí (una solución corta y limpia que incluye también las cadenas de consulta en la URL):

$current_url = add_query_arg( $_SERVER['QUERY_STRING'], '', home_url( $wp->request ) );

La URL de salida se verá como se muestra a continuación

http://sometesturl.test/slug1/slug2?queryParam1=testing&queryParam2=123

La solución fue tomada de aquí

15 jul 2020 19:40:05
0

Esta es una forma mejorada del ejemplo mencionado anteriormente. Funciona cuando las URLs amigables están habilitadas, sin embargo, descarta si hay algún parámetro de consulta como /page-slug/?param=1 o si la URL no es amigable.

El siguiente ejemplo funcionará en ambos casos.

    // Crear un array para los argumentos de consulta
    $query_args = array();

    // Analizar la URL proporcionada
    $query = wp_parse_url( $YOUR_URL );

    // Obtener la estructura del enlace permanente
    $permalink = get_option( 'permalink_structure' );

    // Si la estructura del enlace permanente está vacía
    if ( empty( $permalink ) ) {

        $query_args = $query['query'];

    }

    // Mostrar la URL base con los argumentos de consulta agregados
    echo home_url( add_query_arg( $query_args , $wp->request ) )
11 jun 2018 19:08:21
1

Quizás wp_guess_url() es lo que necesitas. Disponible desde la versión 2.6.0.

1 oct 2019 11:54:43
Comentarios

Esto simplemente adivina la URL base. En el frontend, terminas con un efecto similar a home_url().

Jake Jake
18 oct 2019 01:54:08
0

Después de tanta investigación sobre una tarea simple, una combinación de todas las respuestas anteriores funciona para nosotros:

function get_wp_current_url(){
    global $wp;
    if('' === get_option('permalink_structure')) return home_url(add_query_arg(array($_GET), $wp->request));
        else return home_url(trailingslashit(add_query_arg(array($_GET), $wp->request)));
}

Sin barra diagonal faltante al final y demás. Como la pregunta es sobre mostrar la URL actual, esto no se preocupa por la seguridad y otras cosas. Sin embargo, los fragmentos como #comment al final no se pueden encontrar en PHP.

5 abr 2020 01:58:58
2

Me doy cuenta de que esta es una pregunta antigua, sin embargo, algo que he notado es que nadie mencionó el uso de get_queried_object().

Es una función global de WordPress que obtiene todo lo relacionado con la URL actual en la que te encuentras. Por ejemplo, si estás en una página o entrada, devolverá un objeto de tipo post. Si estás en un archivo, devolverá un objeto de tipo post type.

WordPress también tiene un montón de funciones auxiliares, como get_post_type_archive_link a la que puedes pasarle el campo post type del objeto y obtener su enlace de esta manera:

get_post_type_archive_link(get_queried_object()->name);

El punto es que no necesitas depender de algunas de las respuestas más complejas mencionadas anteriormente, y en su lugar puedes usar el objeto consultado para obtener siempre la URL correcta.

Esto también funcionará para instalaciones multisitio sin trabajo adicional, ya que al usar las funciones de WordPress, siempre obtendrás la URL correcta.

28 jul 2020 10:29:32
Comentarios

Hm. Posiblemente podría existir el problema de no tener una forma universal de especificar todos los tipos posibles de objetos. En otras palabras, cosas como get_post_type_archive_link() funcionan muy bien si sabes, de antemano, que tienes un enlace de archivo. Por lo tanto, aún necesitarás averiguar qué tipo de objeto tienes antes de usar una función auxiliar específica en él. A medida que WP obtiene más y más tipos de objetos, necesitas tener más código para manejar cada caso individual por separado...

Gwyneth Llewelyn Gwyneth Llewelyn
26 may 2021 18:16:13

get_queried_object SIEMPRE contiene información que puede aprovecharse para determinar qué tipo de objeto de WordPress es. Esto incluye los archivos de entradas. Es bastante fácil de probar. Simplemente intenta ver los resultados de la llamada al método en cada tipo de plantilla, y obtendrás una mejor comprensión de lo que quiero decir.

Hybrid Web Dev Hybrid Web Dev
28 may 2021 00:28:42
2

WP actualizó algo y ahora la propiedad request del objeto global $wp está vacía por defecto. Debes llamar al método especial parse_request antes de obtener datos de esta propiedad.

Así era antes:

global $wp;
echo home_url( $wp->request );

Ahora debe ser de la siguiente manera:

global $wp;
$wp->parse_request();
echo home_url( $wp->request );

P.D. Me gustaría dejar comentarios bajo la respuesta más popular, pero no tengo permisos para dejar comentarios.

29 oct 2021 07:25:37
Comentarios

Pero parse_request ya debería estar siendo llamado por $wp->main() en la parte inferior de ese archivo.

Rup Rup
1 nov 2021 12:34:42

Sí, tal vez, pero probablemente algún plugin lo rompió y mi clase dejó de funcionar correctamente, porque $wp->request solo devolvía una cadena vacía. Así que es más seguro usar $wp->parse_request() para asegurar que $wp->request sea correcto.

Ivan Ivan Ivan Ivan
4 dic 2021 00:48:33
0

Puede que sea tarde pero para quien pueda ayudar, get_page_link() debería funcionar. Si solo deseas obtener el URI de la página, get_page_uri() es la función auxiliar perfecta.

29 oct 2024 07:50:29