¿Cuál es la diferencia entre home_url() y site_url()?
Mi entendimiento es que site_url()
devuelve la ubicación donde se encuentran los archivos del núcleo de WordPress.
Si mi blog está alojado en http://example.com/blog
entonces site_url()
devuelve http://example.com/blog
Pero entonces, ¿en qué se diferencia home_url()
? Para mí, home_url()
devuelve lo mismo: http://example.com/blog
Si esto es correcto, ¿puedo hacer que WordPress devuelva http://example.com/
?

Estás haciendo dos preguntas al mismo tiempo:
- ¿Cuál es la diferencia entre
home_url()
ysite_url()
? - ¿Cómo hago que WordPress devuelva la URL raíz sin el subdirectorio donde está instalado?
Aquí están las respuestas, las cuales confirmé con Andrew Nacin, un desarrollador principal de WordPress, además de realizar algunas pruebas en el servidor para verificar lo que Andrew me dijo.
Pregunta #1
En Ajustes > Generales de wp-admin, home_url()
hace referencia al campo etiquetado como "Dirección del sitio (URL)". ¿Confuso, cierto? Sí, dice "Dirección del sitio", por lo que podrías asumir que es site_url()
, pero estarías equivocado. Haz tu propia prueba y lo verás. (Puedes colocar temporalmente un campo echo H1
con los valores de site_url()
y home_url()
en la parte superior de tu functions.php del tema).
Mientras tanto, site_url()
hace referencia al campo etiquetado como "Dirección de WordPress (URL)" en Ajustes > Generales.
Por lo tanto, si deseas hacer referencia a una ruta física, como llamar a la ruta de una carpeta de plugin en la URL para cargar una imagen, o llamar a la ruta de una carpeta del tema para cargar una imagen, en realidad deberías usar otras funciones para eso - revisa plugins_url()
y get_template_directory_uri()
.
site_url()
siempre será la ubicación donde puedes acceder al sitio agregando /wp-admin
al final, mientras que home_url()
no sería confiablemente esta ubicación.
home_url()
sería donde has configurado tu página de inicio estableciendo el campo "Dirección del sitio (URL)" en Ajustes > Generales.
Pregunta #2
Entonces, si he colocado mi blog en http://ejemplo.com/blog
, y ejemplo.com
es solo un sitio estático donde tengo un tema de portafolio, entonces este sería un escenario que se alinea con tu pregunta. En tal caso, usaría este fragmento de código:
<?php
function getDomain() {
$sURL = site_url(); // Función de WordPress
$asParts = parse_url( $sURL ); // Función de PHP
if ( ! $asParts )
wp_die( 'ERROR: Path corrupt for parsing.' ); // reemplaza esto con un mejor resultado de error
$sScheme = $asParts['scheme'];
$nPort = $asParts['port'];
$sHost = $asParts['host'];
$nPort = 80 == $nPort ? '' : $nPort;
$nPort = 'https' == $sScheme AND 443 == $nPort ? '' : $nPort;
$sPort = ! empty( $nPort ) ? ":$nPort" : '';
$sReturn = $sScheme . '://' . $sHost . $sPort;
return $sReturn;
}

Fue por correo electrónico. Lo siento. Ah, y gracias por la edición, recordaré ese cambio de sintaxis la próxima vez.

Me tomó mucho tiempo y bastante dolor darme cuenta de que 'Dirección del sitio (URL)' = 'home' y 'Dirección de WordPress (URL)' = 'siteurl'. Definitivamente deberían cambiar esas etiquetas.

Parece que hay un error tipográfico en $sPort = ! empty( $sPort ) ? ":$nPort" : '';
. Creo que ! empty( $sPort )
debería ser ! empty( $nPort )
. De lo contrario, ":$nPort"
nunca se alcanzará, por lo tanto $sPort = ''
y un puerto nunca se añadirá en la antepenúltima línea.

##TLDR:
En una instalación no estándar, puedes colocar tus archivos de WordPress en un subdirectorio del directorio raíz de tu sitio web.
...y aún así permitir que tus visitantes accedan a tu "sitio web" de WordPress desde la URL raíz de tu dominio, sin necesidad de añadir el nombre del subdirectorio:
(por ejemplo: www.example.com
vs www.example.com/wordpress
):
Función WP | wp_options. | Constante WP | lo que representa | Etiqueta en Ajustes WP | Ejemplo
-------------------------------------------------------------------------------------------------------------------------------------
`site_url()` | `siteurl` | `WP_SITEURL` | Ubicación de archivos WP | Dirección de WordPress | https://www.example.com/wordpress
`home_url()` | `home` | `WP_HOME` | Barra de direcciones navegador | Dirección del Sitio | https://www.example.com
Donde el valor de una constante WP tiene prioridad sobre un valor de wp_options/Ajustes WP.
##Diferentes Configuraciones para WordPress
En las instalaciones más estándar de WordPress, home_url
y site_url
tendrán el mismo valor.
Sin embargo, representan dos cosas diferentes.
En una instalación no estándar, pueden tener valores diferentes.
NOTA: Estoy omitiendo el protocolo en mi respuesta para facilitar la lectura.
En este post, ANTEPONGA CADA URL con:https://
,http://
O//
(a menos que ya lo haya incluido).
(//
es el protocolo relativo
y funcionará tanto para http://
como para https://
)
Instalaciones Estándar (incluyendo Instalaciones "Un Clic")
home_url
: es la página de inicio de tu sitio web (WordPress), como se indica en la barra de direcciones del usuario.
site_url
: es el directorio donde se encuentran tus archivos de WordPress.
La instalación de 5 minutos de WordPress establece estos dos valores iguales - los archivos de WordPress se instalarán en la misma carpeta que deseas que la gente use para acceder a tu sitio web, o la parte del blog de WordPress del sitio web de tu servidor.
Ejemplo 1:
el usuario accede a tu blog en: www.example.com
,
archivos de WordPress instalados en: www.example.com
, o la carpeta raíz del sitio web de tu servidor.
home_url
=== site_url
=== "www.example.com"
Ejemplo 2:
el usuario accede a tu blog en: www.example.com/blog
,
archivos de WordPress instalados en: www.example.com/blog
, o en la carpeta blog
dentro del raíz de tu sitio web.
home_url
=== site_url
=== "www.example.com/blog"
En este caso www.example.com
es el sitio web principal, y www.example.com/blog
es la raíz de tu blog.
Aquí tu blog está separado de, y funciona como un subconjunto de, tu sitio web principal.
En este caso, tu sitio web principal no está controlado, definido o estilizado por WordPress.
Solo tu blog lo está. Todas las URLs en tu blog estarán precedidas por www.example.com/blog
Nota: En la documentación, "sitio web de WordPress" (a diferencia de simplemente "sitio web") se refiere al directorio donde están instalados tus archivos de WordPress. En este caso, es www.example.com/blog
- todo dentro de la carpeta blog
. El "sitio web de WordPress", en este escenario, no es lo mismo que tu dominio, tu raíz o tu sitio web principal. Es un subconjunto de tu sitio web general. Algo así como un sitio web dentro de un sitio web. Menciono esto ya que la terminología puede parecer poco clara o confusa, dada esta configuración particular.
Configuración Alternativa de Instalación de WordPress
Dando a WordPress su propio Directorio, la sección Método II (Con cambio de URL)
.
Por ejemplo, muchas personas no quieren saturar la carpeta raíz de su sitio web con todos los archivos de WordPress.
Quieren instalar WordPress en un subdirectorio, *pero tener el "blog" o "sitio web de WordPress" accesible como si los archivos estuvieran instalados en la raíz del servidor para el sitio web.
Esto es particularmente cierto cuando WordPress se usa para construir y ejecutar un sitio web completo que ni siquiera tiene un "blog".
Ejemplo 3:
el usuario accede a tu "blog" en: www.example.com
,
archivos de WordPress instalados en: www.example.com/wordpress
, o la carpeta raíz del sitio web de tu servidor.
home_url
=== "www.example.com"
site_url
=== "www.example.com/wordpress"
(Nota: esta configuración no funcionará "fuera de la caja" solo cambiando los valores de estas variables. Requiere cambios de configuración adicionales para funcionar correctamente)
Ver Dando a WordPress su propio Directorio, la sección titulada Método II (Con cambio de URL)
para saber cómo hacer esto.
En este caso home_url
y site_url
deben tener valores diferentes.
En esta configuración, deseas que tu sitio web funcione exactamente como si los archivos de WordPress estuvieran instalados en el directorio raíz del servidor para tu sitio web...
PERO, por motivos de organización en el servidor,
realmente tienes tus archivos de WordPress en una carpeta llamada wordpress
en el directorio raíz del servidor para tu sitio web.
Así, el usuario escribirá www.example.com
para obtener tu página de inicio de WordPress, en lugar de www.example.com/wordpress
función wordpress <--> variable de base de datos <--> Constante WordPress
Esta sección asume la configuración del Ejemplo 3 anterior.
URL en barra de direcciones: www.example.com
archivos de WordPress: directorio /wordpress
(Los otros casos son triviales: Todas las variables/funciones tienen/devuelven el mismo valor.)
Cómo establecer los valores para site_url
y home_url
Primero, permíteme notar que siteurl
y home
almacenan los valores devueltos por las funciones anteriores
- Normalmente estableces estos valores en el panel de administración de WordPress:
Ajustes -> Generales ->
siteurl
Dirección de WordPress:https://www.example.com/wordpress
home
Dirección del Sitio:https://www.example.com
(no incluyas barras diagonales al final aquí - eso se configuraría en otro lugar)
Alternativamente, puedes establecer estos valores en tu base de datos de WordPress:
tablawp_options
->options_name
|options_value
siteurl
|https://www.example.com/wordpress
home
|https://www.example.com
(no incluyas barras diagonales al final aquí - eso se configuraría en otro lugar)
Edita tu
wp-config.php
Define estas constantes específicas para guardar tus valores
Define los ajustesWP_HOME
yWP_SITEURL
insertando estas líneas hacia el inicio de tu archivowp-config.php
:define('WP_SITEURL','http://example.com/wordpress'); // archivos core de WordPress define('WP_HOME','http://example.com'); // URL en barra de direcciones
// ** Ajustes MySQL - Puedes obtener esta info de tu proveedor de hosting ** // ...
(no incluyas barras diagonales al final aquí - eso se configuraría en otro lugar)
Referencia: WP_SITEURL y WP_HOME
NOTA: Esto es confuso
(Realmente desearía que WordPress hubiera etiquetado los Ajustes similar a sus nombres en php,
como Dirección del Sitio WordPress
y Dirección de la Página de Inicio
o algo más explícito como ubicación de los archivos core del Sitio WordPress
y URL en navegador para acceder a la página de inicio de WordPress
)
`WP_SITEURL` <--> `site_url()` <--> `siteurl` <--> Dirección de WordPress <--> /wordpress
`WP_HOME` <--> `home_url()` <--> `home` <--> Dirección del Sitio <--> /
¡Aquí es donde se pone complicado!
SI definiste esas constantes en tu archivo wp-config.php
, no importa qué valores tengas en tu base de datos/página de ajustes.
De hecho, no podrás modificar este valor desde el panel de administración (aparecerá en gris). Aún puedes modificarlo editando tu base de datos, pero hacerlo no tendrá efecto en tu sitio, mientras las constantes existan en tu archivo wp-config.
Tu archivo de configuración no cambiará los valores en tu base de datos (o por lo tanto en tu página de ajustes). En su lugar, los valores de tu base de datos/página de ajustes serán ignorados. Los valores en wp-config anulan o tienen prioridad sobre los ajustes de tu base de datos.
#Para resumir (TLDR) :
Función WP | wp_options. | Constante WP | lo que representa | Etiqueta en Ajustes WP | Ejemplo
-------------------------------------------------------------------------------------------------------------------------------------
`site_url()` | `siteurl` | `WP_SITEURL` | Ubicación de archivos WP | Dirección de WordPress | https://www.example.com/wordpress
`home_url()` | `home` | `WP_HOME` | Barra de direcciones navegador | Dirección del Sitio | https://www.example.com
Donde el valor de una constante WP tiene prioridad sobre un valor de wp_options/Ajustes WP.
El valor del registro wp_options y el valor de Ajustes WP son el mismo.
Editar uno, por definición edita el otro.
Es solo 2 formas diferentes de acceder a la misma variable.
Por otro lado, las Constantes de WordPress son únicas e independientes.
Internamente, las constantes (PHP) de WordPress anulan sus contrapartes en la base de datos.
Si una constante está definida en wp-config, no cambia la base de datos.
Pero internamente WordPress siempre preferirá/usará su valor en lugar del de la base de datos.

Si deseas instalar WordPress en un directorio pero que la página de inicio del sitio esté en la raíz de tu dominio, necesitas mover el archivo principal index.php a la raíz de tu dominio y editar la declaración require para que apunte dentro de tu directorio.
Este proceso se describe aquí: Darle a WordPress su propio directorio.

Siempre uso home_url()
ya que estoy en modo de red wp. Solo una vez he dado a WordPress su propio directorio y no fue de mi agrado. Sin embargo, en algunos sitios sí que uso wp_content_dir
.

No tengo experiencia con multisitio, así que no estoy familiarizado con cómo funciona esto en esa situación. Prefiero instalar WP en un directorio para mantener las cosas ordenadas y no saturar la raíz.

Mi estructura de archivos es probablemente una de las más ordenadas que hay. home/usr/public_html/sitio1
home/usr/public_html/sitio2
y así sucesivamente, y luego el wp_content_dir
suele estar en una CDN.

si una instalación de WP fuera lo único que hubiera, estaría bien, pero principalmente trabajo en servidores de otras personas con cientos de archivos y directorios esparcidos por todas partes.

Las funciones site_url()
y home_url()
son similares y pueden generar confusión sobre cómo funcionan.
La función site_url()
recupera el valor de siteurl
en la tabla wp_options
de tu base de datos.
Esta es la URL que apunta a los archivos principales de WordPress.
Si tus archivos principales están en un subdirectorio como /wordpress
en tu servidor web, el valor sería http://ejemplo.com/wordpress
.
La función home_url()
recupera el valor de home
en la tabla wp_options
de tu base de datos.
Esta es la dirección que quieres que visiten las personas para ver tu sitio web WordPress.
Si tus archivos principales de WordPress están en /wordpress
, pero quieres que la URL de tu sitio web sea http://ejemplo.com
, el valor de home debería ser http://ejemplo.com
.

Para responder a tu segunda pregunta:
P: Si eso es correcto, ¿puedo hacer que WordPress devuelva http://ejemplo.com/?
No puedes, a menos que sigas los pasos de Darle a WordPress su propio directorio. Usando esto significa que colocas los archivos principales de WordPress en /blog
o /WordPress
y luego el index.php
en tu raíz.
Si decides poner WordPress dentro de su propio directorio, entonces usarías home_url()
para ir a index.php
y site_url()
para obtener los archivos principales y demás.
Referencias:
Codex para site_url
Codex para home_url
Codex para Darle a WordPress su propio directorio

Tu primera pregunta ha sido respondida, pero creo que la forma más sencilla de recuperar tu dominio raíz es con la función bloginfo('url'); además, bloginfo() tiene otros parámetros que puede devolver, revisa la documentación.
También existe get_bloginfo() por si deseas envolver el contenido en una variable.

La forma más sencilla de obtener la URL del sitio sin subdirectorios ( http://example.com/ en lugar de http://example.com/blog ), simplemente usa la barra diagonal /
Por ejemplo, si escribes:
<a href="/">url del dominio</a>
Creará un enlace que dirige a tu dominio

Gracias por participar. Lamentablemente, esto no responde a la pregunta planteada por el OP. Hay muchas razones por las que una persona necesita usar las funciones de WordPress que el OP menciona. Es poco probable que el OP simplemente quiera añadir un enlace a su página de inicio mediante HTML, como editando una publicación. Es más probable que el OP esté editando un archivo PHP de un tema o un plugin. En cualquier caso, están trabajando con PHP, no con HTML. Finalmente, aunque el OP esperaba un valor sin /
para este sitio, en un sitio diferente, el OP podría esperar que se devolviera un subdirectorio. Depende de la configuración de WP para cada sitio.
