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

11

Tengo un complemento que llama a un script php independiente (myAjax.php) a través de un script jQuery.ajax () dentro del complemento.

Necesito colocar el siguiente código en el archivo myAjax.php:

require_once('../../../wp-load.php');

if (!is_user_logged_in()){
    die("You Must Be Logged In to Access This");
}
if( ! current_user_can('edit_files')) {
    die("Sorry you are not authorized to access this file");
}

Sin embargo, me gustaría un método más a prueba de balas para especificar la ruta a wp-load.php en caso de que la ruta relativa real sea diferente a mi ejemplo.

N2Mystic
fuente
Para agregar a lo que dijo Milo, aquí hay 2 excelentes publicaciones sobre el tema. garyc40.com/2010/03/5-tips-for-using-ajax-in-wordpress ( última versión ) ottopress.com/2010/dont-include-wp-load-please ( última versión ) También en aras del aprendizaje , la primera presentación de diapositivas andrewnacin.com/2011/04/16/wordcamp-seattle ( última versión )
Wyck

Respuestas:

5

Puedes usar __DIR__constante. Dado que el archivo está dentro del complemento o la carpeta de temas, que siempre se encuentran dentro de la wp-contentcarpeta ... Simplemente puede obtener la ruta del archivo y recortar todo a partir wp-contentde él:

$path = preg_replace('/wp-content.*$/','',__DIR__);

Si necesita asegurarse de que el wp no esté dentro de una carpeta de contenido de wp (¿quién sabe? Las cosas suceden), use una búsqueda negativa:

$path = preg_replace('/wp-content(?!.*wp-content).*/','',__DIR__);

(dado que es más fácil asegurarse de que su propio complemento que está desarrollando no se encuentra dentro de otra carpeta wp-content)

Aaand .. tu wp-loadestá ahí:

include($path.'wp-load.php');

¡Pero!

Como se mencionó anteriormente, para AJAX puedes usar la técnica ajax nativa de WP-s .

Por supuesto, hay casos en que la técnica AJAX nativa de WP no es suficiente.

Ilia Andrienko
fuente
3
wp-contentpuede estar ausente o en un directorio completamente diferente que WP.
fuxia
Esta es probablemente la mejor manera. Si tiene una ubicación extraña de contenido de wp (poco probable) simplemente ajuste su expresión regular.
pguardiario
0

Sé que esta es una pregunta antigua, pero quería agregar 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 WP Ajax nativa, pero puede volverse muy lenta porque carga toda la instancia de WP.

Mi solución: es bastante simple, y debería funcionar para recuperar la rootinstalación de WordPress. En cualquier script que esté haciendo la llamada AJAX personalizada, solo asegúrese de registrar primero el script wp_register_script()(no lo ponga en cola todavía). Luego use wp_localize_script()y analice el ABSPATH(esta es una constante que se define dentro wp-load.phpy mantendrá la ruta raíz). Ahora puede recuperar esto dentro de su script y analizarlo junto con la llamada AJAX. Finalmente, por supuesto, asegúrese de poner en cola el script con wp_enqueue_script().

Ejemplo:

El siguiente fragmento de PHP pondrá en cola su script.jsarchivo y le permite recuperar el rootdirectorio llamando pluginslug_scriptname_i18n.wp_root. Básicamente, wp_localize_script()se usa para hacer traducciones, pero esto también es útil para analizar los datos en sus scripts que recuperó del lado del servidor.

        $handle = 'pluginslug-scriptname'; // Set script handle
        $name = str_replace( '-', '_', $handle ) . '_i18n'; // Will convert handle to 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', // @THIS WILL HOLD YOUR AJAX URL :) To retrieve this inside your script.js simply call: pluginslug_scriptname_i18n.ajax_url
                'wp_root' => ABSPATH // @THIS WILL HOLD THE ROOT PATH :) To retrieve this inside your script.js simply call: pluginslug_scriptname_i18n.wp_root
            )
        );
        wp_enqueue_script( $handle );

Tu script.jspodrías lucir así:

    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 ){
            if (this.status == 200) {
                // Success:
            }
            // Complete:
        }
    };
    xhttp.onerror = function () {
      console.log(this);
      console.log("** An error occurred during the transaction");
    };
    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.phppuedes recuperar el wp_content_diry cargar tu wp-load.phplike así:

// Set proper content type
header('Content-Type: text/html');
// Disable caching
header('Cache-Control: no-cache');
header('Pragma: no-cache');
// Get's the payload
$request_body = json_decode( file_get_contents('php://input'), true );  

// Set this to true to just load the basics!
// Only set this to true if you know what you are doing
// Lookup SHORTINIT inside wp-settings.php for more details
define( 'SHORTINIT', false ); 

// Include wp-load.php
require_once( $request_body['wp_root'] . 'wp-load.php' );
die();

Tenga en cuenta que wp_rootse puede modificar el lado del cliente.

Como nota al margen:

Otro truco del que algunos de ustedes quizás no se den cuenta es que antes de incluirlo wp-load.php, pueden definir una constante llamada SHORTINIT(boolean). Esto le indicará a WordPress que solo cargue los elementos básicos (lo que significa que perderá muchas funciones principales de WP), pero acelerará el tiempo de carga ya que no incluirá todos los archivos necesarios para una instancia de WP normal. El SHORTINITinterior está definido wp-settings.php(solo abre el archivo y busca SHORTINIT. Tendrás una mejor comprensión de lo que está sucediendo debajo del capó. Este ingenioso truco acelerará los tiempos de carga aún más (hasta un 75% en mis pruebas que hice) hace algún tiempo). Pero esto dependerá de la versión de WP. También tenga en cuenta que los wp-load.phpcambios con frecuencia con los nuevos lanzamientos de versiones de WP, así que si usaSHORTINITasegúrese de que su script siempre funcione incluso en futuras versiones de WordPress, y también con una versión inferior de WordPress. En resumen, si haces cosas complejas que dependen de gran parte del códice de WordPress, entonces asegúrate de NO establecerlo SHORTINITen verdadero .

Rens Tillmann
fuente
-1

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

require_once( trailingslashit( ABSPATH ) .'wp-load.php' );
Nilesh Raut
fuente
2
Pero si tiene el conjunto ABSPATH y trailingslashit definidos, entonces probablemente ya haya incluido wp-load.
Rup