Tilpasset posttype paginering fikk deg ned? Det har ikke vært noe mer frustrerende i å utvikle for WordPress enn å få tilpasset posttype paginering til jobb. Jeg har utviklet en metode som har løst mine woes og jeg tror det vil løse din også.
Som jeg har begynt å skape flere premium WordPress-temaer, har jeg begynt å utvikle et grunntema som en slags rammeverk for å bygge på med hvert nytt prosjekt. Prosessen gikk bra til jeg begynte å jobbe med tilpassede innleggstyper. Det var da jeg uunngåelig gikk opp mot min lange fiende, tilpasset posttype paginering.
Siden utgivelsen av egendefinerte innleggstyper i WordPress 2.9 har deres paginering vist seg vanskelig, avhengig av forholdet. Selv tyngende WordPress-profesjonelle har blitt stumpet fra tid til annen.
Heldigvis føler jeg at jeg endelig har slått tilpasset posttype paginering en gang for alle. Jeg tenker meg selv å bøye seg over det i måneskinnets glød, ansiktet mitt hjalp i prestasjon, en fot plantet på bakken og den andre fast på brystet.
Min nøkkel til enkel tilpasset posttype paginering bruker arkiv-posttype.php mal for å gjøre noe jeg kaller chaining, noe som betyr at vi bruker dem som inneholder i andre WordPress-malfiler der paginering er nødvendig. Hva dette gjør er kuttet ned på tilpasset utvikling for forskjellige omstendigheter der en utvikler vil ha paginering. Tenk på det som å bruke arkivmalen for tilpasset posttype som en indeks eller catch-all. Det er noen vendinger underveis, men det er den store ideen. La oss begynne.
Siden koding er et grunnlag, kan vitenskapen starte med spørsmålet om paginering selv. Selv om jeg bøyer seg til storheten til pagineringspluggen, sa WP PageNavi, som Jacob Goldman nylig påpekte, at det egentlig ikke er behov for det. WordPress har sin egen paginasjonsfunksjon kalt paginate_links () og tilsynelatende fleste utviklere vet ingenting om det. Sørg for å lese dokumentasjonen, men for å spare deg for å mote din egen kode for functions.php her er min lik Codex-eksemplet:
funksjon paginate () global $ wp_query, $ wp_rewrite; $ wp_query-> query_vars ['paged']> 1? $ current = $ wp_query-> query_vars ['paged']: $ current = 1; $ pagination = array ('base' => @add_query_arg ('side', '% #%'), 'format' => ", 'totalt' => $ wp_query-> max_num_pages, 'current' => $ nåværende, 'show_all' => true, 'type' => 'plain'), hvis ($ wp_rewrite-> using_permalinks ()) $ paginering ['base'] = user_trailingslashit (trailingslashit (remove_query_arg ('s', get_pagenum_link (1)) ) 'side /% #% /', 'paged'); hvis (! tomt ($ wp_query-> query_vars ['s'])) $ paginering ['add_args'] = array ('s' => get_query_var 's')); echo paginate_links ($ pagination);
Min kjedemetode har blitt utviklet med denne funksjonen i tankene. Bruke WP PageNavi for tilpasset posttype paginering blir ekte stygg, så jeg vil ikke vise deg hvordan du gjør det av samme grunn venner ikke la venner kjøre full. Værsågod. Men la oss gå videre til det du virkelig kom til - endelig finne ut hvordan du beholder egendefinert posttype paginasjon fra å kaste en 404 eller alltid tilbake til side en.
Siden egendefinerte innleggstyper ikke har egne indekssider, og som jeg sa før, tenker jeg på arkiv-posttype.php mal som sin stand-in spesielt fordi jeg bruker den som grunnlag for paginering i alle andre maler. Mange utviklere vil først stresse en sidemall som en indeksside, men 1.) Jeg er åpenbart uenig og 2.) vi kommer til dem senere. Selv WordPress superstjerne Justin Tadlock er enig i egendefinerte innleggstyper skal ha minst muligheten til egne indekssider.
Heldigvis min paginate () funksjon ut av boksen med arkiv-posttype.php mal. Puh. Men problemet er at paginasjonen er bundet av innstillingen for innlegg per side i Innstillinger> Lesing. Og fordi egendefinerte innleggstyper bare er det, egendefinert, 9 ganger ut av ti, vil en utvikler vil at deres innlegg per side skal være tilpasset også. For å gjøre dette er den enkleste måten jeg har kommet på å skrive et filter inn functions.php som dette:
funksjon portfolio_posts_per_page ($ query) if ($ query-> query_vars ['post_type'] == 'portefølje') $ query-> query_vars ['posts_per_page'] = 1; returner $ spørring; hvis (! is_admin ()) add_filter ('pre_get_posts', 'portfolio_posts_per_page');
Denne metoden kom til meg ved hjelp av Jonathan Christophers innlegg som heter WordPress Innlegg per side per egendefinert innleggstype. Takk, Jonathan!
Hva skjer hvis jeg ikke vil at min permalinkstruktur skal ha samme navn for egendefinert innleggstype (for eksempel http://company.com/portfolio/)? Jeg er glad du spurte. Dette er en av grunnene til at en utvikler foretrekker en sidemal for å vise sine egendefinerte innleggstyper. Det gir brukeren full kontroll over permalinkstrukturen fordi de ganske enkelt kan endre navnet på siden som bruker den aktuelle sidemalen. Det er forståelig, og vi gjør det snart, men for de av oss som ikke trenger å gjøre det eller vil ha en annen vei i fremtiden, er det en liten redigering vi kan gjøre under hetten for å bøye den strukturen til vår vilje.
Funksjonen for å opprette en egendefinert innleggstype, register_post_type (), aksepterer et argument som kalles omskriving. Dette argumentets verdi er bestått som en matrise og endring av verdien av sluggen vil endre permalinkstrukturen. Her er et eksempel:
'rewrite' => array ('slug' => 'insertyourpermalinknamehere', 'with_front' => true),
Når du har endret dette, går du til Innstillinger> Permalinks og klikker på "Lagre endringer" -knappen for å dumpe omskrivningsbufferen. Besøk nettstedet ditt og oppdatere siden for å se endringen. Ferdig og ferdig. Igjen skjønt, den eneste ulempen med denne metoden er ikke-teknologiske kunnskapsrike brukere vil ikke kunne endre navnet på deres permalinkstruktur fra administrasjonsguiden, med mindre de selvfølgelig er på vei til temaredigereren for å endre den omskrivningsluggen.
Det er ikke uvanlig for utviklere å vise og paginere sine egendefinerte innleggstyper på en statisk forside ved hjelp av en sidemall. Årsaken til dette er to ganger; Det gir brukeren den permalinkstrukturen som skifter navn, og vi gjør det mulig å vise tilpassede innleggstyper på forsiden av nettstedet deres. Men ting kan bli stygg her. Jeg skammer meg for å si at jeg en gang kodet tilpasset posttype paginering tre forskjellige måter i ett tema. Dette skyldes delvis bruk av WP PageNavi, men jeg eier dette pinlige faktum for å understreke at hele prosessen kan være overveldende for temautviklere som ikke er i "vet".
La oss ringe til vår sidemal side-portfolio.php for å matche navngivningskonvensjonen for egendefinerte posttypemaler selv om det ikke er en. Her er koden:
/ * Malnavn: Portefølje * / $ paged = 1; hvis (get_query_var ('paged')) $ paged = get_query_var ('paged'); hvis (get_query_var ('side')) $ paged = get_query_var ('side'); query_posts ('& post_type = portfolio & paged ='. $ paged); require_once ('archive-portfolio.php');
Dette er første gang du ser på arkiv-posttype.php malkjedet til en annen mal. Og det fungerer! Men hva er det som skjer? Denne janky $ paged variable virksomheten fremhever de nøyaktige problemutviklerne synes å ha med tilpasset posttype paginering. I utgangspunktet hvis denne feilen (hoste) ikke er på plass, og en bruker klikker for å se side 2, som noen som har blitt spilt over hodet, blir WordPress forvirret og vet ikke hvor den er. Og for å legge til fornærmelse mot skade, vet WordPress dette og aksepterer det som vanlig utviklingsprosedyre ved å publisere dette notatet i delen Pagineringparametre på Codex-siden for WP_Query ():
Paginering Merk: Du bør sette get_query_var ('side'); hvis du vil at søket ditt skal jobbe med paginering. Siden WordPress 3.0.2, får du_query_var ('side') i stedet for get_query_var ('paged'). Pagineringsparameteren 'paged' for WP_Query () forblir den samme.
Det er fornuftig for meg at utviklere skal kunne sette den variabelen og peke på en bestemt side. Det som ikke er fornuftig, er at paginering i seg selv virker med standard innleggstyper (dvs. innlegg, side, vedlegg), men ikke med tilpassede.
Utover å måtte legge til koden, er det en annen fangst her fordi du ikke kan ringe din Side slug det samme som din egendefinerte posttype slug. Tenk på din tilpassede posttype slug som et reservert søkeord; Du kan imidlertid gjøre tittelen på siden din samme navn som den egendefinerte innleggstypen din, bare så lenge siden slak er noe annerledes.
Bruker front-page.php mal låser brukerne inn i en tilpasset forsiden uten muligheten til å endre den (med mindre de sletter filen eller endrer navn på den midlertidig). Derfor velger de fleste utviklere at man bruker Page Template-metoden for å lage statiske forsidesider, men for min metode mener vi at vi bruker den tidligere. For å oppnå egendefinert posttype paginering for denne malen er alt vi trenger å gjøre, bare å inkludere det vi har gjort for arkiv-posttype.php som dette:
require_once ('page-portfolio.php');
De taksonomi-posttype-taxonomy.php mal fungerer på omtrent samme måte som front-page.php mal, men i stedet for å inkludere side-portfolio.php mal, vil du i stedet inkludere indeksen vår, arkiv-posttype.php, som dette:
require_once ('archive-posttype.php');
Det fullfører omfanget av metoden min. Der jeg en gang slapp hodet mitt mot pulten om to om morgenen, beveger jeg meg nå rolig gjennom prosjekter klokken to om ettermiddagen. Seier! Vel, i hvert fall for nå. Jeg er ikke så naiv som å tro at jeg ikke finner meg selv i en situasjon der denne metoden ikke fungerer for tilpasset posttype paginering, men jeg har ikke ennå.
I motsetning til mine andre innlegg håper jeg denne blir utdatert. Mitt håp er at WordPress vil handle på den nylige undersøkelsen som viser at 92% av alle utviklere bruker WordPress som et CMS og tar et sekund å se på hvordan paginering fungerer på tvers av plattformen. Teamet på WordPress er ikke mindre enn profesjonelt. Jeg forestiller meg en fremtid hvor det er bygget inn paginasjonsverktøy og muligens en tilpasset posttype admin side under Innstillinger for administrering av innlegg per side per egendefinert innleggstype. Men for nå håper jeg denne kjedemetoden hjelper de mange utviklerne jeg har sett lidelse på WordPress Forums. Ta gjerne ned, bruk og misbruk følgende zip-filer som et rammeverk for vellykket tilpasset posttype paginering. Nyt!