Noriu savo struktūros WordPress’e

Nustok burną aušint, Dominykai, ir duok source’ą.

Sugalvojus pricipą, išplėtojus idėją ir apibrėžus taisykles galima žiūrėti dar konkrečiau. Turint omeny mano visus princesiškus įgeidžius, WordPress šiaip jau nėra bloga sistema, nors kodo kiekis skirtas adresų generavimui ir jų apdorojimui yra stulbinantis (ir netgi isteriškai juokingas). Tačiau čia jau jų pačių problema, kylanti iš to, kad siekiama patenkinti kuo didesnį vartotojų ratą. Tačiau liaudies išmintis teigia ką kitą – kartais kas tinka viskam – netinka niekam. Na bent jau man tikrai netinka masinio vartojimo produktas, kuris netenkina mano poreikių. Tačiau WP yra atviro kodo ir šiaip jau tiesiog prašosi laužomas ir “pritaikomas” – kaina viso to be abejo yra tai, kad ateityje mano “perrašymai” gali nebeveikti ir teks prie jų padirbėti sulig kiekvienu WP relyzu, tačiau vieną kartą pasidarius taip kaip aš noriu – turėčiau būti patenkintas gana ilgai, net su sena WP versija – don’t fix it, if it ain’t broken.

Užduotis

Mano tikslas yra priversti WP atpažinti adresus, pagal mano struktūrą, priversti jį generuoti adresus pagal mano struktūrą ir priversti jį padaryti 301 redirektą, kai adresas netenkina struktūros. Kadangi nežinau iki galo visų galimybių, kurias naudosiu, be to ir laikas ribotas – kol kas užteks sutvarkyti šitaip:

  • Turinys (content):
    • /2007/ – mėnesių sąrašas [Archyvas, 2007]
      • 01-12/ – post’ų sąrašas [Archyvas, 2007, mėnuo]
        • postas-numeris-vienas.html
        • postas-numeris-vienas.(rss|atom|rdf|rss2).xml
        • postas-numeris-vienas.trackback
    • /pavadinimas.html – paprastas puslapis (analogiškai postams – rss ir tb)
    • /attachments/2007/11/pavadinimas.html – prisegto failo aprašymas (analogiškai postams – rss ir tb)
  • Archyvai:
    • kategorijos/ – kategorijų sąrašas
      • pavadinimas[/subpavadinimas].html – paskutiniai X įrašų kategorijoje
      • pavadinimas[/subpavadinimas].(rss|atom|rdf|rss2).xml – kategorijos feed’as
    • tagai/ – tagų debesėlis
      • pavadinimas.html
      • pavadinimas.(rss|atom|rdf|rss2).xml
  • Visa kita – filtruojasi per standartinius WP GET parametrus, kreipiantis į /search. Visą /search tuo pačiu įdedame į noindex, nes ten bus dinamiškas, pasikartojantis ir visaip kitaip paieškos robotams nenaudingas turinys – pažangūs vartotojai patys susigaudys kaip išgauti tai ko nori.

Kur ieškoti?

WordPress filosofija leidžia filtruoti beveik visą įmanomą išvedimą – tai bene labiausiai palengvina mano darbą. Problema aišku ta, kad visi tie filtrai gana prastai dokumentuoti ir nėra patogios naming convention, todėl teks verstis su elementaria paieška kode.

Perrašymas susideda iš trijų dalių – turinio atpažinimo iš URL, nuorodų generavimo ir nuorodų kanonizavimo. Atpažinimą susitvarkyti gana paprasta – reikia detaliai išsianalizuoti wp-includes/rewrite.php failą ir ką jis veikia, po to sukurti savo regular expressions. Nuorodų generavime beveik visur (išskyrus puslapiavimą paieškoje ir pan.) yra naudojami apply_filter – per visą WP source’ą paleidus paieškas _link( ir _url(, po to truputį padirbėjus galima susirinkti visus reikalingus filtrus (nes dokumentacija pasitikėti kažko sunku).

Kanonizavimas yra iš esmės paprastas – jeigu rodomas objektas (puslapis, archyvas, pan.) yra kviečiamas ne su kanonine nuorodą – darom 301 redirektą. Panašiai elgiasi standartinė WP kanonizacija (wp-includes/canonical.php), tačiau ji neveikia su feed’ais ir (pagal mano reikalavimus) neperkelia lankytojų į “/search” neindeksuojamą sritį – teks jį išjungti ir daryti savo.

Rezultatas

12 valandų galvos trankymo į sieną, eureka šūksnių, keiksmų, verkimo, testas su Google Sitemaps pluginu, pergalės šokis ir canonizer plugin’as paruoštas. Iš esmės niekam nerekomenduoju jo naudoti – tačiau peržvelgti kodą, pažiūrėti kaip veikia mano blog’as ir galbūt dalį to pritaikyti sau – visada prašom. Į egzistuojantį blog’ą jo kelti nederėtų dėl jau minėtos adresų pasikeitimo priežasties – nesivarginau daryti backwards compatibility su visomis įmanomomis WP instaliacijomis, todėl jūsų senos nuorodos gali paprasčiausiai nustoti veikti. Be to plugin’as tikisi keletos nustatymų – visų pirma permalink struktūra turėtų būti /%year%/%monthnum%/%postname%.html; taipogi pirmasis puslapis turėtų būti įrašų sąrašas (netikrinau ar veikia kitu atveju). Na ir šiaip jis nėra pakankamai ištestuotas – laikas parodys.

Nepaisant to, kas yra skonio reikalas, svarbiausios veikimo detalės:

  • add_action('init',array('Dominykas_Canonizer','init'));

    Užsikraunam, pasileidžiam, važiuojam, žiūrim į klasės init() metodą

  • init() viduje nematome nieko ypatingo – inicializuojami keli kintamieji ir nustatomi filtrai:
    • f_rr_*() – filtruojam perrašymo taisykles. Grąžinam asiociatyvų masyvą, kurį naudoja $wp_rewrite. f_rr() tuo pačiu dar šiek tiek pravalo tai kas man neįdomu.
    • f_url_*() – filtruojam sugeneruotus adresus. Kiekviena funkcija labai skirtinga ir su skirtingais parametrais – bet galbūt vieną dieną WP viduje įsivyraus tvarka ir gyventi bus paprasčiau… f_url() ištaiso puslapiavimą (kabinamės ant clean_url, nes kito būdo nėra) – šitą funkciją reikės perrašyti, kai apsispręsiu dėl gražios puslapių struktūros (tinkamos SEO).
    • redirect_canonical – perkeliam lankytoją į Teisingą Adresą
  • Dar viduje randame keletą pagalbiniu funkcijų:
    • query_allowed_only() – sutikrinam ar turime tiksliai tokius ir tik tokius parametrus kaip reikalinga kanoniniam adresui
    • rebuild_url() – quick-n-dirty hackas atstatyti adresą, kurį sugriovėme su parse_url()

Dalis funkcijų dokumentuota, dalis gimė copy-paste būdu, o Windows kažkodėl ištrina visus komentarus iš clipboard’o (tikrai tikrai!)

Kas toliau?

Galbūt vieną dieną WP išaugs į padorų OO dizainą. Galbūt vieną dieną visas nuorodų generavimas bus viename faile. Tada bus galima tiesiog pakeisti $wp_rewrite ir pvz. $wp_links objektus į savo parašytus/išplėstus ir nukris dalis vargo (performance’o atžvilgiu turėtų tikrai būti efektyviau, nei du kartus atlikinėti tą patį darbą). Artimiausias dalykas though – sutvarkyti į padorią PHP5 objektinę sintaksę (static funkcijos), bei sutvarkyti, kad nuorodų atpažinimo regexpų kešas nebūtų generuojamas kas kartą ($wp_rewrite->flush_rules();. Vėliau jau bus galima žiūrėti šiek tiek plačiau, kad padengti daugiau WP funkcijų ir pritaikyti didesniam ratui lankytojų. Pirmas žingsnis į išleidimą viešumon, būtų permalink nustatymų pakeitimas, t.y. WP options turėtų būti galima pasirinkti ar naudoti WP permalinkus, ar naudoti šio plugino sistemą – tada jau tektų kurti ir konfigūracijos opcijas. Jeigu kas nors norite tuo užsiimti – prašau! Kodo turbūt nerašysiu, bet į klausimus kiek sugebėsiu – atsakysiu.

O tęsiant WP hackinimo temą, natūralus posūkis yra link skinų laužymo ir templeitų pritaikymo.

2 Responses to “Noriu savo struktūros WordPress’e”

Komentarų RSS