¿Cómo incluir wp-load.php desde cualquier ubicación?

18 ago 2011, 18:48:56
Vistas: 87K
Votos: 14

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.

3
Comentarios

No lo hagas. Usa AJAX de la forma correcta en WordPress.

Milo Milo
18 ago 2011 19:00:01

Para complementar lo que dijo Milo, aquí hay 2 excelentes publicaciones sobre el tema. http://www.garyc40.com/2010/03/5-tips-for-using-ajax-in-wordpress/ (última versión ) http://ottopress.com/2010/dont-include-wp-load-please/ (última versión ) También, con fines de aprendizaje, la primera presentación http://andrewnacin.com/2011/04/16/wordcamp-seattle/ (última versión )

Wyck Wyck
18 ago 2011 19:17:14

Deberías usar un endpoint de la API REST en lugar de un archivo independiente, así obtendrás una URL limpia y no tendrás que cargar/inicializar WP. Los archivos PHP independientes como este representan un riesgo de seguridad y conllevan muchos problemas

Tom J Nowell Tom J Nowell
3 oct 2022 14:49:30
Todas las respuestas a la pregunta 5
2
11

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.

3 jun 2015 20:59:40
Comentarios

wp-content puede estar ausente o en un directorio completamente diferente al de WP.

fuxia fuxia
3 jun 2015 21:45:52

Esta es probablemente la mejor manera. Si tienes una ubicación extraña para wp-content (poco probable), simplemente ajusta tu expresión regular.

pguardiario pguardiario
27 nov 2016 04:37:16
0

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.

10 jul 2019 19:39:07
0

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
}
27 dic 2022 11:56:11
0

¿No funcionaría

include $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php';

en la mayoría de las situaciones?

WPINC y ABSPATH no están definidos en este punto (si lo están, probablemente ya se haya incluido wp-load.php, como alguien mencionó.

12 jun 2024 15:47:21
1
-1

Puedes usar el siguiente código para incluir wp-load.php desde cualquier ubicación

require_once( trailingslashit( ABSPATH ) .'wp-load.php' );
10 ene 2020 11:31:09
Comentarios

Pero si tienes ABSPATH configurado y trailingslashit definido, entonces probablemente ya hayas incluido wp-load.

Rup Rup
10 ene 2020 11:43:08