Metoda de înlănțuire a tipurilor de mesaje personalizate

Postarea personalizată tip post poți scăpa? Nu a fost nimic mai frustrant în curs de dezvoltare pentru WordPress decât obținerea paginii personalizate tip post post pentru a lucra. Am dezvoltat o metodă care mi-a rezolvat problemele și cred că va rezolva și dumneavoastră.


Introducere

Pe măsură ce am început să creez mai multe teme WordPress premium, am început să dezvolt o temă de bază ca un fel de cadru care să se bazeze pe fiecare proiect nou. Procesul mergea bine până am început să lucrez cu tipuri personalizate de posturi. Atunci m-am îndreptat în mod inevitabil împotriva dușmanului meu de mult timp, paginării tip post particularizate.

De la lansarea tipurilor personalizate de posturi în WordPress 2.9 paginarea lor sa dovedit dificilă în funcție de circumstanță. Chiar și profesioniștii WordPress greu de lovit au fost obosiți din când în când.

Din fericire, mă simt că am bătut în sfârșit o paginare personalizată tip post post o dată pentru totdeauna. Îmi imaginez că mă îndoiesc în strălucirea luminii lunare, chipul îmbrăcat în împlinire, un picior plantat pe pământ, iar celălalt ferm pe piept.

Cheia mea pentru o paginare ușoară personalizată tip post este folosită Arhiva-posttype.php șablon pentru a face ceva pe care o numesc lanț, ceea ce înseamnă că le folosim ca și în alte fișiere de șabloane WordPress unde este necesară paginarea. Ceea ce face acest lucru este reducerea dezvoltării personalizate pentru diferite circumstanțe în care un dezvoltator ar dori paginare. Gândiți-vă la utilizarea șablonului de arhivare personalizat tip post ca un index sau captură-toate. Există câteva răsturnări de-a lungul drumului, dar asta e ideea mare. Sa incepem.


Pasul 1 Pagination

Deoarece codarea este o fundație, știința începe cu problema paginării însăși. Chiar dacă mă aplec la mărimea pluginului de paginare, așa cum a subliniat recent Jacob Goldman, nu este nevoie de asta. WordPress are propria sa funcție de paginare numită paginate_links () și aparent majoritatea dezvoltatorilor nu știu nimic despre asta. Asigurați-vă că citiți documentația sa, dar vă puteți economisi timp pentru a-ți crea propriul cod functions.php aici este al meu similar cu exemplul Codex:

funcția paginate () global $ wp_query, $ wp_rewrite; $ wp_query-> query_vars ['paged']> 1? $ curent = $ wp_query-> query_vars ['paged']: $ curent = 1; $ paginare = array ('base' => @add_query_arg ('pagina', '% #%'), 'format' 'show_all' => true, 'type' => 'simplu'); dacă ($ wp_rewrite-> using_permalinks ()) pagination ['base'] = user_trailingslashit (trailingslashit (remove_query_arg ('s', get_pagenum_link (1)) )) pagină ['add_args'] = array ('s' => get_query_var (' 's')); echo paginate_links ($ pagination);

Metoda mea de înlănțuire a fost dezvoltată în funcție de această funcție. Folosind WP PageNavi pentru paginare personalizată post tip devine real urât, așa că nu vă va arăta cum să faceți acest lucru din același motiv prietenii nu lasa prietenii conduce beat. Cu plăcere. Dar hai să mergem la ceea ce ați venit cu adevărat - în sfârșit, imaginându-vă cum să păstrați paginarea personalizată post tip de la aruncarea unui 404 sau întoarcerea mereu înapoi la prima pagină.


Pasul 2 Șablon de arhivare personalizat tip de postare

Deoarece tipurile de posturi personalizate nu au propriile pagini de index, și așa cum am spus mai devreme, mă gândesc la Arhiva-posttype.php șablonul ca stand-in special pentru că îl folosesc ca bază pentru paginare în toate celelalte șabloane. Mulți dezvoltatori vor accentua mai întâi un șablon de pagină ca pagină de index, dar 1.) În mod evident nu sunt de acord și 2.) vom ajunge la cele mai târziu. Chiar și superstarul WordPress, Justin Tadlock, este de acord că tipurile de posturi personalizate ar trebui să aibă cel puțin opțiunea propriilor pagini de index.

Din fericire, funcția paginate () funcționează din cutie cu Arhiva-posttype.php șablon. Pfiu. Problema este însă că paginarea este legată de setarea pentru mesaje pe pagină în Setări> Citire. Și pentru că tipuri personalizate de posturi sunt doar acelea care, personalizate, de nouă ori din zece, un dezvoltator va dori ca mesajele pe pagină să fie personalizate. Pentru a face acest lucru, cel mai simplu mod în care am venit este să scriu un filtru în functions.php asa:

funcție portofoliu_posts_per_page ($ query) if ($ query-> query_vars ['post_type'] == 'portofoliu') $ query-> query_vars ['posts_per_page'] = 1; returnați $ query;  dacă (! is_admin ()) add_filter ('pre_get_posts', 'portofoliu_posts_per_page');

Această metodă mi-a venit prin intermediul postului lui Jonathan Christopher, numit WordPress Posts Per Page Per Type Custom Post. Mulțumesc, Jonathan!

Ce se întâmplă dacă nu doresc ca structura mea permalink să aibă același nume pentru tipul meu de post personalizat (de ex. Http://company.com/portfolio/)? Mă bucur că ai întrebat. Acesta este unul dintre motivele pentru care un dezvoltator ar prefera un șablon de pagină să afișeze tipurile personalizate de postări. Oferă utilizatorului controlul asupra structurii permalink, deoarece poate schimba pur și simplu numele paginii care utilizează acel șablon de pagină. Acest lucru este de înțeles și o să facem asta în curând, dar pentru aceia dintre noi care nu au nevoie de asta sau care doresc o altă cale în viitor, există o mică editare pe care o putem face sub capotă pentru a înclina această structură la voința noastră.

Funcția pentru crearea unui tip de post particularizat, register_post_type (), acceptă un argument numit rescrie. Valoarea argumentului respectiv este trecută ca o matrice și schimbarea valorii acestuia va schimba structura permalink. Iată un exemplu:

'rewrite' => array ('slug' => 'insertyourpermalinknamehere', 'with_front' => true),

După ce ați schimbat acest lucru, mergeți la Settings> Permalinks și apăsați butonul "Salvați modificările" pentru a vă anula cache-ul de rescriere. Accesați site-ul dvs. și actualizați pagina pentru a vedea modificarea. Gata si gata. Totuși, din nou, singurul dezavantaj al acestei metode este non-tech-savvy utilizatorii nu vor putea să schimbe numele structurii lor permalink din administrarea GUI, cu excepția cazului în care, desigur, se îndreaptă spre Theme Editor pentru a schimba acea rescriere.


Pasul 3 Șabloane de pagină

Nu este neobișnuit ca dezvoltatorii să afișeze și să pagineze tipurile personalizate de postări într-o pagină frontală statică prin intermediul unui șablon de pagină. Motivul pentru aceasta este de două ori; oferă utilizatorului posibilitatea de a schimba nume de structură permalink despre care tocmai am vorbit și care îi permite să afișeze tipuri personalizate de posturi pe prima pagină a site-ului lor. Dar lucrurile pot deveni urâte aici. Mi-e rușine să spun că mi-am codificat o paginare personalizată tip post după trei moduri diferite într-o singură temă. Acest lucru se datorează parțial utilizării paginii WP PageNavi, dar dețin acest fapt jenant pentru a sublinia faptul că întregul proces poate fi copleșitor pentru dezvoltatorii temelor care nu sunt în "know".

Să ne sunăm la șablonul de pagină Pagina-portfolio.php pentru a se potrivi cu convenția de numire pentru șabloanele personalizate tip post, chiar dacă nu este una. Iată codul:

/ * Nume de șablon: Portofoliu * / $ paged = 1; dacă (get_query_var ("paginat")) $ paged = get_query_var ("paginat"); dacă (get_query_var ('pagina')) $ paged = get_query_var ('pagina'); query_posts ('& post_type = portofoliu & paged ='. $ paged); requ_once ('archive-portfolio.php');

Aceasta este prima dată când vă vedeți Arhiva-posttype.php șablon aliniat la un alt șablon. Și funcționează! Dar ce naiba se întâmplă? Această afacere variabilă $ paged variază evidențiază faptul că dezvoltatorii problematici par să aibă o paginare personalizată tip post. În principiu, dacă această remediere (tuse) nu este în vigoare și un utilizator dă clic pentru a vedea pagina 2, cum ar fi cineva care a fost bopat peste cap, WordPress devine confuz și nu știe unde se află. Și pentru a adăuga insultă rănirii aparent WordPress știe acest lucru și o acceptă ca o procedură de dezvoltare normală prin publicarea acestei note în secțiunea Parametri de paginare a paginii Codex pentru WP_Query ():

Paginare Notă: trebuie să setați get_query_var ("pagină"); dacă doriți ca interogarea să funcționeze cu paginare. De la WordPress 3.0.2, faceți get_query_var ("pagină") în loc de get_query_var ("paginat"). Parametrul de paginare "paginat" pentru WP_Query () rămâne același.

Are sens pentru mine că dezvoltatorii ar trebui să poată seta această variabilă și să indice o anumită pagină. Ceea ce nu are sens este motivul pentru care paginarea funcționează în mod inerent cu tipurile de post implicit (adică mesaj, pagină, atașament), dar nu cu cele personalizate.

Dincolo de necesitatea de a patch-uri codul există o altă capcană aici, în care nu puteți apela pagina dvs. slug același lucru ca slug tip post post custom. Gândiți-vă la tipul dvs. de postare personalizat, care este un cuvânt cheie rezervat; cu toate acestea, puteți face ca titlul paginii dvs. să aibă același nume ca și tipul personalizat de post post, atâta timp cât pagina dvs. de slug este diferită.


Pasul 4 Șablon de pagină frontală

Utilizarea front-page.php șablon blochează utilizatorii într-o pagină frontală personalizată, fără posibilitatea de ao schimba (dacă nu șterg fișierul sau îl redenumește temporar). De aceea majoritatea dezvoltatorilor optează pentru metoda Template Page pentru crearea paginilor frontale statice, dar, de dragul metodei noastre, să spunem că folosim primul. Pentru a obține paginare particularizată post tip pentru acest șablon tot ce trebuie să faceți este să includeți pur și simplu ceea ce am făcut Arhiva-posttype.php asa:

requ_once ('page-portfolio.php');

Pasul 5 Taxonomii personalizate tip post

taxonomie-posttype-taxonomy.php șablon funcționează în același mod ca și front-page.php șablon, dar în loc să includă Pagina-portfolio.php șablon, veți include indexul nostru, Arhiva-posttype.php, asa:

requ_once ('archive-posttype.php');

Asta completează amploarea metodei mele. Unde mi-am lovit odată ceasul la birou la două dimineață, acum mă mișc liniștit prin proiecte la două după-amiaza. Victorie! Ei bine, cel puțin pentru moment. Nu sunt atât de naivă încât să cred că nu mă găsesc într-o situație în care această metodă nu funcționează pentru paginare personalizată tip post, dar nu am încă.


Concluzie

Spre deosebire de celelalte postări ale mele, sper că aceasta va deveni depășită. Speranța mea este că WordPress va acționa în urma unui sondaj recent, care arată că 92% dintre toți dezvoltatorii folosesc WordPress ca un CMS și iau oa doua privire la modul în care paginarea funcționează pe platforma lor. Echipa de la WordPress nu este nimic mai puțin decât profesionist. Îmi imaginez un viitor în care sunt construite instrumente de paginare și, eventual, o pagină de administrare personalizată post tip în secțiunea Setări pentru administrarea postărilor pe pagină pe tip de post particularizat. Dar, deocamdată, sper că această metodă de înlănțuire îi ajută pe mulți dezvoltatori pe care i-am văzut suferind pe Forumurile WordPress. Vă rugăm să nu ezitați să descărcați, să utilizați și să abuzați de următoarele fișiere zip ca un cadru pentru paginare personalizată de tip post poștală de succes. se bucura!

Cod