Come funziona il routing in WordPress?

12 apr 2014, 10:46:59
Visualizzazioni: 55.2K
Voti: 24

Come funziona il routing core di WordPress? Faccio fatica a capire... In MVC, l'URL appare come mycontroller/myaction che viene mappato su MyController->myaction()

In Drupal, è index.php?q=mycustomerpath/hello che può essere mappato a qualsiasi funzione che restituisce un contenuto che viene "tematizzato" nel layout del tema.

Ma in WordPress, non ho idea di come vengano fatte le cose... c'è ?p=1 poi ?product=1 ... Ho cercato documentazione sul flusso di routing ma non riesco a trovarne (Google mostra solo articoli sulle route personalizzate)... vorrei prima capire i fondamenti del routing core.

7
Commenti

analizzando il codice, vedo che ad ogni richiesta chiama query_posts? perché mai dovrebbe aver bisogno di interrogare i post ogni volta? non ci sono casi in cui in realtà non vuoi mostrare i post??

yeahman yeahman
12 apr 2014 10:49:17

I contenuti sono salvati come post in WP. Quindi, quando hai bisogno di mostrare contenuti devi interrogare il database

Sisir Sisir
12 apr 2014 11:36:55

Posso suggerirti di leggere riguardo "the loop" che è il concetto che devi capire per sapere come funziona WordPress. Essenzialmente "the loop" mostra un array di post che è il risultato di query_posts. Per le richieste URL non amministrative, WP è progettato per mostrare solo post e ci vuole una programmazione personalizzata per mostrare qualcosa di diverso da un post. Le richieste URL amministrative sono diverse e non usano "the loop" e mostrano elementi diversi dai post.

User User
12 apr 2014 11:52:01

ok ma questo approccio è un po' strano e non molto flessibile a dire il vero

yeahman yeahman
12 apr 2014 13:07:12

diciamo che voglio mostrare un modulo di contatto.. devo mettere il mio html in un tipo di contenuto pagina? Sto ancora cercando di capire dove mettere la logica per l'invio del modulo... (nella page.php del tema? approccio molto brutto)

yeahman yeahman
12 apr 2014 13:08:50

Probabilmente non faresti in modo che un modulo di contatto memorizzi qualcosa del modulo stesso nel database, lo coderesti come un plugin e avresti la logica per l'invio del modulo nel plugin. Per mostrare il codice speciale del modulo in una Pagina o Articolo, definisci uno shortcode.

Otto Otto
12 apr 2014 13:09:59

In alternativa, se stai creando un tema per te stesso e non vuoi preoccuparti di realizzare un plugin portatile, puoi creare un "Page Template" nel tuo tema, con il tuo codice al suo interno, poi creare una nuova Pagina e indicarle di utilizzare quel modello speciale. I template sono in PHP, possono fare qualsiasi cosa desiderino.

Otto Otto
12 apr 2014 13:14:41
Mostra i restanti 2 commenti
Tutte le risposte alla domanda 1
19
36

In WordPress, gli URL non mappano a route. Mappano a query del database.

Quando usi WordPress nella modalità permalink "predefinita", hai una serie di variabili nella query principale dell'URL, come ?p=1 o ?page=234 e così via. C'è anche ?s=ricerca e molti altri.

Se usi i permalink "leggibili", viene creato un ampio set di regole chiamate "regole di riscrittura" che mappa direttamente vari pattern di URL sullo stesso set di parametri URL. Quindi un URL come /2014/04/12/esempio verrebbe mappato su ?year=2014&month=04&day=12&postname=esempio o simile. Quanto segue si applica anche a questi, dopo che questa mappatura è stata eseguita.

Queste variabili controllano essenzialmente l'istanza principale della classe WP_Query. La classe WP_Query contiene tutte le informazioni che costruiscono la query del database per ottenere i "post" dal database. I vari parametri passati controllano che tipo di query costruisce e quali dati ottiene.

Vedi, tutto ciò che può essere visualizzato da WordPress è essenzialmente un "post". Un blog è una serie di post in ordine cronologico inverso. Una "pagina" è un post statico con un nome definito. Un "tipo di post personalizzato" è esattamente quello che sembra, un "post" con un tipo personalizzato che definisci. Tutte le query principali per visualizzare qualsiasi cosa in WordPress ottengono un sottoinsieme di post dalla tabella wp_posts.

Il WP_Query è ciò che fa questo. E i parametri dall'URL vengono inviati direttamente a quella query principale e utilizzati lì.

Il tema determina quindi quale template utilizzare in base a ciò che restituisce la query. Se hai richiesto /categoria/esempio, allora diventa ?category_name=esempio, il che significa che l'array principale $wp_query->query_vars otterrà quell'informazione, e il WP_Query estrarrà gli ultimi X post per la categoria "esempio", e imposterà il suo flag is_category su true.

Il template-loader verrà eseguito dopo questo, vedrà che is_category() restituisce true, e deciderà di scegliere il template della categoria, quindi cercherà category-example.php e ripiegherà su category.php e così via, secondo la Gerarchia dei Template.

Quindi, la domanda se vuoi cambiare come funzionano gli URL è semplice: vuoi cambiare gli URL, o ciò a cui sono mappati? Perché gli URL non sono mappati a funzioni, sono mappati a parametri che controllano la query. Se vuoi che l'URL modifichi quella query principale, allora è un processo leggermente diverso rispetto a se vuoi che un URL speciale esegua qualche altro codice speciale.

E per rispondere alla tua domanda specifica nei commenti: "non ci sono casi in cui non vuoi effettivamente visualizzare post?" No, non ce ne sono. Tutto è un post. Tutto il contenuto è memorizzato nei post. Se vuoi memorizzare contenuti altrove ed essere diverso, puoi farlo, ma è più difficile perché, onestamente, di solito non è necessario. Se hai contenuti speciali, crea un tipo di post personalizzato, memorizza il tuo contenuto come un post con quel tipo, mappa un pattern di URL ad esso. Facile.

12 apr 2014 13:08:56
Commenti

Capisco che tutto dovrebbe essere rappresentato in un post (tramite custom post type, ecc.) in modo molto simile ai tipi personalizzati in Drupal 6... ma influisce sulle prestazioni avere una singola tabella dei post per memorizzare ogni singolo contenuto del sito? Drupal 7 ha risolto questo problema introducendo il tipo di entità, in modo da non dover creare un tipo personalizzato e memorizzare tutto nella tabella dei nodi, ma in una propria tabella di entità che può comunque sfruttare il framework Drupal. Spero che WordPress introduca un approccio simile in futuro. Grazie per la spiegazione dettagliata.

yeahman yeahman
12 apr 2014 13:14:07

Immagino che se voglio mappare un URL a una mia funzione/tema personale, wp router potrebbe aiutare?

yeahman yeahman
12 apr 2014 13:15:08

Aggiungere un sistema di routing completo di solito non è necessario. Esistono modi più semplici. La base di WordPress è visualizzare contenuti generati dagli utenti, che sono tutti memorizzati nella tabella dei post. Se vuoi visualizzare contenuti non generati dagli utenti, generalmente lo fai nel tema o in un plugin. Ci sono centinaia (migliaia) di hook di azione, filtri e altri modi per il codice di sovrascrivere varie parti del processo mentre la pagina viene generata. E con strumenti come gli shortcode, inserire HTML personalizzato nei contenuti è relativamente semplice.

Otto Otto
12 apr 2014 13:19:21

come posso aggiungere HTML/PHP personalizzato in un post type che ho creato? senza dover modificare il single.php del tema o creare un single-mycustompost.php (non è un approccio molto portabile)

yeahman yeahman
12 apr 2014 13:24:26

Shortcode. http://codex.wordpress.org/Shortcode_API

Otto Otto
12 apr 2014 13:54:11

@yeahman: Non sono molto d'accordo con alcuni dei tuoi giudizi su WordPress - è un po' strano e non molto flessibile, approccio molto brutto, non un approccio molto portabile. Sebbene la logica integrata di WordPress non sia adatta a tutti i tipi di siti web, penso che sia molto più flessibile, portabile ed elegante di quanto tu possa apprezzare dopo averci lavorato solo per poco tempo. Con più esperienza, penso che scoprirai che puoi fare molto più di quanto sembri pensare. Devi davvero comprendere azioni, filtri, shortcode, widget... prima di poter esprimere un giudizio equo.

User User
12 apr 2014 16:03:06

Vedo da una delle tue domande precedenti che stai utilizzando il plugin Pods. Questo è un buon esempio della flessibilità di WordPress. Pods non utilizza la logica integrata di WordPress - query per i post e visualizzazione dei post utilizzando il loop. Sostituisce questa logica con una sua logica personalizzata. Può farlo perché le azioni di WordPress ti permettono di modificare facilmente il comportamento predefinito di WordPress. E puoi comunque utilizzare tutte le capacità di un vastissimo ecosistema costruito attorno a WordPress.

User User
12 apr 2014 16:31:21

Non ho ancora usato PODS.. il motivo per cui stavo considerando un framework come PODS è che, di base, wp non è così eccezionale per lo sviluppo web. Capisco che wp fosse originariamente progettato solo per i blog, ma alla versione 3.0, avrei pensato che sarebbe stato più accessibile per lo sviluppo web. Drupal è un buon esempio di ciò di cui sto parlando... è iniziato come un cms ed è evoluto in un CMF (content management framework: probabilmente il più potente là fuori)

yeahman yeahman
12 apr 2014 16:42:24

Se il tuo sito web richiede programmazione personalizzata sulla maggior parte delle sue pagine, probabilmente WordPress non è la scelta giusta. Personalmente mi piace l'approccio adottato da concrete5, ma trovo WordPress più vitale grazie al suo vasto ecosistema - probabilmente ha di gran lunga la più grande collezione di plugin (ovviamente alcuni di questi sono semplicemente spazzatura). Certamente, la logica del "loop" mostra le sue origini da blog, ma WordPress è evoluto per essere molto più capace, anche se non è un framework generico. Se le tue esigenze non corrispondono alla logica del "loop", probabilmente è meglio optare per qualcos'altro.

User User
12 apr 2014 17:36:13

@yeahman: Quindi se pensi che Drupal sia migliore per un caso specifico, allora usa Drupal. È tutto software libero. Usa quello che meglio si adatta alle tue esigenze. Non ferirà i sentimenti di WordPress neanche un po'. Voglio dire, se stessi creando un wiki, non suggerirei WordPress neanche per quello. :)

Otto Otto
12 apr 2014 21:48:43

lol in realtà sto lavorando a un progetto usando WordPress, quindi niente Drupal per me.. lol ma ci sono davvero alcuni plugin complessi creati per WP come WooCommerce, BuddyPress che sono popolari e non hanno solo pagine di contenuti/post... ma scavando nel codice di BuddyPress, puoi vedere che hanno fatto molti hack per ottenere questo risultato. Il plugin WP Router spero risolverà il mio problema con il routing predefinito di WP.

yeahman yeahman
12 apr 2014 23:04:30

dopo più di 1 anno di lavoro con WordPress ora... Non sono ancora convinto... il framework non è elegante e piuttosto brutto... Funziona bene come semplice blog ma se vuoi sviluppare altri tipi di siti web... è un po' come fare hacking su WordPress per fargli fare qualcosa per cui non è stato progettato.

yeahman yeahman
7 nov 2015 19:47:41

e purtroppo ho già subito attacchi hacker su 3 siti WordPress... quindi non è nemmeno molto sicuro...

yeahman yeahman
7 nov 2015 19:48:53

Quasi tutti gli attacchi sono il risultato di un server insicuro o di codice di plugin/tema vulnerabile. Il core di WordPress è perfettamente sicuro.

Otto Otto
7 nov 2015 21:31:33

probabilmente sì. Ma dire che il core di WordPress è perfettamente sicuro è un po' un'esagerazione... Le patch di sicurezza e gli aggiornamenti esistono per un motivo

yeahman yeahman
8 nov 2015 10:31:19

Ciao @Otto e altri.

Ora che c'è la WP REST API, presumo esista una sorta di router? Saresti in grado di aggiornare la tua risposta per la versione 4.7?

MrMesees MrMesees
15 dic 2016 07:23:09

No. Perché pensi che le cose siano cambiate? Non esiste ancora nulla del genere. È semplicemente un endpoint nell'URL.

Otto Otto
17 dic 2016 09:38:18

Da quando ho commentato l'ultima volta ho lavorato di più su WordPress e ho avuto più siti violati; persino siti senza plugin di terze parti aggiuntivi. Ho dovuto creare script per trovare i file violati e pulirli e installare wordfence security per monitorarli.

yeahman yeahman
4 feb 2017 09:47:06

Per chi si chiede dove viene impostata la query, cerca wp(); in wp-blog-header.php

8ctopus 8ctopus
2 nov 2023 09:20:00
Mostra i restanti 14 commenti