¿Cuál es la diferencia entre get_home_path() y ABSPATH?

15 may 2015, 14:53:05
Vistas: 34.1K
Votos: 33

¿Cuál es la diferencia entre get_home_path() y ABSPATH? ¿No es el propósito de ambos apuntar a la raíz de la instalación de WordPress?

0
Todas las respuestas a la pregunta 3
3
41

Ellos deberían hacer lo mismo, pero bajo ciertas condiciones, puede que no.

Primero, ten en cuenta:

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,

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

15 may 2015 16:49:17
Comentarios

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.

luukvhoudt luukvhoudt
13 feb 2018 22:28:02

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

Adam Adam
19 mar 2018 10:01:18

Esta solución estaba bien explicada y funcionó exactamente como se deseaba después de que WP mostrara el error "not defined". Gracias ;)

Chris Sprague Chris Sprague
9 jul 2018 15:39:50
0

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.

11 jun 2022 08:27:07
0
-1

Estoy usando home_url() para enlazar a la página de "Inicio" de WordPress. A veces, site_url() puede no ser realmente tu home_url(). Puedes definir una página específica como página de inicio en WordPress.

23 jul 2018 13:20:00