Wie kann ich wp-load.php von jedem Ort aus einbinden?

10

Ich habe ein Plugin, das ein eigenständiges PHP-Skript (myAjax.php) über ein jQuery.ajax () -Skript im Plugin aufruft.

Ich muss den folgenden Code in die Datei myAjax.php einfügen:

require_once('../../../wp-load.php');

if (!is_user_logged_in()){
    die("You Must Be Logged In to Access This");
}
if( ! current_user_can('edit_files')) {
    die("Sorry you are not authorized to access this file");
}

Ich möchte jedoch eine kugelsichere Methode zum Festlegen des Pfads zu wp-load.php, falls der tatsächliche relative Pfad von meinem Beispiel abweicht.

N2Mystic
quelle
Um das zu ergänzen, was Milo gesagt hat, hier sind 2 großartige Beiträge zu diesem Thema. garyc40.com/2010/03/5-tips-for-using-ajax-in-wordpress ( letzte Version ) ottopress.com/2010/dont-include-wp-load-please ( letzte Version ) Auch zum Lernen , die erste Diashow andrewnacin.com/2011/04/16/wordcamp-seattle ( letzte Version )
Wyck

Antworten:

5

Sie können __DIR__Konstante verwenden. Da sich die Datei entweder im Plugin oder im Themenordner befindet, die sich immer im wp-contentOrdner befinden. Sie können einfach den Pfad der Datei abrufen und alles ausgehend wp-contentdavon abschneiden:

$path = preg_replace('/wp-content.*$/','',__DIR__);

Wenn Sie sicherstellen müssen, dass sich das wp nicht in einem Ordner mit wp-Inhalten befindet (wer weiß? Es passieren Dinge), verwenden Sie einen negativen Lookahead:

$path = preg_replace('/wp-content(?!.*wp-content).*/','',__DIR__);

(da es einfacher ist sicherzustellen, dass sich Ihr eigenes Plugin, das Sie entwickeln, nicht in einem anderen Ordner mit wp-Inhalten befindet)

Aaand .. dein wp-loadist da:

include($path.'wp-load.php');

Aber!

Wie bereits erwähnt, können Sie für AJAX die native Ajax-Technik von WP verwenden .

Natürlich gibt es Fälle, in denen die native AJAX-Technik von WP nicht ausreicht.

Ilia Andrienko
quelle
3
wp-contentkann fehlen oder sich in einem völlig anderen Verzeichnis als WP befinden.
Fuxia
Dies ist wahrscheinlich der beste Weg. Wenn Sie einen seltsamen Speicherort für WP-Inhalte haben (unwahrscheinlich), passen Sie einfach Ihren regulären Ausdruck an.
Pguardiario
0

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 rootdie 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.phpund 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.jsDatei in die Warteschlange und ermöglicht es Ihnen, das rootVerzeichnis 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.jskö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.phpSie in Ihrem Ordner Folgendes abrufen wp_content_dirund 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_rootClient-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.phpeine 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 SHORTINITist 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 ändernSHORTINITStellen 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 SHORTINITzu wahren .

Rens Tillmann
quelle
-1

Sie können den folgenden Code verwenden, um wp-load.php zu verwenden, um wp-load von jedem Ort aus einzuschließen

require_once( trailingslashit( ABSPATH ) .'wp-load.php' );
Nilesh Raut
quelle
2
Aber wenn Sie ABSPATH-Set und Trailingslashit definiert haben, haben Sie wahrscheinlich bereits wp-load aufgenommen.
Rup