Come si crea una pagina "virtuale" in WordPress
8 risposta
- voti
-
- 2011-02-21
Esistono duetipi di regole di riscritturain WordPress: regoleinterne (memorizzatenel databasee analizzate da WP ::parse_request () )e regoleesterne (memorizzatein
.htaccess
e analizzate da Apache). Puoi sceglierein entrambii modi,a seconda di quanto WordPressti servenelfile chiamato.Regoleesterne:
La regolaesterna è lapiùfacile daimpostaree da seguire. Verràeseguito
my-api.php
nella directory deiplugin,senza caricarenulla da 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 ); }
Regoleinterne:
La regolainterna richiede unpo 'di lavoroin più:prima aggiungiamo una regola di riscrittura che aggiunge una query vars,quindi rendiamo questa query varpubblicae quindi dobbiamo verificare l'esistenza di questa query varperpassareil controllo alnostrofile diplugin. Nelmomentoin cui lofacciamo,sarà avvenuta la solitainizializzazione di WordPress (ciinterrompiamo subitoprima dellanormale query delpost).
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; }
-
Voglio solo aggiungere che èimportante andare allapagina deipermalinke fare clic su "Salvamodifiche"in WP-Admin.Ci stavogiocandoper un'oraprima dipensare che dovevo aggiornarei permalink ... Ameno che qualcunonon conosca unafunzione chepuòfarlo?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
-
Per la regolaesterna:poichéilpercorso allamia radice web aveva un carattere di spazio vuoto,questo ha causato la caduta di apache.Gli spazibianchi devonoessere sottoposti aescape seesistononelpercorso dell'installazione di wordpress.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
-
Funziona,manon riesco ad accedere anessuna variabile di querypassata con "get_query_vars ()"in my-api.php.Ho controllato quali variabili vengono caricate.E l'unica variabileimpostata è un `oggetto WP` chiamato` $ wp`.Comeposso accedere otrasformarloin un oggetto `WP_Query`in modo dapoter accedere alle variabilipassate con`get_query_vars () `?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: quando "includi" unfile,vieneeseguitonell'ambito corrente.In questo caso,è lafunzione `wpse9870_parse_request`,che ha soloilparametro` $ wp`.Èpossibile che l'oggettoglobale `$ wp_query`non sia statoimpostatoin questomomento,quindi`get_query_var () `nonfunzionerà.Tuttavia,seifortunato: `$ wp` è la classe che contieneilmembro` query_vars` di cui haibisogno - lo usoio stessonel codice sopra.@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 Thanks.L'ho capito dopo unpo '.Mi stavo solo chiedendo seesiste unmodoper convertire un oggetto WPin un oggetto WP_Query.Manon sono sicuro che ci sarebbemai statobisogno di qualcosa delgenere,quindinonimporta.Grazieper questoe pertuttigli altripezzi di codice.Hotrovatomolteinformazioni utili su questo sitogiàgrazie ate.@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
-
cercando di creare regole di riscritturaesterne.aggiuntoiltuoprimopezzo di codicema ricevo ancora 404. *btw: regole di riscrittura scaricate *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
-
Inoltre ricevo ancora unerrore 404 con regole di riscritturaesterne.Giustoper chiarire,il codice sopra vanelfile PHP delpluginprincipale,nonilfile dellefunzioni deimodelli corretto?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
-
@ethanpilpuoi (ora?) scaricare le regoleperincludere letuenuove regole di riscrittura se le regole di riscrittura di WPnon leincludono.Ilmetodo è documentato qui 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
-
Nelmio casofunziona su `index.php? Wpse9870_api=1` urle alos`my-api.php? Wpse9870_api=1` comeposso rimuovere la stringa di query?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 sto cercando di ottenere lo stesso,puoi dirmi cosa dovrei scriverenelmio-api.php?@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 che sto usandoin questomodo: `add_filter ('query_vars','wpse9870_query_vars'); funzione wpse9870_query_vars ($ query_vars) { $ query_vars []='getrequest'; restituire $ query_vars; } add_action ('parse_request','wpse9870_parse_request'); funzione wpse9870_parse_request (& $ wp) { if (array_key_exists ('getrequest',$ wp-> query_vars)) { includere "my-api.php"; Uscita(); } ritorno; } " e l'URL è 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
-
La regolainterna è realmentememorizzatanel database?`Add_rewrite_rule` si INSERISCEnel database?Sembra che sia solomemorizzatonel codice sorgente.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
Questo hafunzionatoperme.Nontoccomai l'API di riscrittura,ma sono semprepronto a spingermiin nuove direzioni.Quanto segue hafunzionato sulmio server diprovaper 3.0 situatoin una sottocartella di localhost.Non vedo alcunproblema se WordPress èinstallatonella radice web.
Bastainserire questo codicein unplugine caricareilfile denominato "taco-kittens.php" direttamentenella cartella delplugin.Avraibisogno di scrivere una vampataperi tuoipermalink.Penso che dicano cheilmomentomiglioreperfarlo è l'attivazione delplugin.
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' );
Imigliori auguri, -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
-
Ho ricevuto unerrore di accessonegato duranteiltentativo di questo codice.Sospetto che almio server o a WPnon siapiaciuto l'URL assoluto.Questo,d'altraparte,hafunzionatobene: `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
-
Poteteperfavorefatemi sapere cosa dovreimetterein taco-kittens.php,non ho conoscenza di .htaccess o di riscrittura url.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
C'è qualchemotivopernonfareinvece qualcosa di simile?
Quindi agganciailtuoplugin a "init"e controlla la variabileget.Seesiste,fai quello cheiltuoplugin devefaree die ()
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()
-
Funzionerebbe,ma sto cercando difornire una distinzionemolto chiaratra le variabili della querye l'endpointeffettivo.Potrebberoesserci altri argomenti di queryin futuroe non voglio chegli utenti confondano le cose.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
-
E setenessi la riscrittura,ma la riscrivessinella variabile GET?Potresti ancheesaminare comefunziona la riscritturaper robots.txt.Potrebbe aiutarti a capire comeevitareil reindirizzamento amy-api.php/What 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
-
È la soluzioneperfetta senonti interessanoi robot come le chiamate API.It is perfect solution if you don't care robots like API calls.
- 0
- 2017-03-11
- beytarovski
-
- 2011-02-20
Potreinon capire appieno letue domande,ma un semplice shortcode risolverebbeiltuoproblema?
Passaggi:
- Chiedi al cliente di creare unapagina,ades. http://mysite.com/my-api
- Chiedi al cliente di aggiungere uno shortcodein quellapagina,adesempio [my-api-shortcode]
Lanuovapaginafunge daendpoint dell'APIe iltuo shortcodeinvia richieste al codice deltuopluginin http://mysite.com/wp-content/plugins/my-plugin/my-api.php
(ovviamente questo significa chemy-api.php avrebbe lo shortcode definito)
Probabilmentepuoi automatizzarei passaggi 1e 2tramiteilplugin.
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
Non ho ancora avuto a chefare con la riscrittura cosìtanto,quindi questo èprobabilmente unpo 'approssimativo,ma sembrafunzionare:
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() ); }
Funziona se lo agganci a "generate_rewrite_rules",ma deveesserci unmodomigliore,dato chenon vuoi riscrivere .htaccess a ogni caricamento dellapagina.
Sembra chenon riesca a smettere dimodificarei mieipost ...probabilmente dovrebbepiuttostoentrarein te attivare la richiamatae fare riferimentoinvece a $ wp_rewriteglobale.Quindi rimuovi la voce danon_wp_rulese l'output dinuovoin .htaccess disattivando la richiamata.Einfine,la scritturain .htaccess dovrebbeessere unpo 'più sofisticata,vuoi solo sostituire la sezione wordpress lì dentro.
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
Avevo un requisito similee volevo creare diversiendpointbasati su slug univoci chepuntassero al contenutogenerato dalplug-in.
Dai un'occhiata allafonte delmioplugin: https://wordpress.org/extended/plugins/picasa-album-uploader/
Latecnica che ho usatoinizia aggiungendo unfiltroper
the_posts
peresaminare la richiestain arrivo.Seilplugin devegestirlo,vienegenerato unpostfittizioe viene aggiunta un'azionepertemplate_redirect
.Quando viene chiamata l'azione
template_redirect
,deve risultarenell'output dell'intero contenuto dellapagina da visualizzaree uscire o dovrebbetornare senzagenerare alcun output.Guardail codiceinwp_include/template-loader.php
e capiraiperché.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
Sto utilizzando un altro approccio che consistenel forzare la homepage a caricare untitolo,un contenutoe unmodello dipaginapersonalizzati .
La soluzione èmolto chiarapoichépuòessereimplementata quando un utente segue un link amichevole come http://example.com/ ?plugin_page=myfakepage"
Èmoltofacile daimplementaree dovrebbe consentire unnumeroillimitato dipagine.
Codicee istruzioni qui: Genera al volo unapagina Wordpresspersonalizzata/falsa/virtuale
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
Sto usando un approccio simile a quello di Xavi Esteve sopra,che ha smesso difunzionare a causa di un aggiornamento di WordPressnella secondametà del 2013.
È documentatoin dettaglio qui: https://stackoverflow.com/questions/17960649/wordpress-plug-in-generazione-di-pagine-virtuali-e-utilizzo-tema-template
Lapartefondamentale delmio approccio è utilizzareilmodelloesistentein modo che lapagina risultante appaia comeparte del sito;Volevo chefosseilpiù compatibilepossibile contuttii temi,si spera con le versioni di WordPress.Iltempo ci dirà se avevo ragione!
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!
Sto cercando di creare unendpoint APIpersonalizzatoin WordPresse hobisogno di reindirizzare le richieste a unapagina virtualenella radice di WordPress a unapaginaeffettivafornita conilmioplug-in. Quindi,in pratica,tutte le richieste a unapagina vengonoeffettivamenteindirizzate all'altra.
Esempio:
http://mysite.com/my-api.php
=>http://mysite.com/wp-content/plugins/my-plugin/my-api.php
Ilpunto è rendere l'URL dell'endpoint APIilpiùbrevepossibile (simile a
http://mysite.com/xmlrpc.php
ma spedireilfile dell'endpoint APIeffettivo conplug-inpiuttosto che richiedere all'utente di spostarei file durante l'installazionee/o hackerareil core.Ilmioprimotentativo è stato aggiungere una regola di riscritturapersonalizzata. Tuttavia,questo ha avuto dueproblemi.
http://mysite.com/my-api.php/
wp-content/plugins ...
,ma reindirizzerà aindex.php & amp; wp-content/plugins ...
. Questo haportato WordPress a visualizzare unerrore dipaginanontrovata o semplicemente a visualizzareperimpostazionepredefinita la homepage.Idee? Suggerimenti?