Wie kann ich wp-load.php von jedem Ort aus einbinden?
-
-
Tuesnicht.[Verwenden Sie AJAX auf die richtige Weisemit 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
-
Um das zuergänzen,was Milogesagt hat,hier sind 2großartige Beiträge zu diesem Thema.http://www.garyc40.com/2010/03/5-tips-for-using-ajax-in-wordpress/([letzte Version] (http://bit.ly/1MvLHNo)) http://ottopress.com/2010/dont-include-wp-load-please/([letzte Version] (http://bit.ly/1D5iV30)) Auch zum Lernen dieerste Diashow http://andrewnacin.com/2011/04/16/wordcamp-seattle/([letzte 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 Antworten
- Stimmen
-
- 2015-06-03
Sie können die Konstante
__DIR__
verwenden. Da sich die Dateientwederim Plugin oderim Themenordnerbefindet,die sichimmerim Ordnerwp-content
befinden. Sie könneneinfach den Pfad der Datei abrufen und alles abwp-content
davon: $path=preg_replace ('/wp-content. * $/','',__ DIR__);
Wenn Sie sicherstellenmüssen,dass sich das wpnichtin einem wp-Inhaltsordnerbefindet (wer weiß? Dingepassieren),verwenden Sie dennegativen Lookahead:
$path=preg_replace ('/wp-content (?!. * wp-content). */','',__ DIR__);
(daeseinfacherist sicherzustellen,dass sich Ihreigenes Plugin,das Sieentwickeln,nichtin einem anderen Ordnermit wp-Inhaltenbefindet)
Aaand .. Ihr
wp-load
ist da:include ($path.'wp-load.php ');
Aber!
Wiebereitserwähnt,können Siefür AJAX die WP-native Ajax-Technik verwenden.
Natürlichgibt es Fälle,in denen dienative AJAX-Technik von WPnicht ausreicht.
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` kannfehlen oder sichin einem völlig anderen Verzeichnis als WPbefinden.`wp-content` can be absent or in a completely different directory than WP.
- 3
- 2015-06-03
- fuxia
-
Diesist wahrscheinlich derbeste Weg.Wenn Sieeinen seltsamen Speicherortfür WP-Inhalte haben (unwahrscheinlich),passen Sieeinfach Ihren regulären Ausdruck an.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
Ich weiß,dass dieseine alte Frageist,wollte abermeine eigene Antwort hinzufügen,diemeiner Meinungnacheinigen Benutzern helfen könnte,dasselbe zuerreichen.
Ja,esistimmerbesser (undeinfacher),dienative WP Ajax-API zu verwenden,aberes kann sehr langsam werden,da diegesamte WP-Instanzgeladen wird.
Meine Lösung: ist rechteinfach und solltefunktionieren,um den
root
der WordPress-Installation abzurufen. Stellen Siein jedem Skript,in dem Sie denbenutzerdefinierten AJAX-Aufruf ausführen,sicher,dass Sie das Skript zuerstbeiwp_register_script ()
registrieren (nochnichtin die Warteschlange stellen). Verwenden Sie dannwp_localize_script ()
und analysieren Sie denABSPATH
(diesisteine Konstante,dieinwp-load.php
definiertist und den Stammpfadenthält ). Sie können diesjetztin Ihrem Skript abrufen und zusammenmit dem AJAX-Aufruf analysieren. Stellen Sie schließlich sicher,dass das Skripttatsächlichmitwp_enqueue_script ()
in die Warteschlangegestellt wird.Beispiel:
Dasfolgende PHP-Snippet stellt Ihre
script.js
-Dateiin die Warteschlange undermöglicht das Abrufen des Verzeichnissesroot
durch Aufrufen vonpluginslug_scriptname_i18n.wp_root
. Grundsätzlich wird derwp_localize_script ()
verwendet,um Übersetzungen durchzuführen. Diesistjedoch auchnützlich,um Datenin Ihre Skripte zu analysieren,die Sie serverseitig abgerufen haben.$ handle='pluginslug-scriptname';//Skripthandle setzen $name=str_replace ('-','_',$ handle). '_i18n';//Konvertiert das Handlein 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 HÄLT IHRE AJAX-URL :) Um diesin Ihrem script.js abzurufen,rufen Sieeinfach auf:pluginslug_scriptname_i18n.ajax_url 'wp_root'=> ABSPATH//@THIS HÄLT DEN WURZELWEG :) Um diesin Ihrem script.js abzurufen,rufen Sieeinfach auf:pluginslug_scriptname_i18n.wp_root ) ); wp_enqueue_script ($ handle);
Ihre
script.js
könntefolgendermaßen aussehen:var xhttp=new XMLHttpRequest (); xhttp.onreadystatechange=function () { if (this.readyState==4) { if (this.status==200) { //Erfolg: }} //Komplett: }} }; xhttp.onerror=function () { console.log (this); console.log ("** Während der Transaktionistein Fehler aufgetreten"); }; xhttp.open ("POST",pluginslug_scriptname_i18n.ajax_url,true); xhttp.setRequestHeader ("Inhaltstyp","application/x-www-form-urlencoded; charset=UTF-8"); varparams=JSON.stringify ({ Vorname: 'Johny', wp_root:pluginslug_scriptname_i18n.wp_root }); xhttp.send (params);
Jetzt können Siein Ihrer
ajax-handler.php
denwp_content_dir
abrufen und Ihrewp-load.php
wiefolgt laden://Richtigen Inhaltstypfestlegen Header ('Inhaltstyp: Text/HTML'); //Caching deaktivieren Header ('Cache-Control: kein Cache'); Header ('Pragma: kein Cache'); //Holen Sie sich die Nutzlast $ request_body=json_decode (file_get_contents ('php://input'),true); //Setze dies auftrue,umnur die Grundlagen zu laden! //Setzen Sie diesnur auftrue,wenn Sie wissen,was Sietun //Suche SHORTINITin wp-settings.phpfür weitere Details define ('SHORTINIT',false); //Wp-load.phpeinschließen require_once ($ request_body ['wp_root']. 'wp-load.php'); sterben();
Bittebeachten Sie,dass der
wp_root
clientseitiggeändert werden kann.Als Randnotiz:
Ein weiterer Trick,deneinige von Ihnenmöglicherweisenicht kennen,besteht darin,dass Sie vor dem Einfügen von
wp-load.php
eine Konstantemit dem NamenSHORTINIT
(boolean) definieren können. Dies weist WordPress an,nur die Grundlagen zu laden (wasbedeutet,dass Sie viele WP-Kernfunktionen verlieren),beschleunigtjedoch die Ladezeit,danicht alleerforderlichen Dateienfüreine reguläre WP-Instanzenthalten sind. DerSHORTINIT
istinwp-settings.php
definiert (öffnen Sieeinfach die Datei und suchen SienachSHORTINIT
. Sie habenein besseres Verständnis dafür,wasgeschieht unter der Haube. Dieser raffinierte Trickbeschleunigt die Ladezeitennochmehr (bis zu 75%in meinen Tests,dieich voreiniger Zeit durchgeführt habe). Dies hängtjedoch von der WP-Version ab. Beachten Sie auch,dass der <-Code > wp-load.php ändert sich häufigmit neuen Versionen von WP-Versionen. Wenn Sie alsoSHORTINIT
verwenden,stellen Sie sicher,dass Ihr Skript auchin zukünftigen Versionen von WordPress und auchmit niedrigeren Versionenimmerfunktioniert Kurzgesagt,wenn Sie komplexe Dingetun,die aufeinem Großteil des WordPress-Codexberuhen,stellen Sie sicher,dass Sie NICHTSHORTINIT
auf 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
Mit demfolgenden Code können Sie wp-load.php verwenden,um wp-load vonjedem Ort auseinzuschließen.
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' );
-
Aber wenn Sie ABSPATH-Set und Trailingslashit definiert haben,haben Sie wahrscheinlichbereits wp-load aufgenommen.But if you've got ABSPATH set and trailingslashit defined then you've probably already included wp-load.
- 2
- 2020-01-10
- Rup
Ich habeein Plugin,dasein eigenständiges PHP-Skript (myAjax.php) überein jQuery.ajax () -Skriptim Plugin aufruft.
Ichmuss denfolgenden Codein die DateimyAjax.phpeinfügen:
Ichmöchtejedocheine kugelsichere Methode zur Angabe des Pfads zu wp-load.php,falls dertatsächliche relative Pfad vonmeinem Beispiel abweicht.