it-swarm.com.de

Eine Plugin-Datei per URL-Rewrite zugänglich machen?

In meinem WordPress-Plugin habe ich eine PHP-Datei, die einige Statistiken über das Blog generiert und diese als einfache Textdatei ausgibt. So greifen Sie auf WordPress-Funktionen zu:

define('WP_USE_THEMES', false);
require(dirname(__FILE__) . '/../../../wp-blog-header.php');

Jetzt möchte ich die eigentliche URL verstecken, da sie sich im Verzeichnis wp-content/plugins befindet und durch etwas Schönes und Kurzes ersetzen:

http://example.com/wp-content/plugin/data-fetcher/list-data.php

-> rewrite to http://example.com/list-data

Ich habe dies zu .htaccess hinzugefügt:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^list-data$ wp-content/plugins/data-fetcher/list-data.php [L]
</IfModule>

Das Problem: Wenn ich auf die kurze URL zugreife, erhalte ich eine permanente 301-Umleitung, bevor ich auf der Seite lande. Dies bedeutet, dass die URL wp-content/plugins/... im Browser angezeigt wird.

Ich vermute, dass WordPress dies irgendwie initiiert. Die Umschreiberegel funktioniert gut für Bilder und einfache PHP-Dateien (d. H. Ohne WP include/require).

Ist meine Annahme richtig? Wie kann ich verhindern, dass WordPress die Weiterleitung sendet?

6
Mark

Kennzeichen,

Ich hasse es, es zu sagen, aber du machst das falsch. Auf PHP Dateien in Ihrem Plug-In sollte nie direkt auf diese Weise zugegriffen werden. Stattdessen sollten sie wie alles andere auch aus WordPress heraus geladen werden.

Hier sind einige alternative Wege, die Sie einschlagen könnten:

Erstelle eine Admin-Seite, die deine Statistiken anzeigt

Dies ist eine Seite, auf die nur authentifizierte Benutzer in WordPress zugreifen können. Wenn Sie die richtige API verwenden, sieht diese Seite sehr sauber aus und zeigt Ihre einfachen Statistiken an, wie Sie möchten. Da es sich zunächst um WordPress handelt, haben Sie bereits Zugriff auf die gesamte WP -API, ohne wp-blog-header.php direkt laden zu müssen.

Verwenden Sie Ihr vorhandenes System, aber registrieren Sie das Umschreiben mit WordPress

Sie sollten Ihre .htaccess-Datei niemals direkt ändern. Diese Datei kann geändert werden, wenn Sie neue Plug-Ins hinzufügen oder Ihre Permalink-Struktur ändern. Dies bedeutet, dass Sie Ihre Anpassungen verlieren. Stattdessen können Sie ein benutzerdefiniertes Umschreiben erstellen, indem Sie in WordPress selbst einen Funktionsaufruf ausführen:

add_action( 'init', 'my_rewrite' );
function my_rewrite() {
    global $wp_rewrite;

    add_rewrite_rule('list-data/$', WP_PLUGIN_URL . '/data-fetcher/list-data.php', 'top');
    $wp_rewrite->flush_rules(true);  // This should really be done in a plugin activation
}

Dadurch wird Ihre benutzerdefinierte Regel an die Spitze der WordPress-Umschreiberegeln gesetzt und alle anderen Umleitungen von WordPress-Übereinstimmungen gegen die reguläre Ausdrucksweise sollten übersprungen werden.

Ein großartiges Beispiel dafür, wie Sie diese Art des einfachen Umschreibens in einem Plug-In implementieren können, finden Sie in Ozhs Tutorial zum Umleiten einer hübschen Anmelde-URL:

6
EAMann

Sie können auch eine benutzerdefinierte Variable in WordPress festlegen, wenn auf Ihre URL zugegriffen wird. Sie können später nach dieser Variablen suchen und, falls vorhanden, alles tun, was Sie möchten.

In diesem Beispiel verwenden wir wpse6891_stats als unsere Variable.

// Register a URL that will set this variable to true
add_action( 'init', 'wpse6891_init' );
function wpse6891_init() {
    add_rewrite_rule( '^stats$', 'index.php?wpse6891_stats=true', 'top' );
}

// But WordPress has a whitelist of variables it allows, so we must put it on that list
add_action( 'query_vars', 'wpse6891_query_vars' );
function wpse6891_query_vars( $query_vars )
{
    $query_vars[] = 'wpse6891_stats';
    return $query_vars;
}

// If this is done, we can access it later
// This example checks very early in the process:
// if the variable is set, we include our page and stop execution after it
add_action( 'parse_request', 'wpse6891_parse_request' );
function wpse6891_parse_request( &$wp )
{
    if ( array_key_exists( 'wpse6891_stats', $wp->query_vars ) ) {
        include( dirname( __FILE__ ) . '/stats.php' );
        exit();
    }
}

Sie können die Prüfung auch später mit get_query_var( 'wpse6891_stats' ) durchführen.

9
Jan Fabry