Cum funcționează rutarea în WordPress?
Cum funcționează rutarea de bază în WordPress? Am dificultăți în a înțelege... În MVC, URL-ul tău arată ca mycontroller/myaction care se mapează la MyController->myaction()
În Drupal, este index.php?q=mycustomerpath/hello care poate fi mapată la orice funcție dorești și care returnează un conținut care este "tematizat" în layoutul temei tale.
Dar în WordPress, nu am nici o idee cum sunt făcute lucrurile... este ?p=1 apoi ?product=1 ... Am căutat documentație despre fluxul de rutare dar nu pot găsi nimic (Google returnează doar articole despre rute personalizate).. vreau să înțeleg mai întâi fundamentele rutării de bază..
În WordPress, URL-urile nu sunt mapate la rute. Ele sunt mapate la interogări în baza de date.
Când utilizați WordPress în modul "default" de permalink-uri, aveți un set de variabile în interogarea URL-ului principal, cum ar fi ?p=1 sau ?page=234 și așa mai departe. Există și ?s=căutare și multe altele.
Dacă utilizați permalink-urile "pretty", atunci este creat un set mare de reguli numite "reguli de rescriere" care mapează direct diferite modele de URL-uri pe același set de parametri URL. Deci, un URL precum /2014/04/12/exemplu ar fi mapat la ?year=2014&month=04&day=12&postname=exemplu sau similar. Astfel, următoarele se aplică și acestora, după ce această mapare este făcută.
Aceste variabile controlează în esență instanța principală a clasei WP_Query. Clasa WP_Query deține toate informațiile care construiesc interogarea în baza de date pentru a obține "postările" din baza de date. Diferiții parametri transmiși în ea controlează ce fel de interogare construiește și ce date obține.
Vedeți, tot ce poate fi afișat de WordPress este în esență o "postare". Un blog este o serie de postări în ordine invers cronologică. O "pagină" este o postare statică cu un nume definit. Un "tip de postare personalizat" este exact ceea ce sună, o "postare" cu un tip personalizat pe care îl definiți. Toate interogările principale pentru a afișa orice în WordPress obțin un subset de postări din tabelul wp_posts.
WP_Query este ceea ce face asta. Și parametrii din URL sunt trimisi direct în acea interogare principală și utilizați acolo.
Tema determină apoi ce șablon să folosească în funcție de ceea ce returnează interogarea. Dacă ați solicitat /categorie/exemplu, atunci acesta devine ?category_name=exemplu, ceea ce înseamnă că array-ul principal $wp_query->query_vars va primi acea informație, iar WP_Query va extrage ultimele X postări pentru categoria "exemplu" și va seta steagul is_category pe true.
Template-loader va rula după aceasta, va vedea că is_category() returnează true și va decide să aleagă șablonul de categorie, astfel că va căuta category-exemplu.php și va reveni la category.php și așa mai departe, conform Ierarhiei de Șabloane.
Deci, întrebarea dacă doriți să schimbați modul în care funcționează URL-urile este simplă: Doriți să schimbați URL-urile sau la ce sunt mapate? Deoarece URL-urile nu sunt mapate la funcții, ele sunt mapate la parametri care controlează interogarea. Dacă doriți ca URL-ul să ajusteze acea interogare principală, atunci este un proces ușor diferit față de cazul în care doriți ca un URL special să execute un cod special total diferit.
Și pentru a răspunde la întrebarea dvs. specifică din comentarii: "nu există cazuri în care nu doriți de fapt să afișați postări?" Nu, nu există. Totul este o postare. Tot conținutul este stocat în postări. Dacă doriți să stocați conținutul în altă parte și să fie diferit, atunci puteți face asta, dar este mai dificil pentru că, sincer, de obicei nu este necesar. Dacă aveți conținut special, creați un tip de postare personalizat, stocați conținutul ca o postare cu acel tip, mapați un model de URL la el. Simplu.

Înțeleg că totul ar trebui reprezentat într-un post (prin tipuri de postări personalizate etc.), foarte similar cu tipurile personalizate din Drupal 6... dar afectează performanța faptul că avem un singur tabel de postări pentru a stoca fiecare conținut al site-ului? Drupal 7 a rezolvat această problemă prin introducerea tipurilor de entități, astfel încât nu mai trebuie să creezi un tip personalizat și să stochezi totul în tabelul de noduri, ci în propriul tabel de entități care poate beneficia totuși de cadrul Drupal. Sper ca WordPress să introducă o astfel de abordare în viitor. Mulțumesc pentru explicațiile detaliate.

Presupun că dacă vreau să mapez un URL la o funcție/țemă proprie, WP Router ar putea ajuta?

Adăugarea unui sistem complet de rutare nu este de obicei necesară. Există metode mai simple. Baza WordPress este afișarea conținutului generat de utilizatori, care este stocat în întregime în tabelul de postări. Dacă dorești să afișezi conținut care nu este generat de utilizatori, atunci de obicei o faci în țemă sau într-un plugin. Există sute (mii) de hook-uri de acțiune, filtre și alte modalități prin care codul poate înlocui diverse părți ale procesului pe măsură ce pagina este generată. Și cu lucruri precum shortcode-urile, inserarea de HTML personalizat în conținut este relativ ușoară.

cum pot adăuga html/php personalizat într-un tip de postare pe care l-am creat? fără a fi nevoit să modific single.php din temă sau să creez un single-mycustompost.php (nu este o abordare foarte portabilă)

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

@yeahman: Nu sunt de acord cu unele dintre judecățile tale despre WordPress - este un pic ciudat și nu foarte flexibil, o abordare urâtă, nu foarte portabilă. Deși logica internă a WordPress nu ar fi potrivită pentru toate tipurile de site-uri, cred că este mult mai flexibil, portabil și elegant decât poți aprecia după ce lucrezi cu el doar pentru o perioadă scurtă. Dacă acumulezi mai multă experiență cu el, cred că vei descoperi că poți face mult mai multe decât pare să crezi. Trebuie să înțelegi acțiunile, filtrele, shortcode-urile, widget-urile... înainte să poți da o judecată corectă.

Văd din una dintre întrebările tale anterioare că folosești plugin-ul Pods. Acesta este un bun exemplu al flexibilității WordPress. Pods nu utilizează logica integrată a WordPress - interogarea postărilor și afișarea lor folosind bucla standard. În schimb, înlocuiește această logică cu una personalizată. Poate face acest lucru deoarece acțiunile WordPress îți permit să modifici ușor comportamentul implicit al platformei. Și poți beneficia în continuare de toate capabilitățile unui vast ecosistem construit în jurul WordPress.

Încă nu am folosit PODS... Motivul pentru care mă gândeam la un framework ca PODS este că WordPress în starea sa inițială nu este foarte bun pentru dezvoltarea web. Înțeleg că WordPress a fost conceput inițial doar pentru bloguri, dar până la versiunea 3.0, mă așteptam să fie mai accesibil pentru dezvoltarea web. Drupal este un bun exemplu despre ceea ce vorbesc... a început ca un CMS și a evoluat într-un CMF (content management framework: probabil cel mai puternic din acest domeniu).

Dacă site-ul tău necesită programare personalizată pe majoritatea paginilor, atunci probabil WordPress nu este alegerea potrivită. Personal, îmi place abordarea lui concrete5, dar consider WordPress mai viabil datorită ecosistemului său vast - probabil are cea mai mare colecție de plugin-uri (desigur, unele sunt de calitate slabă). Desigur, logica "buclei" își arată originile de blog, dar WordPress a evoluat să fie mult mai capabil, totuși nu este un framework generic. Dacă cerințele tale nu se potrivesc cu logica "buclei", probabil că e mai bine să alegi altceva.

@yeahman: Deci dacă crezi că Drupal e mai bun pentru un caz specific, atunci folosește Drupal. Toate sunt software gratuit. Folosește ce se potrivește cel mai bine nevoilor tale. Nu o să supere pe WordPress deloc. Adică, dacă ai face un wiki, nici eu nu aș sugera WordPress pentru asta. :)

lol de fapt lucrez la un proiect care folosește WordPress deci nu Drupal pentru mine.. lol dar există de fapt niște plugin-uri complexe făcute pentru WP cum ar fi WooCommerce, BuddyPress care sunt populare și nu au doar pagini de conținut/postări... dar dacă te uiți în codul lui BuddyPress, poți vedea că au făcut multe hack-uri pentru a realiza asta. Plugin-ul WP Router sper să rezolve problema mea cu rutarea implicită din WP.

după mai mult de 1 an de lucru cu WordPress acum... încă nu sunt convins de el... framework-ul nu este elegant și chiar urât... Funcționează ca un simplu blog, dar dacă vrei să dezvolți alte tipuri de site-uri web.. e cam un hack pe WordPress pentru a face ceva pentru care nu a fost făcut.

și din păcate am avut deja experiența unor hack-uri pe 3 site-uri WordPress... deci nici el nu este foarte securizat...

Aproape toate hack-urile sunt rezultatul unui server nesecurizat sau a unui cod de plugin/theme. Nucleul WordPress este perfect securizat.

probabil da. Dar a spune că nucleul WordPress este perfect securizat este o exagerare...Patch-urile de securitate și actualizările există cu un motiv

Salut @Otto și alții.
Acum că există WP REST API, presupun că există un fel de router? Ai putea să actualizezi răspunsul tău pentru versiunea 4.7?

Nu. De ce ai presupune că lucrurile s-au schimbat? Încă nu există așa ceva. Este doar un endpoint în URL.

Am lucrat mai mult cu WordPress de la ultimul meu comentariu și am avut mai multe site-uri hackuite; chiar și site-uri fără plugin-uri terțe adiționale. A fost nevoie să creez scripturi pentru a găsi fișierele compromise și să le curăț, apoi să instalez Wordfence Security pentru a le monitoriza.
