Het aantal (custom) post types per pagina instellen

Wil je direct een mail ontvangen wanneer nieuwe snippets zijn toegevoegd?

Vul dan onderstaand formulier in en je krijgt direct na het toevoegen van nieuwe snippets een email. Zo blijf je altijd bij!

Wanneer je het aantal blogposts wilt beperken wat er op een pagina getoond wordt, dan is dat heel makkelijk te doen vanuit de WordPress instellingen. Je gaat gewoon naar ‘Instellingen->Lezen’ en onder het aantal te tonen berichten, pas je de instelling gewoon aan :

| Het aantal (custom) post types per pagina instellen

Makkelijk genoeg niet waar? Daar heb je geen code snippet voor nodig.

Wat er alleen niet duidelijk wordt aangegeven, is dat je hiermee ook alle custom post types die je elders zou willen gebruiken ingesteld hebt.

Heb je bijvoorbeeld nog een ‘portfolio’, ’testimonials’, ‘products’ en ‘faq’ custom post types zullen die ook allemaal tot dat aantal beperkt worden op archief pagina’s.

Dat is misschien niet wat je wilt. Ik kan mij bijvoorbeeld voorstellen, dat je een blog, een webshop en een portfolio van de door jou uitgevoerde projecten hebt. De blogpagina, waarbij je iedere blogpost op ƩƩn rij van de pagina hebt, wil je niet te lang maken, en daarom zou je graag 5 blogposts per pagina zien. Voor wat betreft de portfolio, met foto’s van je projecten, wil je eigenlijk alles in een matrix van 5 rijen van 4 kolommen zetten (20 posts dus) en je winkelproducten wil je 12 per pagina tonen. Een matrix van 3×4. Hoe krijg je dit voor elkaar?

Theme builders zijn hier niet je vriend!

Wanneer je een theme builder als Elementor Pro gebruikt, dan lijkt de eerste oplossing om in plaats van de Archive Widget (die je op de archive pagina gebruikt, om posts te tonen, en waarbij je geen maximaal aantal posts in kan stellen) de ‘Posts Widget’ te gebruiken. Die kan je op iedere pagina gebruiken, en daar kan je wel een maximum aantal per pagina instellen.

Probleem opgelost. Of toch niet?

Niet dus. Want wanneer je dit doet, dan ga je wel heel onvoorzichtig met je resources om. Wat gebeurt er namelijk op een archief pagina? Zodra deze pagina geopend wordt, zal WordPress automatisch vragen om de eerste x posts voor die pagina. De ‘Archive Widget’ zal vervolgens deze ‘opgevraagde posts’ op het scherm tonen.

Wanneer je een Elementor Pro ‘Posts’ widget gebruikt, dan zal dezelfde vraag nog een keer worden gesteld. Of met andere woorden, een ‘dure’ query zal tweemaal uitgevoerd worden, en dat komt je performance niet ten goede.

Bovendien, omdat de posts getoond in een post widget geen deel uitmaken van de archive page, zal geen enkele code snippet die je hier kan vinden en bedoeld is voor archive pages ook maar enige invloed hebben op de getoonde gegevens. Ook iets belangrijks om rekening mee te houden.

Wanneer we dit op willen lossen, doen we dit op de meest betrouwbare en snelste manier: Een code snippet.

De usecase

In de code gebruik ik de post types en de aantallen die ik aan het begin van dit artikel heb genoemd. Denk erom om in jouw eigen code de namen en aantallen aan te passen aan jouw eigen situatie.

<?php
add_filter( 'pre_get_posts', 'wxp_portfolio_posts_per_page' );

function wxp_portfolio_posts_per_page($query) {
    if ( $query->is_post_type_archive( 'portfolio' ) && ! is_admin() && $query->is_main_query() ) {
          $query->set( 'posts_per_page', '20' );
    }
    return $query; 
}

In het bovenstaande voorbeeld hebben we dit gedaan voor ƩƩn post type. Het ‘portfolio’ type. Waarom niet voor de blogposts (‘post’ type) ook?

Waarom wel? We kunnen immers voor ƩƩn post type de ingestelde default aanhouden. Wanneer we onder ‘Instellingen->Lezen’ het aantal op ‘6’ zetten zal voor ieder post type wat geen portfolio is de default behouden blijven. Daarnaast geeft de tekst op de instellingen pagina aan, dat je het aantal blogposts instelt. Wanneer je deze code voor een klant gebruikt, wil je in ieder geval verwarring voorkomen, en dus zorg je dat dit aantal nog steeds aangeeft, hoeveel blogposts getoond zullen worden.

Een ander post type wat we op deze manier willen beperken is het ‘product’ post type. We kunnen nu twee dingen doen : Voor ieder post type een aparte functie maken, of in ƩƩn functie alle post typen instellen.

De code hieronder is slechts als voorbeeld bedoeld. Deze code zal niet werken voor het product type. Later in dit artikel leg ik uit waarom.

EƩn functie voor alle instellingen

<?php
add_filter( 'pre_get_posts', 'wxp_posts_per_page' );

function wxp_posts_per_page($query) {
    if ( $query->is_post_type_archive( 'portfolio' ) && ! is_admin() && $query->is_main_query() ) {
          $query->set( 'posts_per_page', '20' );
    }
    if ( $query->is_post_type_archive( 'product' ) && ! is_admin() && $query->is_main_query() ) {
          $query->set( 'posts_per_page', '12' );
    }
    return $query; 
}

Ik heb hier dus de functie hernoemd van ‘wxp_portfolio_posts_per_page’ naar ‘wxp_posts_per_page’. Omdat de functie nu niet meer specifiek voor portfolio items is. Binnen de functie test ik apart for ieder post type.

Het voordeel van deze wijze van aanpak is dat er slechts ƩƩn filter functie aangeroepen hoeft te worden. En dit is verreweg de snelste oplossing. Heb je een groot aantal verschillende post types die je in wilt stellen, kies je mogelijk liever voor een overzichtelijke oplossing. Dan is onderstaande code een mogelijkheid. Deze aanpak heeft niet mijn persoonlijke voorkeur.

<?php
add_filter( 'pre_get_posts', 'wxp_portfolio_posts_per_page' );

function wxp_portfolio_posts_per_page($query) {
    if ( $query->is_post_type_archive( 'portfolio' ) && ! is_admin() && $query->is_main_query() ) {
          $query->set( 'posts_per_page', '20' );
    }
    return $query; 
}

add_filter( 'pre_get_posts', 'wxp_product_posts_per_page' );

function wxp_portfolio_posts_per_page($query) {
    if ( $query->is_post_type_archive( 'product' ) && ! is_admin() && $query->is_main_query() ) {
          $query->set( 'posts_per_page', '24' );
    }
    return $query; 
}

Maar zoals eerder aangegeven, beide code snippets zullen niet werken voor producten. Om ƩƩn heel simpele reden: WooCommerce heeft voor het tonen van producten op de ‘Winkel’ pagina een compleet andere functie ontwikkeld. Het resultaat van de ‘pre_get_post’ filter wordt later overschreven door een compleet ander filter. Om het in WooCommerce goed te laten werken, moet je een ander filter gebruiken.

De juiste oplossing

<?php

add_filter( 'loop_shop_per_page', 'wxp_loop_shop_per_page', 20 );

function wxp_loop_shop_per_page( $prods ) {
  $prods = 24;
  return $prods;
}

De juiste complete code om voor producten en portfolio items het aantal items per pagina in te stellen is dus :

<?php
add_filter( 'pre_get_posts', 'wxp_portfolio_posts_per_page' );

function wxp_portfolio_posts_per_page($query) {
    if ( $query->is_post_type_archive( 'portfolio' ) && ! is_admin() && $query->is_main_query() ) {
          $query->set( 'posts_per_page', '20' );
    }
    return $query; 
}

add_filter( 'loop_shop_per_page', 'wxp_loop_shop_per_page', 20 );

function wxp_loop_shop_per_page( $prods ) {
  $prods = 24;
  return $prods;
}

Codesnippet verbeteren

Het doel van deze code snippet is een probleem op te lossen in een specifieke situatie. Daarom zie je regelmatig voorbeelden waar je specifiek tekst moet aanpassen om te krijgen wat je wilt.Ā 

Wil jij leren hoe je complete plugins zelf kunt programmeren inclusief ‘admin’ schermen voor het instellen en de output in de gewenste taal, dan is misschien de cursus ‘Introductiecursus Plugins Programmeren‘ iets voor jou.Ā 

Wil je als ‘full stack’ WordPress programmeur aan de gang gaan, dan biedt WordXPression ook een compleet traject ‘WordPress Developer‘ aan. Dit is een traject wat deels online, deels klassikaal wordt gegeven.

WordPress Developer worden?

Wil je leren hoe je zelf plugins, thema's, shortcodes, widgets, Gutenberg blocks en meer kan maken?
Schrijf je dan in voor de cursus WordPress Developer.

Meer snippets

In WooCommerce de prijs psychologisch aantrekkelijk tonen
Enkele handige code snippets om je productprijs te formatteren.
Een extra product veld toevoegen aan WooCommerce
Een aantal velden toevoegen aan een product is eigenlijk helemaal niet zo moeilijk. Ik laat je precies...
Prijzen verbergen voor niet ingelogde gebruikers
Hoe verberg je de WooCommerce prijzen voor niet ingelogde gebruikers?
De 'Sale' badge in WooCommerce naast de prijs tonen
Wanneer je gebruik maakt van ƩƩn van de WooCommerce thema’s die op het Storefront framework zijn...
Beperk zoekresultaten tot bepaalde post-typen
Hoe beperk je de post typen die terug komen vanuit een zoekopdracht?
Een 'terug' knop voor je webpagina
Stel, je bezoeker is op een pagina en je wilt dat die bezoeker eenvoudig terug kan gaan naar de voorgaande...

Veiligheid voor alles!

Met betrekking tot de code die je hier aantreft een aantal waarschuwingen, voordat je deze code snippets toepast op je eigen website.

  1. Voer de code nooit direct uit op je eigen website, maar probeer deze eerst op een staging omgeving of een locale kopie van je website.Ā 
  2. Voor je de geteste code installeert op je website, maak eerst een back up van je website.
  3. Zorg altijd voor alle zekerheid, dat je voor je een aanpassing live zet, je ook de FTP gegevens van je website bij de hand hebt.Ā Ā 
Ā 
Voel je je onvoldoende vertrouwd met het toepassen van een dergelijke code snippet, bedenk dat je dit ook door een professional kan laten doen. De WordXPression support strippenkaart is een voordelige manier om dit soort aanpassingen teĀ laten doen.
Heeft dit artikel je geholpen je probleem op te lossen?
Deel het met je vrienden via je favoriete social media.

Heb je vragen bij, of opmerkingen over deze code snippet, stel deze bij de commentaren hieronder.

Geef een reactie

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

Word je website de baas. Neem vandaag nog contact op!

Contact Informatie

Helaas is telefoonspam een serieus probleem geworden. Omdat ik dagelijks tientallen ‘spam’ en ‘scam’ telefoontjes ontving, heb ik mijn telefoonnummer van de site verwijderd.Ā 

Wanneer je echter het formulier hiernaast invult, en aangeeft dat je per telefoon contact op wilt nemen, maak ik graag een belafspraak met je op een moment wat ons beiden past. En krijg je gewoon het telefoonnummer van WordXPression, zodat je ieder moment kan bellen.

WordXPressionĀ 

Aardoliestraat 14-I 7553GT Hengelo

KVK : 75580152Ā 

Stuur een bericht

Mocht je interesse hebben in een nieuwe WordPress of WooCommerce website, verzoek ik je niet onderstaand formulier in te vullen, maar gebruik te maken van het intake/offerte formulier

WordXPression is WP Digital Marketing Geworden

In oktober 2010 begon ik met WordXPression. De naam zei eigenlijk precies wat ik toen deed: dienstverlening rond WordPress. Websites bouwen, aanpassen, onderhouden en later ook steeds meer maatwerk ontwikkelen.

Maar WordXPression is in de loop van de jaren nooit alleen WordPress geweest. Voor klanten voerde ik ook andere werkzaamheden uit. Soms kwamen die rechtstreeks voort uit een WordPress-project, bijvoorbeeld wanneer een website gekoppeld moest worden aan een ander systeem. Soms lag de oorsprong heel ergens anders: in mijn jarenlange ervaring als system integrator uit de periode voordat ik met WordXPression begon.

Daarom besloot ik in 2017 de officiƫle naam van mijn bedrijf te veranderen in WP Digital Marketing. WordXPression bleef daarbij bestaan als handelsnaam en bleef ook de naam waaronder de website en het grootste deel van mijn dienstverlening naar buiten traden.

De afgelopen jaren is die verhouding steeds verder veranderd. Naast WordPress zijn vooral Laravel, maatwerkapplicaties en systeemintegraties een steeds belangrijker deel van mijn werkzaamheden geworden. WordPress blijft belangrijk, maar het is niet langer een goede paraplu voor alles wat ik doe.

Daarom wordt het tijd om de naam die al sinds 2017 boven het bedrijf staat, ook daadwerkelijk centraal te stellen.

Vanaf 1 oktober gaat WordXPression verder als WP Digital Marketing.