Skip to content

Pollora or Timber for WordPress themes: Blade or Twig, a Laravel application or a templating layer, routing, post types, and when Timber is the better choice.

Short answer: pick Timber if you want cleaner theme templates in a WordPress site that otherwise stays as it is: Twig instead of PHP files, installed with one Composer command. Pick Pollora if you want the whole application around the theme to be Laravel: routing, controllers, Blade, Eloquent, Artisan, and hooks and post types declared as PHP attributes.

Timber is not a Laravel project, and the two solve problems of a different size. People still compare them, because both answer the same question: how do I stop writing WordPress templates as PHP files full of the_title() and the_loop()? This page is for that question.

Timber is, in the words of its package description, a way to “create WordPress themes with beautiful OOP code and the Twig Template Engine”. Your PHP file prepares data, a Twig file prints it. It has existed since 2013, is MIT-licensed, and is maintained by a group of contributors around Upstatement. Its current release is v2.5.1 (May 2026), which requires PHP 8.2 or higher.

Pollora is a Laravel application that runs WordPress inside it. Blade is how it renders themes, and it comes with the rest of Laravel: routing, middleware, Eloquent, queues and Artisan. See Why Pollora.

With Timber, a template file in the theme gathers the data and hands it to Twig (source):

single.php
$context = Timber::context();
Timber::render('single.twig', $context);
{# views/single.twig #}
<article>
<h1>{{ post.title }}</h1>
{{ post.content }}
</article>

With Pollora, WordPress’s template hierarchy is mapped to Blade views, and the loop becomes a directive (see Blade templates in WordPress):

{{-- resources/views/single.blade.php --}}
@extends('layouts.app')
@section('content')
@posts
<article>
<h1>@title</h1>
@content
</article>
@endposts
@endsection

For this task the two are close: both support layouts and includes, and both compile templates to cached PHP. One difference worth knowing: Blade’s {{ }} escapes its output, while Timber’s Twig does not escape {{ post.field }} by default, and auto-escaping is a setting you turn on. Beyond that, the difference is not the template syntax, it is everything around the template.

PolloraTimber
What it isA framework: a Laravel application that runs WordPressA Composer library that adds Twig to a WordPress theme
Installpollora new example-app: a new projectcomposer require timber/timber, then Timber\Timber::init() in functions.php; or composer create-project upstatement/timber-starter-theme
Existing WordPress siteNo migration guide yet: the site moves into a new Pollora projectAdded to a theme or a project as it is
Who handles the requestLaravel first, WordPress inside itWordPress; your template files call Timber
Template engineBlade, with Sage Directives (@posts, @title, @content)Twig, from Symfony
RoutingLaravel routes, Route::wp() on conditional tags, template hierarchy as fallbackWordPress’s template hierarchy. Timber 2 ships no routing library; its docs point to Upstatement/routes, Rareloop/router and Brain-WP/Cortex
Data in templatesControllers and view composers; Eloquent models for posts, terms and usersTimber::context() and Timber\Post, Timber\Term, Timber\User objects; class maps connect your own classes to post types
Post types, hooks, REST routesAttributes: #[PostType], #[Taxonomy], #[Action], #[Filter], #[WpRestRoute]Not Timber’s job: its docs cover reading and rendering them, not registering them
Custom fieldsPlugins such as ACF run as in WordPress; typed meta declared as attributesA documented ACF integration: post.meta('field') in Twig
Gutenberg blockspollora:make:block, written in JSX and rendered with Bladepost.content renders blocks out of the box; a documented recipe renders ACF blocks (ACF PRO 6 or later) with Twig templates
CachingLaravel’sBuilt in: cache a whole Timber::render() call, with several cache modes; wp timber clear-cache clears it
Queues, migrations, ORMLaravel’s ownOut of scope: Timber is a templating layer
Command linephp artisan, and WP-CLI commands declared with #[WpCli]wp timber clear-cache
LicenseMITMIT
  • you want better templates and nothing else: no new architecture, no change to how the rest of the site works;
  • you have an existing theme or site and want to adopt Twig page by page;
  • your team already knows Twig (or Symfony, Craft or Drupal, which use it);
  • you want one dependency that a standard WordPress host can run, without a Laravel application to deploy;
  • you want a project with more than ten years behind it and its own documentation, class maps and ACF integration.
  • you want Laravel to be the application: routes, controllers, middleware, queues, Eloquent and Artisan, with WordPress as the CMS;
  • you prefer Blade and want Vite and Tailwind CSS in the theme build;
  • you want hooks, post types, taxonomies, REST routes and schedules declared as attributes and registered automatically;
  • you want WordPress media on S3, R2 or another Laravel disk (Media), or Nectar for coding agents;
  • you are starting a new project, so nothing has to be migrated.

There is no dedicated migration guide yet, and no converter from Twig to Blade, so templates are rewritten by hand. What carries over:

  • The idea of separating data from markup: what a Timber template file does in PHP moves to a Laravel controller or a view composer;
  • Layouts, includes and blocks, which have Blade equivalents (@extends, @include, @section);
  • Your content and plugins, which stay in the standard WordPress tables: ACF fields keep working as WordPress plugins do in Pollora.

What changes: Twig syntax becomes Blade syntax, Timber::render() calls become views returned by the template hierarchy or a route, and the project becomes a Laravel application with WordPress inside it.

Timber: the timber/timber repository (its composer.json and docs/ folder, release v2.5.1) and the Timber documentation. Pollora: this documentation and the Pollora repositories. All read on 6 November 2026. If something here is out of date or wrong, open an issue and we will correct it.