Ich weiß, dass dies eine alte Frage ist, wollte aber meine eigene Antwort hinzufügen, die meiner Meinung nach einigen Benutzern helfen könnte, das Gleiche zu erreichen.
Ja, es ist immer besser (und einfacher), die native WP Ajax-API zu verwenden, aber es kann sehr langsam werden, da die gesamte WP-Instanz geladen wird.
Meine Lösung: ist recht einfach und sollte funktionieren, um rootdie WordPress-Installation abzurufen . wp_register_script()Stellen Sie in jedem Skript, in dem Sie den benutzerdefinierten AJAX-Aufruf ausführen , sicher, dass Sie das Skript zuerst bei registrieren (stellen Sie es noch nicht in die Warteschlange). Verwenden wp_localize_script()und analysieren Sie dann die ABSPATH(dies ist eine Konstante, die im Inneren definiert ist wp-load.phpund den Root-Pfad enthält). Sie können dies jetzt in Ihrem Skript abrufen und zusammen mit dem AJAX-Aufruf analysieren. Stellen Sie schließlich sicher, dass Sie das Skript tatsächlich in die Warteschlange stellen wp_enqueue_script().
Beispiel:
Das folgende PHP-Snippet stellt Ihre script.jsDatei in die Warteschlange und ermöglicht es Ihnen, das rootVerzeichnis durch Aufrufen abzurufen pluginslug_scriptname_i18n.wp_root. Grundsätzlich wird das wp_localize_script()verwendet, um Übersetzungen durchzuführen, aber dies ist auch nützlich, um Daten in Ihre Skripte zu analysieren, die Sie serverseitig abgerufen haben.
$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 );
Du script.jskönntest so aussehen:
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);
Jetzt können ajax-handler.phpSie in Ihrem Ordner Folgendes abrufen wp_content_dirund laden wp-load.php:
// 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();
Bitte beachten Sie, dass die wp_rootClient-Seite geändert werden kann.
Als Anmerkung:
Ein weiterer Trick, den einige von Ihnen möglicherweise nicht kennen, besteht darin, dass Sie vor dem Einschließen wp-load.phpeine Konstante mit dem Namen SHORTINIT(boolean) definieren können. Dies weist WordPress an, nur die Grundlagen zu laden (was bedeutet, dass Sie viele WP-Kernfunktionen verlieren), beschleunigt jedoch die Ladezeit, da nicht alle erforderlichen Dateien für eine reguläre WP-Instanz enthalten sind. Das SHORTINITist im Inneren definiert wp-settings.php(öffnen Sie einfach die Datei und suchen Sie danach SHORTINIT. Sie haben ein besseres Verständnis dafür, was unter der Haube passiert. Dieser raffinierte Trick beschleunigt die Ladezeiten noch mehr (bis zu 75% in meinen Tests, die ich durchgeführt habe vor einiger Zeit). Dies hängt jedoch von der WP-Version ab. Beachten Sie auch, dass sich die wp-load.phpÄnderungen bei neuen Versionen von WP-Versionen häufig ändernSHORTINITStellen Sie sicher, dass Ihr Skript auch in zukünftigen Versionen von WordPress und auch in niedrigeren Versionen von WordPress immer funktioniert. Kurz gesagt, wenn Sie komplexe Dinge tun , die auf einer Menge von dem Wordpress - Kodex verlassen, dann stellen Sie sicher, nicht festgelegt SHORTINITzu wahren .