Conditionele archief aanpassingen in WordPress met pre_get_posts

Een fout die ik wel eens tegenkom in WordPress websites is dat de paginering niet goed samenwerkt met bepaalde filters op archief pagina’s. Zo kan het zijn dat een custom post type 50 artikelen heeft, maar dat de paginering maar 2 pagina’s toont. De oplossing is gelukkig erg makkelijk.

Conditionele archief aanpassingen in WordPress met pre_get_posts

Conditionele archief aanpassingen in WordPress met pre_get_posts

Wellicht is dit herkenbaar, je opent een customposttype-archive.php file en je ziet dat er in dit bestand een hoop filters worden toegepast. Er wordt een nieuwe instantie van WP_Query aangemaakt en daar filters op los gelaten. Opzich is hier niets mis mee, totdat je de standaard paginering van WordPress hiermee wil laten werken.

Code voorbeeld:

Bovenstaand voorbeeld is een ingekorte versie van een custom archive page voor een post type: newsitem. Er wordt aan de bovenkant een variabele aangemaakt die de huidige pagina moet gaan onthouden. Vervolgens wordt er een array aangemaakt ($query_parameters) met een aantal filters. Het meest interessante deel van dit voorbeeld is:

Er wordt hier gebruik gemaakt van een eigen Wp_Query instantie via de variabele $query. De paginering functies next_posts_link en previous_posts_link hebben geen weet van de filters binnen $query. De paginering kijkt namelijk naar de globale $wp_query variabele, niet de lokale $query variabele.

Hoe lossen we dit nu op?

Allereerst vind ik het altijd erg rommelig lezen wanneer er filters en overige “business logic” in template bestanden wordt geplaatst. We gaan een stuk code dus refactoren door deze grotendeels te verplaatsen naar functions.php van het huidige thema. Er zal gebruik gemaakt worden van “pre_get_posts“, in plaats van een eigen instantie aan te maken van Wp_Query. Plaats onderstaande code in je functions.php, en vervang hierbij ‘newsitem’ met je eigen custom post type.:

 

Dit is alles wat er nodig is om de filters en paginering werkend te krijgen in ons “customposttype-archive.php” template bestand. WordPress filtert automatisch op de juist pagina, dus dat deel van de code kunnen we laten vallen. Alle andere query parameters die voorheen opgevraagd werden via $wp_query->query_vars zitten al in de $wp_query variabele, daar hoeven we ook niet meer naar te kijken. Als laatste kun je dus je template schoon houden door onnodige code te verwijderen. Zie maar eens hoe opgeruimd de template nu geworden is:

Een stuk leesbaarder en sneller bovendien! We maken nu weer gebruik van de globale $wp_query variabele, aangezien hier via functions.php de juiste filters op worden toegepast zal onze paginering nu ook werken!

Overigens: deze code snippet werkt in elk WordPress thema!

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *