Comment inclure wp-load.php depuis n'importe quel emplacement?
-
-
Nefaispas ça.[Utilisez AJAX de labonnemanière WordPress] (http://codex.wordpress.org/AJAX_in_Plugins).Don't. [Use AJAX the proper WordPress way](http://codex.wordpress.org/AJAX_in_Plugins).
- 1
- 2011-08-18
- Milo
-
Pour ajouter à ce que Milo a dit,voici 2excellents articles sur le sujet.http://www.garyc40.com/2010/03/5-tips-for-using-ajax-in-wordpress/([dernière version] (http://bit.ly/1MvLHNo)) http://ottopress.com/2010/dont-include-wp-load-please/([dernière version] (http://bit.ly/1D5iV30)) Aussipour apprendre,lepremier diaporama http://andrewnacin.com/2011/04/16/wordcamp-seattle/([dernière version] (http://bit.ly/1MvLI3R))To add to what Milo said, here are 2 great posts on the subject. http://www.garyc40.com/2010/03/5-tips-for-using-ajax-in-wordpress/ ([last version](http://bit.ly/1MvLHNo) ) http://ottopress.com/2010/dont-include-wp-load-please/ ([last version](http://bit.ly/1D5iV30) ) Also for the sake of learning, the first slideshow http://andrewnacin.com/2011/04/16/wordcamp-seattle/ ([last version](http://bit.ly/1MvLI3R) )
- 0
- 2011-08-18
- Wyck
-
3 réponses
- votes
-
- 2015-06-03
Vouspouvez utiliser la constante
__DIR__
. Étant donné que lefichier setrouve soit dans le dossier duplugin,soit dans le dossier duthème,qui sonttoujours situés dans le dossierwp-content
./code> de celui-ci:$path=preg_replace ('/wp-content. * $/','',__ DIR__);
Si vous avezbesoin de vous assurer que le wpn'estpas dans un dossier wp-content (qui sait? des choses sepassent) - utilisez une anticipationnégative:
$path=preg_replace ('/wp-content (?!. * wp-content). */','',__ DIR__);
(carilestplusfacile d'être sûr que votrepropreplugin que vous développezne setrouvepas dans un autre dossier wp-content)
Aaand .. votre
wp-load
est là:include ($ chemin.'wp-load.php ');
Mais!
Commenous l'avons déjàmentionné,pour AJAX,vouspouvez utiliser la technique ajaxnative de WP .
Bien sûr,il y a des cas où latechnique AJAXnative de WPne suffitpas.
You can use
__DIR__
constant. Since the file is either inside plugin or theme folder, which are always located insidewp-content
folder.. You can simply get the path of the file and trim everything starting fromwp-content
from it:$path = preg_replace('/wp-content.*$/','',__DIR__);
If you need to make sure the wp is not inside some wp-content folder (who knows? things happen) - use negative lookahead:
$path = preg_replace('/wp-content(?!.*wp-content).*/','',__DIR__);
(since it's easier to be sure your own plugin you are developing is not located inside some other wp-content folder)
Aaand.. your
wp-load
is there:include($path.'wp-load.php');
But!
As guys before mentioned, for AJAX you can use WP-s native ajax technique.
Of course, there are cases when WP's native AJAX technique is not enough.
-
`wp-content`peut être absent ou dans un répertoire complètement différent de WP.`wp-content` can be absent or in a completely different directory than WP.
- 3
- 2015-06-03
- fuxia
-
C'estprobablement lemeilleurmoyen.Si vous avez unemplacement de contenu wpbizarre (peuprobable),ajustez simplement votre regex.This is probably the best way. If you have a weird wp-content location (unlikely) just adjust your regex.
- 0
- 2016-11-27
- pguardiario
-
- 2019-07-10
Je sais que c'est une vieille question,maisje voulais ajoutermapropre réponse qui,je pense,pourrait aider certains utilisateurs àessayer d'atteindre lamême chose.
Oui,ilesttoujourspréférable (etplusfacile) d'utiliser l'API WP Ajaxnative,mais celapeut devenirtrès lent caril chargetoute l'instance WP.
Ma solution: est assez simpleet devraitfonctionnerpour récupérer la
racine
de l'installation wordpress. Quel que soit le scriptpour lequel vouseffectuez l'appel AJAXpersonnalisé,assurez-vous simplement d'enregistrer d'abord le script avecwp_register_script ()
(ne lemettezpasencoreen file d'attente). Ensuite,utilisezwp_localize_script ()
et analysez leABSPATH
(c'est une constante quiest définie danswp-load.php
et contiendra le chemin racine ). Vouspouvezmaintenant le récupérer dans votre scriptet l'analyser avec l'appel AJAX. Enfin,assurez-vousbien sûr demettre le scripten file d'attente avecwp_enqueue_script ()
.<₹Example:
L'extrait PHP ci-dessousmettraen file d'attente votrefichier
script.js
et vouspermettra de récupérer le répertoireroot
en appelantpluginslug_scriptname_i18n.wp_root
. Fondamentalement,wp_localize_script ()
est utilisépourfaire destraductions,mais cela devient égalementpratiquepour analyser les données dans vos scripts que vous avez récupérés côté serveur.$ handle='pluginslug-scriptname';//Définir lapoignée de script $name=str_replace ('-','_',$ handle). '_i18n';//Convertira le handleen pluginslug_scriptname_i18n wp_register_script ($ handle,plugin_dir_url (__FILE__). 'script.js',array (),'1.0.0',false); wp_localize_script ( $ handle, $nom, tableau ( 'ajax_url'=>plugin_dir_url (__FILE__). 'ajax-handler.php',//@THIS TENERA VOTRE URL AJAX :) Pour récupérer ceci dans votre script.js appelez simplement:pluginslug_scriptname_i18n.ajax_url 'racine_wp'=> ABSPATH//@THIS HOLD THE ROOT PATH :) Pour récupérer ceci dans votre script.js,appelez simplement: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) { //Succès: } //Achevée: } }; xhttp.onerror=function () { console.log (ceci); console.log ("** Uneerreur s'estproduite lors de latransaction"); }; xhttp.open ("POST",pluginslug_scriptname_i18n.ajax_url,true); xhttp.setRequestHeader ("Content-type","application/x-www-form-urlencoded; charset=UTF-8"); varparams=JSON.stringify ({ prénom: 'Johny', racine_wp:pluginslug_scriptname_i18n.wp_root }); xhttp.send (paramètres);
Maintenant,dans votre
ajax-handler.php
,vouspouvez récupérer lewp_content_dir
et charger votrewp-load.php
comme ceci://Définir letype de contenu approprié header ('Content-Type:text/html'); //Désactiver lamiseen cache en-tête ('Cache-Control:no-cache'); en-tête ('Pragma:no-cache'); //Récupère la charge utile $ request_body=json_decode (file_get_contents ('php://input'),true); //Définissez ceci surtruepour charger simplement lesbases! //Définissez ceci uniquement surtrue si vous savez ce que vousfaites //Recherchez SHORTINIT dans wp-settings.phppourplus de détails define ('SHORTINIT',faux); //Inclut wp-load.php require_once ($ request_body ['racine_wp']. 'wp-load.php'); mourir();
Gardez à l'esprit que la
racine_wp
peut êtremodifiée côté client.Enguise de remarque:
Une autre astuce dont certains d'entre vousne sontpeut-êtrepas conscientsest qu'avant d'inclure
wp-load.php
,vouspouvez définir une constante appeléeSHORTINIT
(booléen). Cela dira à WordPress de charger simplement lesbases (ce qui signifie que vousperdrezbeaucoup defonctionsprincipales de WP)mais cela accélérera letemps de chargement cariln'inclurapastous lesfichiers requispour uneinstance WP régulière. LeSHORTINIT
est défini danswp-settings.php
(ouvrez simplement lefichieret cherchezSHORTINIT
. Vous aurez unemeilleure compréhension de ce sepasse sous le capot. Cette astuce astucieuse accéléreraencoreplus lestemps de chargement (jusqu'à 75% dansmestests quej'aieffectuésil y a quelquetemps). Mais cela dépendra de la version WP. Gardez également à l'esprit que lewp-load.php
changefréquemment avec lesnouvelles versions des versions WP,donc si vous utilisezSHORTINIT
assurez-vous que votre scriptfonctionneratoujoursmême dans lesfutures versions de WordPress,et aussi avec des versionsinférieures version de WordPress. Enbref,si vousfaites des choses complexes qui reposent sur unegrandepartie du codex WordPress,assurez-vous de PAS définirSHORTINIT
sur true .I know this is an old question but wanted to add my own answer which I think might help some users trying to achieve the same thing.
Yes it's always better (and easier) to use the native WP Ajax API, but it can become very slow because it loads the entire WP instance.
My solution: is quite simple, and should work to retrieve the
root
of the wordpress installation. In whatever script you are doing the custom AJAX call, just make sure you first register the script withwp_register_script()
(don't enqueue it yet). Then usewp_localize_script()
and parse theABSPATH
(this is a constant that is defined insidewp-load.php
and will hold the root path). You can now retrieve this inside your script and parse it along with the AJAX call. Finally of course make sure to actually enqueue the script withwp_enqueue_script()
.Example:
The below PHP snippet will enqueue your
script.js
file, and allows you to retrieve theroot
dir by callingpluginslug_scriptname_i18n.wp_root
. Basically thewp_localize_script()
is used to do translations, but this also becomes in handy to parse data into your script(s) that you retrieved server side.$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 );
Your
script.js
could look like this: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);
Now inside your
ajax-handler.php
you can retrieve thewp_content_dir
and load yourwp-load.php
like so:// 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();
Please keep in mind that the
wp_root
can be altered client side.As a side note:
Another trick that some of you might not be aware of is that before including
wp-load.php
you can define a constant calledSHORTINIT
(boolean). This will tell WordPress to just load the basics (meaning you will lose a lot of WP core functions) but it will speed up the loading time since it won't include all the required files for a regular WP instance. TheSHORTINIT
is defined insidewp-settings.php
(just open up the file and look forSHORTINIT
. You will have a better understanding of what is happening under the hood. This nifty trick will speed up the load times even more (up to 75% in my tests that I did some time ago). But this will depend on the WP version. Also keep in mind that thewp-load.php
changes frequently with new releases of WP versions, so if you useSHORTINIT
be sure that your script will always work even in future versions of WordPress, and also with lower version of WordPress. In short, if you do complex things that rely on a lot of the WordPress codex, then make sure to NOT setSHORTINIT
to true. -
- 2020-01-10
Vouspouvez utiliser le code ci-dessouspour utiliser wp-load.phppourinclure wp-load depuisn'importe quelendroit
require_once( trailingslashit( ABSPATH ) .'wp-load.php' );
You can use below code to use wp-load.php to include wp-load from any location
require_once( trailingslashit( ABSPATH ) .'wp-load.php' );
-
Mais si vous avez défini ABSPATHet trailingslashit,vous avezprobablement déjàinclus wp-load.But if you've got ABSPATH set and trailingslashit defined then you've probably already included wp-load.
- 2
- 2020-01-10
- Rup
J'ai unplugin qui appelle un script PHP autonome (myAjax.php) via un scriptjQuery.ajax () à l'intérieur duplugin.
Je doisplacer le code suivant dans lefichiermyAjax.php:
Cependant,j'aimerais uneméthodeplusfiablepour spécifier le chemin vers wp-load.php au cas où le chemin relatif réel serait différent demonexemple.