Metodo di concatenazione di paginazione personalizzato

L'impaginazione del tipo di messaggio personalizzato ti ha deluso? Non c'è stato niente di più frustrante nello sviluppo di WordPress che ottenere una paginazione del tipo di post personalizzata. Ho sviluppato un metodo che risolve i miei mali e penso che risolverà anche il tuo.


introduzione

Poiché ho iniziato a creare temi WordPress di qualità superiore, ho iniziato a sviluppare un tema di base come una sorta di framework su cui costruire ogni nuovo progetto. Il processo stava andando bene fino a quando ho iniziato a lavorare con i tipi di post personalizzati. In quel momento, inevitabilmente, sono andato contro il mio nemico da tempo, l'impaginazione del tipo di messaggio personalizzato.

Dal rilascio di tipi di post personalizzati in WordPress 2.9, la loro impaginazione si è dimostrata difficile a seconda delle circostanze. Di tanto in tanto anche i professionisti di WordPress che colpiscono in modo massiccio sono stati fermati.

Per fortuna, sento di aver finalmente battuto una volta per tutte la paginazione del tipo di messaggio personalizzato. Immagino di piegarmi su se stesso nel bagliore del chiaro di luna, la mia faccia cesellata per la realizzazione, un piede piantato a terra e l'altro saldamente sul petto.

La mia chiave per la facile impaginazione del tipo di messaggio personalizzato sta usando il archive-posttype.php modello per fare qualcosa che chiamo concatenamento, nel senso che li usiamo come include in altri file modello WordPress in cui è necessaria la paginazione. Ciò che fa è ridurre lo sviluppo personalizzato per diverse circostanze in cui uno sviluppatore vorrebbe l'impaginazione. Consideralo come se si utilizzasse il modello di archivio del tipo di post personalizzato come indice o catch-all. Ci sono alcuni colpi di scena lungo la strada, ma questa è la grande idea. Cominciamo.


Passaggio 1: impaginazione

Poiché la codifica è una base scientifica, iniziamo con la questione della paginazione stessa. Anche se mi inchino alla grandezza del plugin di impaginazione, WP PageNavi, come ha recentemente sottolineato Jacob Goldman, non ce n'è davvero bisogno. WordPress ha una propria funzione di paginazione chiamata paginate_links () e apparentemente la maggior parte degli sviluppatori non ne sa nulla. Assicurati di leggere la sua documentazione, ma per farti risparmiare tempo per creare il tuo codice functions.php ecco la mia simile all'esempio del Codex:

function paginate () global $ wp_query, $ wp_rewrite; $ wp_query-> query_vars ['paged']> 1? $ corrente = $ wp_query-> query_vars ['paged']: $ corrente = 1; $ pagination = array ('base' => @add_query_arg ('page', '% #%'), 'format' => ", 'total' => $ wp_query-> max_num_pages, 'current' => $ current, 'show_all' => true, 'type' => 'plain'); if ($ wp_rewrite-> using_permalinks ()) $ pagination ['base'] = user_trailingslashit (trailingslashit (remove_query_arg ('s', get_pagenum_link (1)) ). 'page /% #% /', 'paged'); if (! empty ($ wp_query-> query_vars ['s'])) $ pagination ['add_args'] = array ('s' => get_query_var ( 's')); echo paginate_links ($ pagination);

Il mio metodo di concatenamento è stato sviluppato tenendo presente questa funzione. L'uso di PageNavi di WP per l'impaginazione del tipo di post personalizzata diventa davvero brutto, quindi non ti mostrerò come farlo per lo stesso motivo per cui gli amici non lasciano che gli amici si ubriacano. Prego. Ma passiamo a quello per cui sei veramente venuto - finalmente capire come mantenere l'impaginazione del tipo di post personalizzata dal lancio di un 404 o tornare sempre alla pagina uno.


Passaggio 2 Modello di archivio del tipo di messaggio personalizzato

Dal momento che i tipi di post personalizzati non hanno le loro pagine indice, e come ho detto prima, penso al archive-posttype.php template come stand-in in particolare perché lo utilizzo come base per la paginazione in tutti gli altri template. Molti sviluppatori prima accentuano un modello di pagina come una pagina di indice, ma 1.) Io ovviamente non sono d'accordo e 2.) ci arriveremo dopo. Anche la superstar di WordPress, Justin Tadlock, concorda che i tipi di post personalizzati dovrebbero avere almeno l'opzione delle proprie pagine indice.

Per fortuna, la mia funzione di paginate () fuori dalla scatola con il archive-posttype.php modello. Uff. Ma il problema è che la sua impaginazione è vincolata dall'impostazione di post per pagina in Impostazioni> Lettura. E poiché i tipi di post personalizzati sono proprio così, su misura, nove volte su dieci uno sviluppatore vorrebbe che i suoi post per pagina fossero personalizzati. Per fare questo il modo più semplice in cui sono arrivato è scrivere un filtro functions.php come questo:

function portfolio_posts_per_page ($ query) if ($ query-> query_vars ['post_type'] == 'portfolio') $ query-> query_vars ['posts_per_page'] = 1; return $ query;  if (! is_admin ()) add_filter ('pre_get_posts', 'portfolio_posts_per_page');

Questo metodo mi è venuto attraverso il post di Jonathan Christopher chiamato WordPress Post per pagina per tipo di messaggio personalizzato. Grazie, Jonathan!

Cosa succede se non desidero che la mia struttura permalink abbia lo stesso nome del mio tipo di post personalizzato (ad esempio http://company.com/portfolio/)? Sono contento che tu abbia chiesto. Questo è uno dei motivi per cui uno sviluppatore preferirebbe un modello di pagina per visualizzare i tipi di post personalizzati. Dà all'utente il pieno controllo sulla struttura del permalink perché può semplicemente cambiare il nome della Pagina che sta usando quel Page Template. È comprensibile e lo faremo presto, ma per quelli di noi che non hanno bisogno di farlo o vogliono un altro modo in futuro c'è una piccola modifica che possiamo fare sotto la cappa per piegare quella struttura alla nostra volontà.

La funzione per la creazione di un tipo di messaggio personalizzato, register_post_type (), accetta un argomento chiamato riscrittura. Il valore di quell'argomento viene passato come una matrice e la modifica del valore dello slug modificherà la struttura del permalink. Ecco un esempio:

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

Dopo averlo modificato, vai in Impostazioni> Permalink e fai clic sul pulsante "Salva modifiche" per scaricare la cache di riscrittura. Visita il tuo sito e aggiorna la pagina per visualizzare la modifica. Fatto e fatto. Tuttavia, l'unico svantaggio di questo metodo è che gli utenti non esperti di tecnologia non saranno in grado di cambiare il nome della loro struttura permalink dalla GUI di amministrazione a meno che, naturalmente, non siano diretti all'Editor temi per cambiare la riscrittura di slug.


Passo 3 Modelli di pagina

Non è raro che gli sviluppatori visualizzino e impagino i loro tipi di post personalizzati in una pagina statica tramite un modello di pagina. La ragione di ciò è duplice; fornisce all'utente la capacità di cambiare il nome della struttura permalink di cui abbiamo appena parlato e consente di visualizzare tipi di post personalizzati sulla prima pagina del loro sito. Ma le cose possono diventare brutte qui. Mi vergogno di dire che una volta ho codificato l'impaginazione del tipo di messaggio personalizzato in tre modi diversi in un tema. Ciò è in parte dovuto all'utilizzo di WP PageNavi, ma sono in possesso di questo fatto imbarazzante per sottolineare che l'intero processo può essere travolgente per gli sviluppatori di temi che non sono "a conoscenza".

Chiamiamo il nostro modello di pagina Pagina-portfolio.php per abbinare la convenzione di denominazione per i modelli di tipo di post personalizzati anche se non è uno. Ecco il codice:

/ * Nome modello: Portfolio * / $ paged = 1; if (get_query_var ('paged')) $ paged = get_query_var ('paged'); if (get_query_var ('page')) $ paged = get_query_var ('page'); query_posts ('& post_type = portfolio & paged ='. $ paged); require_once ('archive-portfolio.php');

Questa è la prima volta che vedi il archive-posttype.php modello incatenato a un altro modello. E funziona! Ma cosa diavolo sta succedendo? Questo business variabile di $ paging variabile evidenzia il problema esatto che gli sviluppatori sembrano avere con l'impaginazione del tipo di messaggio personalizzato. Fondamentalmente se questa correzione (tosse) non è a posto e un utente fa clic per visualizzare la pagina 2, come qualcuno che è stato fatto saltare in aria, WordPress si confonde e non sa dove si trova. E per aggiungere la beffa al danno apparentemente WordPress lo sa e lo accetta come normale procedura di sviluppo pubblicando questa nota nella sezione Parametri di paginazione della pagina Codex per WP_Query ():

Nota di impaginazione: dovresti impostare get_query_var ('pagina'); se vuoi che la tua query funzioni con l'impaginazione. Da WordPress 3.0.2, ottieni get_query_var ('page') invece di get_query_var ('paged'). Il parametro di impaginazione 'paginato' per WP_Query () rimane lo stesso.

Ha senso per me che gli sviluppatori dovrebbero essere in grado di impostare quella variabile e puntare a una pagina specifica. Ciò che non ha senso è il motivo per cui la paginazione funziona intrinsecamente con i tipi di post predefiniti (ad es. Post, pagina, allegato), ma non con quelli personalizzati.

Oltre a dover applicare una patch al codice, qui c'è un altro problema, in quanto non è possibile richiamare la slug di pagina come la slug del tipo di messaggio personalizzato. Pensa al tuo slug del tipo di messaggio personalizzato come parola chiave riservata; tuttavia, puoi rendere il titolo della tua pagina lo stesso nome del tuo slug del tipo di post personalizzato purché il tuo slug di pagina sia qualcosa di diverso.


Fase 4 Modello di pagina anteriore

Usando il front-page.php il modello blocca gli utenti in una pagina principale personalizzata senza la possibilità di modificarlo (a meno che non elimini il file o lo rinomini temporaneamente). Ecco perché molti sviluppatori optano per il metodo Page Template per la creazione di pagine frontali statiche, ma per il mio metodo, diciamo che stiamo usando il primo. Per ottenere una paginazione personalizzata del tipo di post per questo modello, tutto ciò che dobbiamo fare è semplicemente includere ciò che abbiamo fatto archive-posttype.php come questo:

require_once ('page-portfolio.php');

Step 5 Tassonomie personalizzate di tipo post

Il tassonomia-posttype-taxonomy.php il modello funziona allo stesso modo del front-page.php modello, ma invece di includere il Pagina-portfolio.php modello, includerai invece il nostro indice, archive-posttype.php, come questo:

require_once ('archive-posttype.php');

Questo completa l'estensione del mio metodo. Mentre una volta sbattevo la testa contro la scrivania alle due del mattino, ora mi muovo tranquillamente attraverso i progetti alle due del pomeriggio. Vittoria! Bene, almeno per ora. Non sono così ingenuo da pensare di non trovarmi in una situazione in cui questo metodo non funziona per l'impaginazione del tipo di messaggio personalizzato, ma non ho ancora.


Conclusione

A differenza dei miei altri post, spero che questo diventi obsoleto. La mia speranza è che WordPress agirà sulla recente indagine che mostra che il 92% di tutti gli sviluppatori usa WordPress come CMS e dà una seconda occhiata a come la paginazione funziona sulla loro piattaforma. Il team di WordPress è nientemeno che professionale. Immagino un futuro in cui sono presenti strumenti di impaginazione ed eventualmente una pagina di amministrazione del tipo di post personalizzata in Impostazioni per la gestione dei post per pagina per tipo di post personalizzato. Ma per ora spero che questo metodo di concatenamento aiuti i molti sviluppatori che ho visto soffrire sui forum di WordPress. Non esitate a scaricare, utilizzare e abusare dei seguenti file zippati come framework per la corretta impaginazione del tipo di messaggio personalizzato. Godere!