Code voorbeeld

Specifieke single.php per categorie

Leestijd: 2 minuten (370 woorden)
profile image

Rick de Jong

Strategie

20 september 2016 08:04

Een verschillende layout per categorie

Handleiding WordPress layout

Voor een van de websites die wij beheren, waren we op zoek naar een functie om specifieke single.php bestanden aan te roepen op basis van een WordPress categorie. 

WordPress logica

Normaliter zou je denken dat dit zou kunnen door de categorie-slug of naam achter single- te zetten, maar dit werkt niet. Voorbeeld: stel je hebt de categorie nieuws. Je zou dan uitkomen op

  • single.php
  • single-nieuws.php (met een aparte indeling voor de categorie nieuws).

Zoals gezegd werkt dit niet, maar sinds WordPress versie 4.7.0 is er een filter beschikbaar om dit te bewerkstelligen. Je kunt hiervoor onderstaande functie gebruiken.

add_filter('single_template_hierarchy', function($templates) {
    $categories = get_the_category();
    
    if (empty($categories)) return $templates;
    
    foreach ($categories as $category) {
        array_unshift($templates, 'single-' . $category->name . '.php');
    }
    
    return $templates;
});

De functie in bovenstaande filter zoekt eerst naar de categorieën van de huidige post door gebruik te maken van de functie get_the_category(), deze functie returned een array met WP_Term objecten. Wanneer deze leeg is dan heeft het bericht geen categorie en kunnen we de normale templates terug geven.

Als de array niet leeg is dan weten we dat het bericht een categorie heeft en voor die berichten zoeken we onze specifieke single.php. Dit doen we door een nieuwe naam toe te voegen aan de array van $templates, deze naam moet gelijk staan aan de naam van het bestand dat we hebben toegevoegd. Dus in ons voorbeeld single-nieuws.php, maar dit willen we uiteraard dynamisch maken, vandaar dat we de categorie naam dynamisch uitlezen. Om de custom template prioriteit te geven boven de standaard templates waar WordPress naar zoekt gebruiken we array_unshift()hiermee wordt het tweede argument als een value vooraan de array geplaatst. Hoe hoger in de array van templates, hoe hoger de prioriteit van het bestand.