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 root
die 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.php
und 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.js
Datei in die Warteschlange und ermöglicht es Ihnen, das root
Verzeichnis 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.js
kö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.php
Sie in Ihrem Ordner Folgendes abrufen wp_content_dir
und 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_root
Client-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.php
eine 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 SHORTINIT
ist 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 ändernSHORTINIT
Stellen 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 SHORTINIT
zu wahren .