¿Cuál es la diferencia entre get_home_path() y ABSPATH?
Ellos deberían hacer lo mismo, pero bajo ciertas condiciones, puede que no.
Primero, ten en cuenta:
- que la descripción en la codex es engañosa
- que
wp-admin/includes/file.php
debe estar incluido en el contexto, de lo contrario, llamar aget_home_path()
resultará en llamar a una función no definida.
Respecto a la entrada en el codex,
Descripción
Obtiene la ruta absoluta del sistema de archivos hasta la raíz de la instalación de WordPress.
Valor devuelto
Ruta completa del sistema de archivos hasta la raíz de la instalación de WordPress. Si instalas WordPress en un subdirectorio, mostrará la ubicación del subdirectorio.
Ejemplos
$path = get_home_path(); print "Path: ".$path; // Devuelve "Path: /var/www/htdocs/" o "Path: /var/www/htdocs/wordpress/" si es un subdirectorio
Indica que el valor devuelto será la ruta del subdirectorio si has instalado WordPress en un subdirectorio. Esto es, de hecho, incorrecto.
get_home_path()
devolverá el directorio raíz de tu instalación de WordPress, incluso si está instalado en un subdirectorio. Ese es el propósito de la función.
Supongamos que tu instalación de WordPress está dentro de un subdirectorio llamado /dev
,
- http://www.example.com/dev (
site_url
) (ej. /var/www/htdocs/dev) - http://www.example.com/ (
home_url
)
Si registras una llamada a ABSPATH
, el resultado será /var/www/htdocs/dev
, que no es la raíz de tu instalación. La raíz de tu instalación es /var/www/htdocs
.
ABSPATH
se define primero en wp-load.php
, que estará ubicado en /var/www/htdocs/dev/wp-load.php
, por lo que aquí es donde ABSPATH
tomará su definición.
Si inspeccionas get_home_path()
más a fondo, notarás que si site_url
y home_url
difieren, entonces se toma una subcadena de la ruta gobernada por la posición (primera ocurrencia) del subdirectorio encontrado dentro de la cadena.
function get_home_path() {
$home = set_url_scheme( get_option( 'home' ), 'http' );
$siteurl = set_url_scheme( get_option( 'siteurl' ), 'http' );
if ( ! empty( $home ) && 0 !== strcasecmp( $home, $siteurl ) ) {
$wp_path_rel_to_home = str_ireplace( $home, '', $siteurl ); /* $siteurl - $home */
$pos = strripos( str_replace( '\\', '/', $_SERVER['SCRIPT_FILENAME'] ), trailingslashit( $wp_path_rel_to_home ) );
$home_path = substr( $_SERVER['SCRIPT_FILENAME'], 0, $pos );
$home_path = trailingslashit( $home_path );
} else {
$home_path = ABSPATH;
}
return str_replace( '\\', '/', $home_path );
}
Por lo tanto, como resultado de esto, get_home_path()
y ABSPATH
pueden devolver resultados diferentes si tienes WordPress instalado en un subdirectorio.
En segundo lugar, llamar a get_home_path()
debe hacerse en un contexto donde el mencionado wp-admin/includes/file.php
ya haya sido incluido.
Por ejemplo, usar get_home_path()
dentro del hook admin_init
está bien, mientras que usarlo dentro de init
no lo está.
Dado que este archivo solo se incluye desde el contexto del administrador (panel de control), si realmente lo necesitas fuera de este contexto, tendrás que incluir el archivo tú mismo antes de llamar a la función,
require_once(ABSPATH . 'wp-admin/includes/file.php');
Irónicamente (o no), lo cual usa ABSPATH
:D

Bien explicado, aunque creo que los desarrolladores de terceros no deberían usar ni la constante ni la función. Como WordPress puede estar ubicado en cualquier lugar, colocarlo fuera de la raíz del documento hace que tanto la constante como la función devuelvan, por ejemplo, /var/apps/wordpress
en lugar de /var/www/htdocs
. Es mejor usar $_SERVER['DOCUMENT_ROOT']
, al menos si puedes asegurar que la raíz del documento no cambiaría.

@Fleuv Es cierto que este es un tema complicado... incluso $_SERVER['DOCUMENT_ROOT']
tiene sus problemas... por ejemplo, puede que no esté configurado o no esté configurado correctamente y así sucesivamente. Se me ocurren otras formas de manejar esto... cada una con sus propias advertencias. Mucha diversión :)

Bien explicado por Adam pero no dio una solución para evitar usar ABSPATH
.
Eso es cuando necesitamos obtener la ruta de wp-admin y wp-admin/includes/file.php tampoco está incluido, como en el hook init o ejecución en el frontend.
Podemos evitar llamar a ABSPATH
en require_once(ABSPATH . 'wp-admin/includes/file.php');
Copiando la definición de get_home_path()
en un archivo en tu proyecto e incluir ese archivo si se cumple la siguiente condición como
if ( ! function_exists( 'get_home_path' ) ) {
require_once MY_PLUGIN_DIR . 'includes/helpers/admin_functions.php';
}
y dentro de tu MY_PLUGIN_DIR . 'includes/helpers/admin_functions.php'
copia el get_home_path()
de 'wp-admin/includes/file.php'.
La actualización de WP tampoco causará problemas ya que esta función depende solo de funciones php y algunas funciones menores de inclusión. Así evitamos ABSPATH cuando sea necesario.
