Come funziona il routing in WordPress?
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.
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.

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.

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

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.

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)

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

@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.

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.

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)

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.

@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. :)

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.

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.

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

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

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

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?

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

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.
