So che questa è una vecchia domanda, ma volevo aggiungere la mia risposta, che penso possa aiutare alcuni utenti a cercare di ottenere la stessa cosa.
Sì, è sempre meglio (e più semplice) utilizzare l'API Ajax WP nativa, ma può diventare molto lenta perché carica l'intera istanza WP.
La mia soluzione: è abbastanza semplice e dovrebbe funzionare per recuperare l' root
installazione di wordpress. In qualunque script tu stia eseguendo la chiamata AJAX personalizzata, assicurati di registrare prima lo script wp_register_script()
(non accodarlo ancora). Quindi utilizzare wp_localize_script()
e analizzare il ABSPATH
(questa è una costante che è definita all'interno wp-load.php
e conterrà il percorso di root). Ora puoi recuperarlo all'interno del tuo script e analizzarlo insieme alla chiamata AJAX. Infine, assicurati di accodare effettivamente la sceneggiatura con wp_enqueue_script()
.
Esempio:
Lo snippet PHP seguente accoderà il tuo script.js
file e ti permetterà di recuperare la directory root
chiamando pluginslug_scriptname_i18n.wp_root
. Fondamentalmente wp_localize_script()
viene usato per fare traduzioni, ma questo diventa anche utile per analizzare i dati negli script che hai recuperato sul lato server.
$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 );
Potresti script.js
assomigliare a questo:
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);
Ora dentro di ajax-handler.php
te puoi recuperare wp_content_dir
e caricare il tuo wp-load.php
like così:
// 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();
Tieni presente che è wp_root
possibile modificare il lato client.
Come nota a margine:
Un altro trucco di cui alcuni di voi potrebbero non essere consapevoli è che prima di includere wp-load.php
è possibile definire una costante chiamata SHORTINIT
(booleana). Questo dirà a WordPress di caricare solo le basi (il che significa che perderai molte funzioni principali di WP) ma accelererà il tempo di caricamento poiché non includerà tutti i file richiesti per un'istanza WP normale. L' SHORTINIT
interno è definito wp-settings.php
(basta aprire il file e cercare SHORTINIT
. Si avrà una migliore comprensione di ciò che sta accadendo sotto il cofano. Questo trucco nifty permetterà di accelerare i tempi di caricamento ancora di più (fino al 75% nel mio test che ho fatto qualche tempo fa). Ciò dipenderà dalla versione di WP. Inoltre, tieni presente che le wp-load.php
modifiche cambiano spesso con le nuove versioni delle versioni di WP, quindi se usiSHORTINIT
assicurati che lo script funzioni sempre anche nelle versioni future di WordPress e anche con una versione inferiore di WordPress. In breve, se fai cose complesse che dipendono molto dal codice WordPress, assicurati di NON impostare SHORTINIT
su true .