Je sais que c'est une vieille question mais je voulais ajouter ma propre réponse qui, je pense, pourrait aider certains utilisateurs à essayer d'obtenir la même chose.
Oui, il est toujours préférable (et plus facile) d'utiliser l'API WP Ajax native, mais cela peut devenir très lent car il charge l'intégralité de l'instance WP.
Ma solution: est assez simple, et devrait fonctionner pour récupérer l' root
installation de wordpress. wp_register_script()
Quel que soit le script avec lequel vous effectuez l'appel AJAX personnalisé, assurez-vous tout d'abord d'enregistrer le script avec (ne pas le mettre en file d'attente pour le moment). Ensuite, utilisez wp_localize_script()
et analysez le ABSPATH
(c'est une constante qui est définie à l'intérieur wp-load.php
et qui tiendra le chemin racine). Vous pouvez maintenant récupérer cela dans votre script et l'analyser avec l'appel AJAX. Enfin, bien sûr, assurez-vous de réellement mettre le script en file d'attente avec wp_enqueue_script()
.
Exemple:
L'extrait PHP ci-dessous mettra votre script.js
fichier en file d' attente et vous permettra de récupérer le root
répertoire en appelant pluginslug_scriptname_i18n.wp_root
. Fondamentalement, le wp_localize_script()
est utilisé pour effectuer des traductions, mais cela devient également utile pour analyser les données dans votre ou vos scripts que vous avez récupérés côté serveur.
$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 );
Votre script.js
pourrait ressembler à ceci:
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);
Maintenant, à l'intérieur de votre, ajax-handler.php
vous pouvez récupérer wp_content_dir
et charger votre wp-load.php
comme ceci:
// 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();
Veuillez garder à l'esprit que le wp_root
côté client peut être modifié.
En remarque:
Une autre astuce que certains d'entre vous ne connaissent peut-être pas est qu'avant l'inclusion, wp-load.php
vous pouvez définir une constante appelée SHORTINIT
(booléenne). Cela indiquera à WordPress de charger simplement les bases (ce qui signifie que vous perdrez beaucoup de fonctions principales de WP) mais cela accélérera le temps de chargement car il n'inclura pas tous les fichiers requis pour une instance WP normale. Le SHORTINIT
est défini à l'intérieur wp-settings.php
(ouvrez simplement le fichier et recherchez SHORTINIT
. Vous aurez une meilleure compréhension de ce qui se passe sous le capot. Cette astuce astucieuse accélérera encore plus les temps de chargement (jusqu'à 75% dans mes tests que j'ai faits) il y a un certain temps). Mais cela dépendra de la version WP. Gardez également à l'esprit que les wp-load.php
changements sont fréquents avec les nouvelles versions des versions WP, donc si vous utilisezSHORTINIT
assurez-vous que votre script fonctionnera toujours, même dans les futures versions de WordPress, et également avec la version inférieure de WordPress. En bref, si vous faites des choses complexes qui reposent sur une grande partie du codex de WordPress, alors assurez - vous pas mis SHORTINIT
à vrai .