Cum funcționează rutarea în WordPress?

12 apr. 2014, 10:46:59
Vizualizări: 55.2K
Voturi: 24

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

7
Comentarii

analizând codul, observ că la fiecare solicitare apelează query_posts? de ce naiba are nevoie să interogheze postări de fiecare dată? nu există cazuri în care de fapt nu vrei să afișezi postări??

yeahman yeahman
12 apr. 2014 10:49:17

Conținuturile sunt salvate ca postări în WP. Deci, când trebuie să afișezi conținuturi, trebuie să le interoghezi

Sisir Sisir
12 apr. 2014 11:36:55

Pot să sugerez să citești despre "the loop" care este conceptul pe care trebuie să-l înțelegi pentru a ști cum funcționează WordPress. În esență, "the loop" afișează o matrice de postări care este rezultatul query_posts. Pentru solicitările URL non-admin, WP este conceput să afișeze doar postări și este nevoie de programare personalizată pentru a afișa altceva în afară de o postare. Solicitările URL admin sunt diferite și acestea nu folosesc "the loop" și afișează lucruri care nu sunt postări.

User User
12 apr. 2014 11:52:01

ok, dar această abordare este un pic ciudată și nu foarte flexibilă, să fiu sincer

yeahman yeahman
12 apr. 2014 13:07:12

de exemplu, dacă vreau să afișez un formular de contact... trebuie să pun codul HTML într-un tip de conținut de pagină? Încă încerc să înțeleg unde să pun logica pentru trimiterea formularului... (în page.php din temă? abordare foarte urâtă)

yeahman yeahman
12 apr. 2014 13:08:50

Probabil că nu ai face ca un formular de contact să stocheze ceva din formular în baza de date, l-ai codifica ca un plugin și ai pune logica pentru trimiterea formularului în plugin. Pentru a afișa codul special al formularului într-o Pagină sau Postare, definesc un shortcode.

Otto Otto
12 apr. 2014 13:09:59

Alternativ, dacă faci o temă pentru tine și nu vrei să te deranjezi cu crearea unui plugin portabil, poți crea un „Șablon de Pagină” în tema ta, cu codul tău în el, apoi poți crea o Pagină nouă și să-i spui să folosească acel șablon special. Șabloanele sunt PHP, ele pot face orice doresc.

Otto Otto
12 apr. 2014 13:14:41
Arată celelalte 2 comentarii
Toate răspunsurile la întrebare 1
19
36

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

12 apr. 2014 13:08:56
Comentarii

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

yeahman yeahman
12 apr. 2014 13:14:07

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

yeahman yeahman
12 apr. 2014 13:15:08

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

Otto Otto
12 apr. 2014 13:19:21

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ă)

yeahman yeahman
12 apr. 2014 13:24:26

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

Otto Otto
12 apr. 2014 13:54:11

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

User User
12 apr. 2014 16:03:06

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.

User User
12 apr. 2014 16:31:21

Î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).

yeahman yeahman
12 apr. 2014 16:42:24

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.

User User
12 apr. 2014 17:36:13

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

Otto Otto
12 apr. 2014 21:48:43

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.

yeahman yeahman
12 apr. 2014 23:04:30

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.

yeahman yeahman
7 nov. 2015 19:47:41

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

yeahman yeahman
7 nov. 2015 19:48:53

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

Otto Otto
7 nov. 2015 21:31:33

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

yeahman yeahman
8 nov. 2015 10:31:19

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?

MrMesees MrMesees
15 dec. 2016 07:23:09

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

Otto Otto
17 dec. 2016 09:38:18

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.

yeahman yeahman
4 feb. 2017 09:47:06

Pentru cei care se întreabă unde este setată interogarea, căutați wp(); în wp-blog-header.php

8ctopus 8ctopus
2 nov. 2023 09:20:00
Arată celelalte 14 comentarii