Wie erstelle ich eine "virtuelle" Seite in WordPress
8 Antworten
- Stimmen
-
- 2011-02-21
In WordPressgibt es zwei Arten von Umschreiberegeln:interne Regeln (in der Datenbankgespeichert und analysiert von WP ::parse_request () ) undexterne Regeln (gespeichertin
.htaccess
und analysiert von Apache). Sie könnenin beide Richtungen wählen,je nachdem,wie viel WordPress Siein Ihrer aufgerufenen Dateibenötigen.Externe Regeln:
Dieexterne Regelist ameinfachsteneinzurichten und zubefolgen. Es wird
my-api.php
in Ihrem Plugin-Verzeichnis ausführen,ohneetwas 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:
Dieinterne Regelerfordertetwasmehr Arbeit: Zuerstfügen wireine Umschreiberegel hinzu,dieeine Abfragevariable hinzufügt,dannmachen wir diese Abfragevariable öffentlich und dannmüssen wirprüfen,ob diese Abfragevariable vorhandenist,um das Steuerelement an unsere zu übergeben Plugin-Datei. Bis wir diestun,wird die übliche WordPress-Initialisierung stattgefunden haben (wirbrechen kurz 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; }
There are two types of rewrite rules in WordPress: internal rules (stored in the database and parsed by WP::parse_request()), and external rules (stored in
.htaccess
and parsed by Apache). You can choose either way, depending on how much of WordPress you need in your called file.External Rules:
The external rule is the easiest to set up and to follow. It will execute
my-api.php
in your plugin directory, without loading anything from WordPress.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 ); }
Internal Rules:
The internal rule requires some more work: first we add a rewrite rule that adds a query vars, then we make this query var public, and then we need to check for the existence of this query var to pass the control to our plugin file. By the time we do this, the usual WordPress initialization will have happened (we break away right before the regular post query).
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; }
-
Ichmöchtenur hinzufügen,dasses wichtigist,auf die Seite Permalinks zugehen undim WP-Admin auf "Änderungen speichern" zu klicken.Ich habeeine Stunde damitgespielt,bevorich dachte,ichmüsste die Permalinks aktualisieren ... Es sei denn,jemand kennteine Funktion,die das kann?I just want to add that its important to go to the Permalinks page and click "Save Changes" in the WP-Admin. I was playing with this for an hour before thinking that I needed to refresh the permalinks... Unless someone knows a function that can do that?
- 3
- 2013-05-28
- ethanpil
-
Für dieexterne Regel: Da der Pfad zumeinem Webstammein Leerzeichen hatte,fiel der Apache um.Leerzeichenmüssenmaskiert werden,wenn sieim Pfad zu Ihrer WordPress-Installation vorhanden sind.For the external rule: Because the path to my web root had a whitespace character, this caused apache to fall over. Whitespaces need to be escaped if they exist in the path to your wordpress installation.
- 0
- 2013-06-04
- Willster
-
Funktioniert,aberich kannmit get_query_vars ()in my-api.php scheinbarnicht auf übergebene Abfragevariablen zugreifen.Ich habe überprüft,welche Variablengeladen sind.Und dieeinzige Variable,diegesetzt wird,istein "WP-Objekt"namens "$ wp".Wiegreifeich darauf zu oder verwandleesin ein WP_Query-Objekt,damitichmit get_query_vars () auf die übergebenen Variablen zugreifen kann?Works, but I can't seem to access any passed query variables with `get_query_vars()` in my-api.php. I checked what variables are loaded. And the only var that is set is a a `WP object` called `$wp`. How do I access or tranform this into a `WP_Query` object so I can access the passed variables with `get_query_vars()`?
- 1
- 2013-08-13
- Jules
-
@Jules: Wenn Sieeine Datei "einschließen",wird sieim aktuellen Bereich ausgeführt.In diesem Fallistes die Funktion "wpse9870_parse_request",dienur den Parameter "$ wp"enthält.Möglicherweise wurde dasglobale Objekt "$ wp_query" zu diesem Zeitpunktnochnichtfestgelegt,sodass "get_query_var ()"nichtfunktioniert.Sie habenjedoch Glück: "$ wp"ist die Klasse,die das von Ihnenbenötigte "query_vars" -Mitgliedenthält -ich verwendees selbstim obigen Code.@Jules: When you `include` a file, it gets executed in the current scope. In this case, it is the `wpse9870_parse_request` function, which only has the `$wp` parameter. It's possible that the global `$wp_query` object hasn't been set at this time, so `get_query_var()` will not work. However, you are lucky: `$wp` is the class that contains the `query_vars` member that you need - I use it myself in the above code.
- 1
- 2013-08-13
- Jan Fabry
-
@ JanFabry Danke.Ich habe dasnacheiner Weile herausgefunden.Ich habemichnurgefragt,obeseine Möglichkeitgibt,ein WP-Objektin ein WP_Query-Objekt zu konvertieren.Aberichbin mirnicht sicher,obesjemalseinen Bedarffür soetwasgeben würde,alsomachtesnichts.Vielen Dankfür diesen und all Ihre anderen Code-Teile.Dank Ihnen haben Siebereits viele hilfreiche Informationen auf dieser Websitegefunden.@JanFabry Thanks. Figured that out after a while. I was just wondering if there is a way to convert a WP object to a WP_Query object. But I'm not to sure if there would ever even be a need for something like that, so never mind. Thanks for this and all your other pieces of code. Found a lot of helpful information on this site already thanks to you.
- 0
- 2013-08-14
- Jules
-
versuchen,externe Umschreiberegeln zuerstellen.hat deinenersten Code hinzugefügt,aberichbekommeimmernoch 404. * Übrigens: Regelnfür das Umschreiben von Flushed *trying to create an external rewrite rules. added your fist piece of code but I am still getting 404. *btw: flushed rewrite rules*
- 1
- 2013-11-30
- Sisir
-
Icherhalte auchimmernocheinen 404-Fehlermit externen Umschreiberegeln.Nur um zu verdeutlichen,geht der obige Codein die PHP-Datei des Haupt-Plugins,nichtin die Dateimit den Vorlagenfunktionen?I'm also still getting a 404 error with external rewrite rules. Just to clarify, the code above goes into the main plugin PHP file, not the templates functions file correct?
- 0
- 2015-02-06
- Lee
-
@ethanpil Sie können (jetzt?) die Regeln leeren,um Ihreneuen Umschreiberegelneinzuschließen,wenn WP-Umschreiberegeln diesenichtenthalten.Die Methodeist hier dokumentiert: http://codex.wordpress.org/Class_Reference/WP_Rewrite@ethanpil you can (now?) flush the rules to include your new rewrite rules if WP rewrite rules do not include them. The method is documented here http://codex.wordpress.org/Class_Reference/WP_Rewrite
- 0
- 2015-08-31
- Ejaz
-
Inmeinem Fallistes Arbeit an `index.php? Wpse9870_api=1` URL und auch`my-api.php? Wpse9870_api=1` wie kannich Abfragezeichenfolgeentfernen?In my case it is work on `index.php?wpse9870_api=1` url and alos `my-api.php?wpse9870_api=1` how i can remove query string?
- 0
- 2016-02-12
- er.irfankhan11
-
@Irfan Ich versuche das Gleiche zuerreichen. Kannst dumir sagen,wasichin my-api.php schreiben soll?@Irfan I am trying to achieve the same can you tell me what I should write in my-api.php ?
- 0
- 2016-05-04
- Prafulla Kumar Sahu
-
@Prafulla Kumar Sahu Ichbenutze so: `add_filter ('query_vars','wpse9870_query_vars'); Funktion wpse9870_query_vars ($ query_vars) { $ query_vars []='getrequest'; return $ query_vars; }} add_action ('parse_request','wpse9870_parse_request'); Funktion wpse9870_parse_request (& $ wp) { if (array_key_exists ('getrequest',$ wp-> query_vars)) { include 'my-api.php'; Ausfahrt(); }} Rückkehr; } ` und URList http://homeurl/?getrequest@Prafulla Kumar Sahu I am using like this: `add_filter( 'query_vars', 'wpse9870_query_vars' ); function wpse9870_query_vars( $query_vars ) { $query_vars[] = 'getrequest'; return $query_vars; } add_action( 'parse_request', 'wpse9870_parse_request' ); function wpse9870_parse_request( &$wp ) { if ( array_key_exists( 'getrequest', $wp->query_vars ) ) { include 'my-api.php'; exit(); } return; }` and url is http://homeurl/?getrequest
- 0
- 2016-05-06
- er.irfankhan11
-
Ist dieinterne Regel wirklichin der Datenbankgespeichert?Wird `add_rewrite_rule`in die Datenbankeingefügt?Es sieht so aus,als obesnurim Quellcodegespeichertist.Is the internal rule really stored in the database? Does `add_rewrite_rule` INSERT into the database? It looks like it is just stored in the source code.
- 0
- 2017-04-10
- Jeff
-
@ethanpil `flush_rewrite_rules (true);`@ethanpil `flush_rewrite_rules( true );`
- 0
- 2017-05-16
- mircobabini
-
- 2011-02-20
Das hatbei mirfunktioniert.Ichberührenie die Rewrite-API,bin aberimmerbereit,michin neue Richtungen zubewegen.Das Folgendefunktionierte aufmeinem Testserverfür 3.0in einem Unterordner von localhost.Ich sehe kein Problem,wenn WordPressim Webstamminstalliertist.
Legen Sie diesen Codeeinfachin einem Plugin ab und laden Sie die Datei "taco-kittens.php" direktin den Plugin-Ordner hoch.Siemüsseneinen Hard Flushfür Ihre Permalinks schreiben.Ich denke,sie sagen,dass diebeste Zeit dafür die Plugin-Aktivierungist.
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 Wünsche, -Mike
This worked for me. I never ever touch the rewrite API, but am always up to push myself in new directions. The following worked on my test server for 3.0 located in a sub folder of localhost. I don't for see any issue if WordPress is installed in web root.
Just drop this code in a plugin and upload the file named "taco-kittens.php" directly in the plugin folder. You will need write a hard flush for your permalinks. I think they say the best time to do this is on plugin activation.
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' );
Best wishes, -Mike
-
Beim Versuch dieses Codes wurde der Fehler "Zugriff verweigert" angezeigt.Ich vermute,dassmeinem Server oder WP die absolute URLnichtgefallen hat.Diesfunktionierte andererseitsgut: `add_rewrite_rule ('taco-kittens','wp-content/plugins/taco-kittens.php','top');`I got an access denied error while trying this code. I suspect my server or WP didn't like the absolute URL. This, on the other hand, worked fine: `add_rewrite_rule( 'taco-kittens', 'wp-content/plugins/taco-kittens.php', 'top' );`
- 1
- 2013-08-13
- Jules
-
Können Siemirbitte mitteilen,wasichin taco-kittens.phpeinfügen soll? Ich habe keine Kenntnisse über .htaccess oder URL-Umschreibung.Can you please let me know, what I should put in taco-kittens.php, I do not have knowledge of .htaccess or url rewrite .
- 0
- 2016-05-04
- Prafulla Kumar Sahu
-
- 2011-02-20
Gibteseinen Grund,soetwasnicht zutun?
Dann haken Sieeinfach Ihr Pluginin 'init'ein undprüfen Sie,ob diese Variable variabelist.Wennesexistiert,tun Sie,was Ihr Plugintunmuss und sterben Sie ()
Any reason not to do something like this instead?
Then just hook your plugin into 'init' and check for that get variable. If it exists, do what your plugin needs to do and die()
-
Das würdefunktionieren,aberich versuche,eine sehr klare Unterscheidung zwischen den Abfragevariablen und demtatsächlichen Endpunkt zutreffen.Möglicherweisegibt esin Zukunft andere Abfrageargumente,undichmöchtenicht,dass Benutzer die Dinge durcheinanderbringen.That would work, but I'm trying to provide a very clear distinction between the query variables and the actual endpoint. There might be other query args in the future, and I don't want users to mix things up.
- 5
- 2011-02-20
- EAMann
-
Wasist,wenn Sie das Umschreibenbeibehalten,es aberin die GET-Variable umgeschrieben haben?Sie können sich auch ansehen,wie das Umschreibenfür robots.txtfunktioniert.Es könnte Ihnen helfen,herauszufinden,wie Sie die Weiterleitung zumy-api.php/vermeiden könnenWhat if you kept the rewrite, but rewrote it to the GET var? You might also look at how the rewrite for robots.txt works. It might help you figure out how to avoid the redirect to my-api.php/
- 0
- 2011-02-20
- Will Anderson
-
Esist dieperfekte Lösung,wenn Sie Roboter wie API-Aufrufenichtinteressieren.It is perfect solution if you don't care robots like API calls.
- 0
- 2017-03-11
- beytarovski
-
- 2011-02-20
Ich verstehe Ihre Fragenmöglicherweisenicht vollständig,aber würdeein einfacher Shortcode Ihr Problem lösen?
Schritte:
- Lassen Sie den Clienteine Seiteerstellen,d. H. http://mysite.com/my-api
- Lassen Sie den Client auf dieser Seiteeinen Shortcode hinzufügen,d. H. [My-api-shortcode]
Dieneue Seitefungiert als API-Endpunkt und Ihr Shortcode sendet Anforderungen an Ihren Plugin-Codein http://mysite.com/wp-content/plugins/my-plugin/my-api.php
(diesbedeutetnatürlich,dassin my-api.php der Shortcode definiertist)
Sie können wahrscheinlich die Schritte 1 und 2 über das Plugin automatisieren.
I may not be understanding you questions fully, but would a simple shortcode solve your issue?
Steps:
- Have the client create a page i.e. http://mysite.com/my-api
- Have the client add a shortcode in that page i.e. [my-api-shortcode]
The new page acts as an API end point and your shortcode sends requests to your plugin code in http://mysite.com/wp-content/plugins/my-plugin/my-api.php
( of course this means that my-api.php would have the shortcode defined )
You can probably automate steps 1 and 2 via the plugin.
-
- 2011-02-20
Ich habemichnochnicht so sehrmit dem Umschreibenbefasst,daherist dies wahrscheinlichetwas rau,aberes scheint zufunktionieren:
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() ); }
Esfunktioniert,wenn Sie diesin 'generate_rewrite_rules'einbinden,aberesmusseinen besseren Weggeben,da Sie .htaccessnichtbei jedem Laden der Seiteneu schreibenmöchten.
Scheint,als könnteichnicht aufhören,meine eigenen Beiträge zubearbeiten ...es sollte wahrscheinlicheherin Siegehen,um den Rückruf zu aktivieren und stattdessen aufglobal $ wp_rewrite zu verweisen.Entfernen Sie dann den Eintrag ausnon_wp_rules undgeben Sieihnerneutin .htaccess aus,wenn Sie den Rückruf deaktivieren.Und schließlich sollte das Schreibenin .htaccessetwas ausgefeilter sein. Siemöchtennur den WordPress-Abschnitt dortersetzen.
I haven't dealt with rewrite that much, yet, so this is probably a little rough, but it seems to work:
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() ); }
It works if you hook this into 'generate_rewrite_rules', but there must be a better way, as you don't want to rewrite .htaccess on each page load.
Seems like i can't stop editing my own posts...it should probably rather go into you activate callback and reference global $wp_rewrite instead. And then remove the entry from non_wp_rules and output to .htaccess again in you deactivate callback.And finally, the writing to .htaccess should be a bit more sophisticated, you want to only replace the wordpress section in there.
-
- 2011-04-08
Ich hatteeine ähnliche Anforderung und wolltemehrere Endpunktebasierend aufeindeutigen Slugserstellen,die auf vom Plugingenerierte Inhalte verweisen.
Sehen Sie sich die Quellefürmein Plugin an: https://wordpress.org/verlängern/plugins/picasa-album-uploader/
Die vonmir verwendete Technikbeginnt mit dem Hinzufügeneines Filtersfür
the_posts
,um dieeingehende Anforderung zu untersuchen.Wenn das Plugin damit umgehen soll,wirdein Dummy-Beitraggeneriert undeine Aktionfürtemplate_redirect
hinzugefügt.Wenn die Aktion
template_redirect
aufgerufen wird,muss sie dazuführen,dass dergesamte Inhalt der anzuzeigenden Seite ausgegeben undbeendet wird. Andernfalls sollte sie ohnegenerierte Ausgabe zurückkehren.Sehen Sie sich den Codeinwp_include/template-loader.php
an und Sie werden sehen,warum.I had a similar requirement and wanted to create several end-points based on unique slugs that pointed to content generated by the plugin.
Have a look at the source for my plugin: https://wordpress.org/extend/plugins/picasa-album-uploader/
The technique I used starts by adding a filter for
the_posts
to examine the incoming request. If the plugin should handle it, a dummy post is generated and an action is added fortemplate_redirect
.When the
template_redirect
action is called, it must result in outputting the entire contents of the page to be displayed and exit or it should return with no output generated. See the code inwp_include/template-loader.php
and you'll see why. -
- 2012-01-18
Ich verwendeeinen anderen Ansatz,der darinbesteht, die Startseite zum Ladeneinesbenutzerdefinierten Titels,Inhalts undeiner Seitenvorlage zu zwingen .
Die Lösungist sehr ordentlich,da sieimplementiert werden kann,wennein Benutzereinem benutzerfreundlichen Link wie http://example.com/folgt. ?plugin_page=myfakepage
Esist sehreinfach zuimplementieren und sollte unbegrenzte Seiten zulassen.
Code und Anweisungen hier: Generieren Sieeine benutzerdefinierte/gefälschte/virtuelle Wordpress-Seiteim laufenden Betrieb
I'm using another approach which consists in forcing the home page to load a custom title, content and page template.
The solution is very neat since it can be implemented when a user follows a friendly link such as http://example.com/?plugin_page=myfakepage
It is very easy to implement and should allow for unlimited pages.
Code and instructions here: Generate a custom/fake/virtual Wordpress page on the fly
-
- 2014-03-01
Ich verwendeeinen ähnlichen Ansatz wie Xavi Esteve,der,soweitich dasbeurteilen konnte,aufgrundeines WordPress-Upgradesin der zweiten Jahreshälfte 2013nichtmehrfunktioniert.
Esist hier sehr detailliert dokumentiert: https://stackoverflow.com/questions/17960649/wordpress-Plugin-Generierung-virtueller-Seiten-und-Verwendung-Theme-Vorlage
Der Hauptteilmeines Ansatzesbesteht darin,die vorhandene Vorlage zu verwenden,sodass die resultierende Seite so aussieht,als wäre sie Teil der Site.Ich wollte,dassesmit allen Themen so kompatibel wiemöglichist,hoffentlich über alle WordPress-Versionen hinweg.Die Zeit wird zeigen,obich Recht hatte!
I'm using an approach similar to Xavi Esteve's above, which stopped working due to a WordPress upgrade as far as I could tell in the second half of 2013.
It's documented in great detail here: https://stackoverflow.com/questions/17960649/wordpress-plugin-generating-virtual-pages-and-using-theme-template
The key part of my approach is using the existing template so the resulting page looks like it's part of the site; I wanted it to be as compatible as possible with all themes, hopefully across WordPress releases. Time will tell if I was right!
Ich versuche,einen benutzerdefinierten API-Endpunktin WordPress zuerstellen,undichmuss Anforderungen aneine virtuelle Seiteim Stammverzeichnis von WordPress aufeine tatsächliche Seite umleiten,diemit meinem Plug-Ingeliefert wird. Grundsätzlich werden alle Anforderungen an dieeine Seite an die andere weitergeleitet.
Beispiel:
http://mysite.com/my-api.php
=>http://mysite.com/wp-content/plugins/my-plugin/my-api.php
Zielistes,die URLfür den API-Endpunkt so kurz wiemöglich zu halten (ähnlich wiebei
http://mysite.com/xmlrpc.php
,aber dieeigentliche API-Endpunktdateimit zu versenden das Plug-In,anstatt dass der Benutzer Dateienin seiner Installation und/oderim Hack-Core verschiebenmuss.Meinerster Versuch war das Hinzufügeneinerbenutzerdefinierten Umschreiberegel. Dies hattejedoch zwei Probleme.
http://mysite.com/my-api.php/
wp-content/plugins ...
umleiten,sondern zuindex.php & amp; wp-content/plugins ...
. Diesführte dazu,dass WordPressentwedereine Seite anzeigt,bei der kein Fehlergefunden wurde,odernur standardmäßig die Startseite.Ideen? Vorschläge?