¿Cómo incluir wp-load.php desde cualquier ubicación?
Tengo un plugin que llama a un script PHP independiente (myAjax.php
) a través de un script jQuery.ajax()
dentro del plugin.
Necesito colocar el siguiente código en el archivo myAjax.php
:
require_once('../../../wp-load.php');
if (!is_user_logged_in()){
die("Debes iniciar sesión para acceder a esto");
}
if( ! current_user_can('edit_files')) {
die("Lo siento, no estás autorizado para acceder a este archivo");
}
Sin embargo, me gustaría un método más seguro para especificar la ruta a wp-load.php
en caso de que la ruta relativa real sea diferente a mi ejemplo.

Puedes usar la constante __DIR__
. Dado que el archivo está dentro de la carpeta de un plugin o tema, que siempre se encuentran dentro de la carpeta wp-content
, puedes simplemente obtener la ruta del archivo y recortar todo lo que empiece desde wp-content
:
$path = preg_replace( '/wp-content.*$/', '', __DIR__ );
Si necesitas asegurarte de que wp no está dentro de alguna carpeta wp-content
(quién sabe, cosas que pasan) - usa un lookahead negativo:
$path = preg_replace( '/wp-content(?!.*wp-content).*/', '', __DIR__ );
(ya que es más fácil estar seguro de que tu propio plugin que estás desarrollando no está dentro de otra carpeta wp-content
)
Yyy... tu wp-load
está ahí:
require_once( $path . 'wp-load.php' );
Mejor Práctica
Como se mencionó antes, para AJAX deberías usar la técnica admin-ajax de WordPress o la nueva API REST.

Sé que esta es una pregunta antigua, pero quería añadir mi propia respuesta que creo que podría ayudar a algunos usuarios que intentan lograr lo mismo.
Sí, siempre es mejor (y más fácil) usar la API AJAX nativa de WordPress, pero puede volverse muy lenta porque carga toda la instancia de WP.
Mi solución: es bastante simple y debería funcionar para recuperar el root
de la instalación de WordPress. En cualquier script donde estés haciendo la llamada AJAX personalizada, asegúrate de primero registrar el script con wp_register_script()
(no lo encoles todavía). Luego usa wp_localize_script()
y pasa la constante ABSPATH
(esta es una constante definida dentro de wp-load.php
y contendrá la ruta raíz). Ahora puedes recuperar esto dentro de tu script y pasarlo junto con la llamada AJAX. Finalmente, por supuesto, asegúrate de encolar el script con wp_enqueue_script()
.
Ejemplo:
El siguiente fragmento de PHP encolará tu archivo script.js
y te permitirá recuperar el directorio root
llamando a pluginslug_scriptname_i18n.wp_root
. Básicamente, wp_localize_script()
se usa para hacer traducciones, pero también es útil para pasar datos a tu(s) script(s) que obtuviste del lado del servidor.
$handle = 'pluginslug-scriptname'; // Establece el handle del script
$name = str_replace( '-', '_', $handle ) . '_i18n'; // Convertirá el handle a pluginslug_scriptname_i18n
wp_register_script( $handle, plugin_dir_url( __FILE__ ) . 'script.js', array(), '1.0.0', false );
wp_localize_script(
$handle,
$name,
array(
'ajax_url' => plugin_dir_url( __FILE__ ) . 'ajax-handler.php', // @ESTO CONTENDRÁ TU URL AJAX :) Para recuperar esto dentro de tu script.js simplemente llama a: pluginslug_scriptname_i18n.ajax_url
'wp_root' => ABSPATH // @ESTO CONTENDRÁ LA RUTA RAÍZ :) Para recuperar esto dentro de tu script.js simplemente llama a: pluginslug_scriptname_i18n.wp_root
)
);
wp_enqueue_script( $handle );
Tu script.js
podría verse así:
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 ){
if (this.status == 200) {
// Éxito:
}
// Completado:
}
};
xhttp.onerror = function () {
console.log(this);
console.log("** Ocurrió un error durante la transacción");
};
xhttp.open("POST", pluginslug_scriptname_i18n.ajax_url, true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
var params = JSON.stringify({
first_name: 'Johny',
wp_root: pluginslug_scriptname_i18n.wp_root
});
xhttp.send(params);
Ahora dentro de tu ajax-handler.php
puedes recuperar el wp_content_dir
y cargar tu wp-load.php
así:
// Establece el tipo de contenido adecuado
header('Content-Type: text/html');
// Deshabilita el caché
header('Cache-Control: no-cache');
header('Pragma: no-cache');
// Obtiene el payload
$request_body = json_decode( file_get_contents('php://input'), true );
// Establece esto en true para cargar solo lo básico!
// Solo establece esto en true si sabes lo que estás haciendo
// Consulta SHORTINIT dentro de wp-settings.php para más detalles
define( 'SHORTINIT', false );
// Incluye wp-load.php
require_once( $request_body['wp_root'] . 'wp-load.php' );
die();
Por favor ten en cuenta que el wp_root
puede ser alterado del lado del cliente.
Como nota adicional:
Otro truco que algunos de ustedes podrían no conocer es que antes de incluir wp-load.php
puedes definir una constante llamada SHORTINIT
(booleana). Esto le dirá a WordPress que cargue solo lo básico (lo que significa que perderás muchas funciones del núcleo de WP) pero acelerará el tiempo de carga ya que no incluirá todos los archivos requeridos para una instancia regular de WP. La constante SHORTINIT
está definida dentro de wp-settings.php
(solo abre el archivo y busca SHORTINIT
. Tendrás una mejor comprensión de lo que sucede bajo el capó. Este truco útil acelerará aún más los tiempos de carga (hasta un 75% en mis pruebas que hice hace algún tiempo). Pero esto dependerá de la versión de WP. También ten en cuenta que wp-load.php
cambia frecuentemente con nuevas versiones de WP, así que si usas SHORTINIT
asegúrate de que tu script siempre funcione incluso en futuras versiones de WordPress, y también con versiones anteriores de WordPress. En resumen, si haces cosas complejas que dependen de mucho del código de WordPress, entonces asegúrate de NO establecer SHORTINIT
en true.

Sugiero este método como una posible solución "a prueba de fallos" para encontrar la ruta hacia wp-load.php
, siempre y cuando esté en un directorio por encima de donde se ejecuta el script.
echo get_wp_abspath('wp-load.php') . PHP_EOL;
function get_wp_abspath($filename)
{
$_DIR = __DIR__; // ubicación de este script
$_FILE = $_DIR . '/' . $filename; // ruta completa/archivo
while(!file_exists($_FILE)) // si no se encuentra
{
$_DIR = dirname($_DIR); // subir un nivel (ej. ../)
$_FILE = $_DIR . '/' . $filename; // nueva ruta completa/archivo
if($_DIR == '/') return FALSE; // si llegamos al directorio raíz, fallar
}
return $_FILE; // si se encuentra el archivo, devolver ruta completa/archivo
}
