it-swarm.com.de

Wie erstelle ich eine "virtuelle" Seite in WordPress?

Ich versuche, einen benutzerdefinierten API-Endpunkt in WordPress zu erstellen, und ich muss Anforderungen an eine virtuelle Seite im Stammverzeichnis von WordPress auf eine aktuelle Seite umleiten, die mit meinem Plug-in geliefert wird. Grundsätzlich werden also alle Anforderungen an die eine Seite an die andere weitergeleitet.

Beispiel:
http://mysite.com/my-api.php => http://mysite.com/wp-content/plugins/my-plugin/my-api.php

Das Ziel ist es, die URL für den API-Endpunkt so kurz wie möglich zu halten (ähnlich wie bei http://mysite.com/xmlrpc.php), aber die eigentliche API-Endpunktdatei mit dem Plug-In zu versenden, anstatt dass der Benutzer Dateien in seiner Installation und/oder seinem Hack verschieben muss Ader.

Mein erster Versuch war das Hinzufügen einer benutzerdefinierten Regel zum Umschreiben. Dies hatte jedoch zwei Probleme.

  1. Der Endpunkt hatte immer einen abschließenden Schrägstrich. Es wurde http://mysite.com/my-api.php/
  2. Meine Umschreiberegel wurde immer nur teilweise angewendet. Es würde nicht zu wp-content/plugins... umleiten, es würde zu index.php&wp-content/plugins... umleiten. Dies führte dazu, dass WordPress entweder einen Fehler bei der Anzeige einer nicht gefundenen Seite oder lediglich die Startseite als Standard anzeigt.

Ideen? Vorschläge?

50
EAMann

Es gibt zwei Arten von Umschreiberegeln in WordPress: interne Regeln (in der Datenbank gespeichert und von WP :: parse_request () analysiert) und externe Regeln (in .htaccess gespeichert und von Apache analysiert). Sie können eine der beiden Möglichkeiten wählen, je nachdem, wie viel WordPress Sie in Ihrer aufgerufenen Datei benötigen.

Externe Regeln:

Die externe Regel ist am einfachsten einzurichten und zu befolgen. Es wird my-api.php in Ihrem Plugin-Verzeichnis ausführen, ohne etwas von WordPress zu laden.

add_action( 'init', 'wpse9870_init_external' );
function wpse9870_init_external()
{
    global $wp_rewrite;
    $plugin_url = plugins_url( 'my-api.php', __FILE__ );
    $plugin_url = substr( $plugin_url, strlen( home_url() ) + 1 );
    // The pattern is prefixed with '^'
    // The substitution is prefixed with the "home root", at least a '/'
    // This is equivalent to appending it to `non_wp_rules`
    $wp_rewrite->add_external_rule( 'my-api.php$', $plugin_url );
}

Interne Regeln:

Die interne Regel erfordert etwas mehr Arbeit: Zuerst fügen wir eine Umschreiberegel hinzu, die eine Abfragevariable hinzufügt, dann machen wir diese Abfragevariable öffentlich und müssen dann prüfen, ob diese Abfragevariable vorhanden ist, um das Steuerelement an unsere Plug-in-Datei zu übergeben. Wenn wir dies tun, ist die übliche WordPress-Initialisierung abgeschlossen (wir brechen unmittelbar vor der regulären Post-Abfrage ab).

add_action( 'init', 'wpse9870_init_internal' );
function wpse9870_init_internal()
{
    add_rewrite_rule( 'my-api.php$', 'index.php?wpse9870_api=1', 'top' );
}

add_filter( 'query_vars', 'wpse9870_query_vars' );
function wpse9870_query_vars( $query_vars )
{
    $query_vars[] = 'wpse9870_api';
    return $query_vars;
}

add_action( 'parse_request', 'wpse9870_parse_request' );
function wpse9870_parse_request( &$wp )
{
    if ( array_key_exists( 'wpse9870_api', $wp->query_vars ) ) {
        include 'my-api.php';
        exit();
    }
    return;
}
54
Jan Fabry

Das hat bei mir funktioniert. Ich habe die Rewrite-API nie angerührt, bin aber immer bereit, neue Wege zu beschreiten. Folgendes funktionierte auf meinem Testserver für 3.0 in einem Unterordner von localhost. Ich sehe kein Problem, wenn WordPress im Webroot installiert ist.

Legen Sie diesen Code einfach in einem Plugin ab und laden Sie die Datei "taco-kittens.php" direkt in den Plugin-Ordner hoch. Sie müssen einen Hard Flush für Ihre Permalinks schreiben. Ich denke, sie sagen, dass die beste Zeit dafür die Aktivierung des Plugins ist.

function taco_kitten_rewrite() {
    $url = str_replace( trailingslashit( site_url() ), '', plugins_url( '/taco-kittens.php', __FILE__ ) );
    add_rewrite_rule( 'taco-kittens\\.php$', $url, 'top' );
}
add_action( 'wp_loaded', 'taco_kitten_rewrite' );

Beste Grüße, -Mike

11
mfields

Gibt es einen Grund, stattdessen nicht so etwas zu tun?

http://meinesite.com/?my-api=1

Dann binde dein Plugin einfach in 'init' ein und überprüfe, ob die Variable get ist. Wenn es existiert, tue was dein Plugin tun muss und sterbe ()

8
Will Anderson

Ich verstehe Ihre Fragen möglicherweise nicht vollständig, aber würde ein einfacher Shortcode Ihr Problem lösen?

Schritte:

  1. Lassen Sie den Kunden eine Seite erstellen, d. H. http://meinesite.com/mein-api
  2. Lassen Sie den Client auf dieser Seite einen Shortcode hinzufügen, d. H. [My-api-shortcode].

Die neue Seite fungiert als API-Endpunkt und Ihr Shortcode sendet Anfragen an Ihren Plugin-Code unter http://mysite.com/wp-content/plugins/my-plugin/my-api.php .

(Das bedeutet natürlich, dass in my-api.php der Shortcode definiert ist.)

Sie können wahrscheinlich die Schritte 1 und 2 über das Plugin automatisieren.

3
rexposadas

Ich benutze einen anderen Ansatz, der darin besteht, die Homepage zum Laden eines benutzerdefinierten Titels, Inhalts und einer Seitenvorlage zu zwingen .

Die Lösung ist sehr ordentlich, da sie implementiert werden kann, wenn ein Benutzer einem benutzerfreundlichen Link folgt, z. B. http://example.com/? Plugin_page = myfakepage

Es ist sehr einfach zu implementieren und sollte unbegrenzte Seiten ermöglichen.

Code und Anweisungen hier: Erstellen Sie eine benutzerdefinierte/gefälschte/virtuelle Wordpress-Seite im laufenden Betrieb

1
Xavi Esteve

Ich habe noch nicht so viel mit dem Umschreiben zu tun gehabt, daher ist dies wahrscheinlich etwas rau, aber es scheint zu funktionieren:

function api_rewrite($wp_rewrite) {
    $wp_rewrite->non_wp_rules['my-api\.php'] = 'wp-content/plugins/my-plugin/my-api.php';
    file_put_contents(ABSPATH.'.htaccess', $wp_rewrite->mod_rewrite_rules() );
}

Es funktioniert, wenn Sie dies in 'generate_rewrite_rules' einbinden, aber es muss einen besseren Weg geben, da Sie nicht bei jedem Laden der Seite .htaccess neu schreiben möchten.
Scheint so, als ob ich nicht aufhören kann, meine eigenen Beiträge zu bearbeiten ... es sollte wahrscheinlich eher darum gehen, dass Sie den Rückruf aktivieren und stattdessen auf globales $ wp_rewrite verweisen. Entfernen Sie dann den Eintrag aus non_wp_rules und geben Sie ihn erneut in .htaccess aus, indem Sie den Rückruf deaktivieren.

Und schließlich sollte das Schreiben in .htaccess etwas raffinierter sein. Sie möchten nur den WordPress-Abschnitt dort ersetzen.

1
wyrfel

Ich hatte eine ähnliche Anforderung und wollte mehrere Endpunkte basierend auf einzigartigen Slugs erstellen, die auf Inhalte verweisen, die vom Plugin generiert wurden.

Schauen Sie sich die Quelle für mein Plugin an: https://wordpress.org/extend/plugins/picasa-album-uploader/

Die von mir verwendete Technik beginnt mit dem Hinzufügen eines Filters für the_posts, um die eingehende Anforderung zu untersuchen. Wenn das Plugin damit umgehen soll, wird ein Dummy-Beitrag generiert und eine Aktion für template_redirect hinzugefügt.

Wenn die Aktion template_redirect aufgerufen wird, muss der gesamte Inhalt der anzuzeigenden Seite ausgegeben und beendet werden. Andernfalls wird keine Ausgabe generiert. Sehen Sie den Code in wp_include/template-loader.php und Sie werden sehen warum.

1
Ken

Ich benutze einen ähnlichen Ansatz wie Xavi Esteve oben, der aufgrund eines WordPress-Upgrades nicht mehr funktioniert, soweit ich in der zweiten Jahreshälfte 2013 feststellen konnte.

Es ist hier sehr detailliert dokumentiert: https://stackoverflow.com/questions/17960649/wordpress-plugin-generating-virtual-pages-and-using-theme-template

Der wichtigste Teil meines Ansatzes ist die Verwendung der vorhandenen Vorlage, sodass die resultierende Seite aussieht, als wäre sie Teil der Website. Ich wollte, dass es mit allen Themen so kompatibel wie möglich ist, hoffentlich über alle WordPress-Versionen hinweg. Die Zeit wird zeigen, ob ich Recht hatte!

0
Brian C