¿Cómo obtener la URL de la página actual mostrada?
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.

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 ) );

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

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

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

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.

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.

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)

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

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.

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.

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));

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

¿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;

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

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.

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

¡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 . '/'));

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

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.

// 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();

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. :-)

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

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í

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 ) )

Quizás wp_guess_url()
es lo que necesitas. Disponible desde la versión 2.6.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.

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.

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

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.

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.

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