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 root
instalació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.php
y 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.js
archivo y le permite recuperar el root
directorio 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.js
podrí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.php
puedes recuperar el wp_content_dir
y cargar tu wp-load.php
like 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_root
se 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 SHORTINIT
interior 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.php
cambios con frecuencia con los nuevos lanzamientos de versiones de WP, así que si usaSHORTINIT
asegú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 SHORTINIT
en verdadero .