Come includere wp-load.php da qualsiasi posizione?
-
-
Nonfarlo.[Usa AJAXnelmodo corretto di 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
-
Per aggiungere a ciò che ha detto Milo,ecco 2 ottimipost sull'argomento.http://www.garyc40.com/2010/03/5-tips-for-using-ajax-in-wordpress/([ultima versione] (http://bit.ly/1MvLHNo)) http://ottopress.com/2010/dont-include-wp-load-please/([ultima versione] (http://bit.ly/1D5iV30)) Anchepermotivi di apprendimento,ilprimo slideshow http://andrewnacin.com/2011/04/16/wordcamp-seattle/([ultima versione] (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 risposta
- voti
-
- 2015-06-03
Puoi utilizzare la costante
__DIR__
. Poichéilfile sitrova all'interno della cartella delplugin o deltema,che sitrovano sempre all'interno della cartellawp-content
.. Puoi semplicemente ottenereilpercorso delfilee tagliaretutto apartire dawp-content
daesso:$path = preg_replace('/wp-content.*$/','',__DIR__);
Se devi assicurarti cheilfile wpnon sia all'interno di una cartella del contenuto di wp (chi lo sa? accadono cose),usa un lookaheadnegativo:
$path = preg_replace('/wp-content(?!.*wp-content).*/','',__DIR__);
(poiché èpiùfacileessere sicuri cheilproprioplugin che si sta sviluppandonon sitrovi all'interno di qualche altra cartella di contenuto wp)
Aae ..iltuo
wp-load
è lì:include($path.'wp-load.php');
Ma!
Come ragazziprima accennato,per AJAXpuoi usare la tecnica ajaxnativa di WP-s .
Ovviamente,ci sono casiin cui latecnica AJAXnativa di WPnon è sufficiente.
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`puòessere assente oin una directory completamente diversa da WP.`wp-content` can be absent or in a completely different directory than WP.
- 3
- 2015-06-03
- fuxia
-
Questo èprobabilmenteilmodomigliore.Se hai una stranaposizione del contenuto wp (improbabile),regola latua 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
So che questa è una vecchia domanda,ma volevo aggiungere lamia risposta chepensopotrebbe aiutare alcuni utenti che cercano di ottenere lo stesso risultato.
Sì,è sempremeglio (epiùfacile) utilizzare l'API Ajax di WPnativa,mapuò diventaremolto lentoperché carica l'interaistanza di WP.
Lamia soluzione: è abbastanza semplicee dovrebbefunzionareper recuperare la
root
dell'installazione di wordpress. In qualsiasi scripttu stiaeseguendo la chiamata AJAXpersonalizzata,assicurati di registrareprima lo script conwp_register_script ()
(non accodarlo ancora). Quindi usawp_localize_script ()
e analizzaABSPATH
(questaèuna costante definita all'interno diwp-load.php
e manterràilpercorso root ). Orapuoi recuperarlo all'interno deltuo scripte analizzarloinsieme alla chiamata AJAX. Infine,ovviamente,assicurati di accodareeffettivamente lo script conwp_enqueue_script ()
.<"Esempio :"
Lo snippet PHP di seguito accoderàiltuofile
script.js
e ti consentirà di recuperare la directoryroot
chiamandopluginslug_scriptname_i18n.wp_root
. Fondamentalmentewp_localize_script ()
viene utilizzatopereseguiretraduzioni,ma questo diventa anche utileper analizzarei datinegli script che hai recuperato lato server.$ handle='pluginslug-scriptname';//Imposta l'handle dello script $name=str_replace ('-','_',$ handle). '_i18n';//Converte l'handlein pluginslug_scriptname_i18n wp_register_script ($ handle,plugin_dir_url (__FILE__). 'script.js',array (),'1.0.0',false); wp_localize_script ( $ handle, $name, Vettore( 'ajax_url'=>plugin_dir_url (__FILE__). 'ajax-handler.php',//@THIS MANTERRÀ IL TUO URL AJAX :) Per recuperarlo all'interno deltuo script.js chiama semplicemente:pluginslug_scriptname_i18n.ajax_url "wp_root"=> ABSPATH//@THIS HOLD THE ROOT PATH :) Per recuperarlo all'interno deltuo script.js chiama semplicemente:pluginslug_scriptname_i18n.wp_root ) ); wp_enqueue_script ($ handle);
Iltuo
script.js
potrebbe avere questo aspetto:var xhttp=new XMLHttpRequest (); xhttp.onreadystatechange=function () { if (this.readyState==4) { if (this.status==200) { //Successo: } //Completare: } }; xhttp.onerror=function () { console.log (questo); console.log ("** Si è verificato unerrore durante latransazione"); }; xhttp.open ("POST",pluginslug_scriptname_i18n.ajax_url,true); xhttp.setRequestHeader ("Content-type","application/x-www-form-urlencoded; charset=UTF-8"); varparams=JSON.stringify ({ first_name: "Johny", wp_root:pluginslug_scriptname_i18n.wp_root }); xhttp.send (params);
Ora all'interno deltuo
ajax-handler.php
puoi recuperarewp_content_dir
e caricareiltuowp-load.php
in questomodo://Impostailtipo di contenuto appropriato header ('Content-Type:text/html'); //Disabilita lamemorizzazionenella cache header ('Cache-Control:no-cache'); intestazione ("Pragma:no-cache"); //Prendiil carico utile $ request_body=json_decode (file_get_contents ('php://input'),true); //Impostalo sutrueper caricare solo lebasi! //Impostalo sutrue solo se sai cosa staifacendo //Cerca SHORTINIT all'interno di wp-settings.phppermaggiori dettagli define ('SHORTINIT',false); //Include wp-load.php require_once ($ request_body ['wp_root']. 'wp-load.php'); morire();
Tienipresente che
wp_root
puòesseremodificato dal lato client.Comenota amargine:
Un altrotrucco di cui alcuni di voipotrebberononessere consapevoli è cheprima diincludere
wp-load.php
potete definire una costante chiamataSHORTINIT
(booleano). Questo dirà a WordPress di caricare solo lebasi (il che significa cheperderaimolte dellefunzioniprincipali di WP)ma accelereràiltempo di caricamentopoichénonincluderàtuttii file richiestiper unanormaleistanza di WP.SHORTINIT
è definito all'interno diwp-settings.php
(basta aprireilfilee cercareSHORTINIT
. Avrai unamigliore comprensione di cosa sta accadendo sottoil cofano. Questoingegnosotrucco velocizzerà ulteriormentei tempi di caricamento (fino al 75%nei mieitest che hofatto qualchetempofa). Ma questo dipenderà dalla versione WP. Tieniinoltrepresente cheilwp-load.php
cambiafrequentemente con lenuove versioni di versioni di WP,quindi se usiSHORTINIT
assicurati cheiltuo scriptfunzionerà sempre anchenelle versionifuture di WordPress,e anche con versioniinferiori versione di WordPress. Inbreve,seesegui operazioni complesse che sibasano sugranparte del codice WordPress,assicurati di NON impostareSHORTINIT
su 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
Puoi utilizzareil codice seguenteper utilizzare wp-load.phpperincludere wp-load da qualsiasiposizione
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' );
-
Ma se haiimpostato ABSPATHe trailingslashit,probabilmente haigiàincluso 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
Ho unplugin che chiama uno scriptphp autonomo (myAjax.php)tramite uno scriptjQuery.ajax () all'interno delplugin.
Hobisogno diinserireil seguente codicenelfilemyAjax.php:
Tuttavia,mi piacerebbe unmetodopiù aprova diproiettileper specificareilpercorso di wp-load.phpnel casoin cuiilpercorso relativoeffettivo sia diverso dalmioesempio.