Pagination

Do you like pagination? Stupid question, of course you do. Well, here’s how you do it.

Default pagination

This will only work in a php file with an active query (like archive.php or home.php):

	<?php
	$context = Timber::get_context();
	$context['posts'] = new Timber\PostQuery();
	Timber::render('archive.twig', $context);

You can then markup the output like so (of course, the exact markup is up to YOU):

<div class="tool-pagination">
	{% if posts.pagination.prev %}
		<a href="{{posts.pagination.prev.link}}" class="prev {{posts.pagination.prev.link|length ? '' : 'invisible'}}">Prev</a>
	{% endif %}
	<ul class="pages">
		{% for page in posts.pagination.pages %}
			<li>
				{% if page.link %}
					<a href="{{page.link}}" class="{{page.class}}">{{page.title}}</a>
				{% else %}
					<span class="{{page.class}}">{{page.title}}</span>
				{% endif %}
			</li>
		{% endfor %}
	</ul>
	{% if posts.pagination.next %}
		<a href="{{posts.pagination.next.link}}" class="next {{posts.pagination.next.link|length ? '' : 'invisible'}}">Next</a>
	{% endif %}
</div>

What if I’m not using the default query?

	<?php
	global $paged;
	if (!isset($paged) || !$paged){
		$paged = 1;
	}
	$context = Timber::get_context();
	$args = array(
		'post_type' => 'event',
		'posts_per_page' => 5,
		'paged' => $paged
	);
	$context['posts'] = new Timber\PostQuery($args);
	Timber::render('page-events.twig', $context);

Pagination with pre_get_posts

Custom query_posts sometimes shows 404 on example.com/page/2. In that case you can also use pre_get_posts in your functions.php file:

	<?php
	function my_home_query( $query ) {
	  if ( $query->is_main_query() && !is_admin() ) {
		$query->set( 'post_type', array( 'movie', 'post' ));
	  }
	}
	add_action( 'pre_get_posts', 'my_home_query' );

In your archive.php or home.php template:

	<?php
	$context = Timber::get_context();
	$context['posts'] = new Timber\PostQuery();
	Timber::render('archive.twig', $context);