Code voorbeeld

Post teller (1 van 8) in je sidebar, single of andere template bestanden

Leestijd: 3 minuten (544 woorden)
profile image

Rick de Jong

Strategie

22 augustus 2012 07:05

Laatste update: 11 januari 2023 10:04

Een handige berichtenloper binnen een categorie voor WordPress

Blader eenvoudig door berichten

Stel je wil een berichten-loper maken om binnen een categorie via vorige / volgende (twee pijltjes) door de berichten te kunnen bladeren. Daarnaast wil je aangeven op welke post je van de totaal zit, juist daar zit de uitdaging in.

Er moet komen te staan "1 van 8" wanneer je in het eerste bericht van de totaal acht berichten binnen de categorie zit. Uiteraard is het geheel dynamisch, dus bij nieuwe berichten moet dit 1 van 9, 10, 11 etc worden.

De Functie

Plak de volgende code in je functions.php

function tsd_post_number($id = null)
{
	global $post;

	// Als het psot ID niet wordt meegegeven in de functie 
	// dan kijken we naar de huidige post
	if (is_null($id)) {
		$id = $post->ID;
	}

	// Neem de categorie van de post
	$cat = get_the_category($id);

	// Geen categorie? Stuur dan "1 van 1" terug.
	if (count($cat) === 0) {
		return array(1, 1, false, false);
	}

	// Zoek naar alle berichten in de categorie
	$posts = get_posts(array(
		'cat' 			=> $cat[0]->cat_ID,
		'numberposts' 	=> -1,
		'orderby' 		=> 'ID',
		'order' 		=> 'ASC',
	));

	// Standaard index is altijd 1
	$index = 1;

	// Sla het totaal op in een variabele
	$total = count($posts);

	// Standaard is er geen vorig bericht
	$prev = false;

	// Start een loop over alle berichten
	foreach ($posts as &$p) {
		// Stop direct wanneer 
		// het ID gelijk of hoger is dan het huidige ID
		// Zo bepalen we dat de index niet verder opgeteld wordt
		// En dat het vorige bericht keurig wordt toegekend aan $prev
		if ($p->ID >= $id) {
			break;
		}

		// Zolang we het huidige bericht nog niet hebben bereikt
		// Blijven we de index optellen
		// We starten met tellen bij 1 ipv standaard 0
		// Ondanks dat we het huidige bericht nog niet hebben bereikt
		// in de loop zal de index wel kloppen
		// het volgende bericht is immers het huidige bericht
		++$index;

		// Het vorige bericht wordt in iedere iteratie gelijk gezet
		// aan het ID dat we nu tegen komen in de iteratie
		// Dit is altijd gelijk aan het vorige bericht
		// want als we het huidige bericht tegenkomen
		// wordt de loop gestopt door de "break;"
		$prev = $p->ID;
	}

	// Door bovenstaande loop te stoppen bij het huidige bericht
	// Staat de inner pointer op het huidige bericht
	// Met next() zetten we de inner pointer 1 verder
	// Dat is dus het volgende bericht
	// Of "flase" dan zitten we nu op het laatste bericht
	$next = next($posts);
	if ($next !== false) {
		$next = $next->ID;
	}

	// Stuur de resultaten terug als array, dat is makkelijk in gebruik
	return array($index, $total, $prev, $next);
}

Om de functie in je thema bestand aan te roepen heb je de volgende code nodig (dit kan bijvoorbeeld net boven waar je de tel functie wilt tonen):

list($index, $total, $prev, $prevnext) = tsd_post_number();

Vervolgens plak je de volgende code in je post (single.php) - Let op: je hebt dus beide codes nodig, zowel bovenstaande als deze hieronder.

echo $index . ' van ' . $total;