A suite of utilities to help you build great WordPress themes, without distractions.

Get started

Open-source MIT Licensed. GitHub

Inspired by Laravel

Trying to bring the MVC and configuration patterns from the best full stack web framework to the WordPress ecosystem.

Handlebars Included

RAD Theme Engine includes handlebars-php out of the box, and the theme configuration file makes adding custom helpers easy.

All The Options

Manage all your custom post types, ACF option pages, menus, handlebars helpers and more from a single array in your config.php file.

Convenience First

Essential WordPress functions now only a few keystrokes away, with added parameters for more concise and readable code.

Powered by Composer

No child theme necessary. Run a few commands directly from your themes folder and start building your new theme in minutes.

MVC Meets WordPress

RAD Theme Engine uses handlebars-php under the hood to bring Model-View-Controller (MVC) design patterns to WordPress, similar to frameworks like Laravel and Vue.

With RAD Theme Engine

index.php
echo site()->render('my-hero',[
'title' => 'My Cool Site',
'subtitle' => 'Welcome to my website!',
'posts' => site()->getDefaultPosts(['title','url']),
'background_image' => site()->getAssetURL('hero-bg.jpg')
]);
tpl/my-hero.tpl
<div class="hero" style="background: url({{background_image}})">
<h1>{{title}}</h1>
<p class="subtitle">
{{subtitle}}
</p>
<ul class="posts">
{{#each posts}}
<li>
<a href="{{url}}">{{title}}</a>
</li>
{{/each}}
</ul>
</div>

Without RAD Theme Engine

index.php
<?php
$hero_title = 'My Cool Site';
$hero_subtitle = 'Welcome to my website!';
 
$hero_bg_file = 'hero-bg.jpg';
$hero_bg_url;
if (file_exists(get_template_directory()."/assets/$hero_bg_file")) {
$hero_bg_url = get_template_directory_uri()."/assets/$hero_bg_file";
}
?>
 
<div class="hero" style="background: url(<?= $hero_bg_url ?>)">
<h1><?= $hero_title ?></h1>
<p class="subtitle">
<?= $hero_subtitle ?>
</p>
<ul class="posts">
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<li>
<a href="<?= get_the_title() ?>">
<?= get_permalink(get_the_ID()) ?>
</a>
</li>
<?php endwhile; else : ?>
<p><?php esc_html_e( 'Sorry, no posts matched your criteria.' ); ?></p>
<?php endif; ?>
</ul>
</div>

Powerful Customization

Creating custom post types, options pages, and menu locations has never been easier thanks to RAD Theme Engine' centralized configuration system.

config.php
...
 
"custom-post-types" => [
[
"slug" => 'shirts',
"icon" => 'dashicons-cart',
"taxonomies" => ['color'],
"options" => [
"has_archive" => 'shirts',
"show_in_nav_menus" => true,
"supports" => ['title', 'editor', 'thumbnail'],
"has_archive" => true,
"rewrite" => [
'slug' => 'shirts',
'with_front' => true,
'pages' => true,
'feeds' => true,
],
"labels" => [
'name' => _x('Shirts', 'Post Type General Name', 'text_domain'),
'singular_name' => _x('Shirt', 'Post Type Singular Name', 'text_domain'),
]
]
],
],
 
...
Creating a custom post type

Flexible APIs

RAD Theme Engine's convenient querying functions makes fetching posts easy, no matter what kind of data you're trying to grab. Get Advanced Custom Fields, taxonomies, meta fields, thumbnails, urls, and more from a single function.

$posts = site()->getPosts([
"type" => "vehicles",
"taxonomy.country" => "france,italy"
], [
"title",
"acf.miles",
"taxonomy.country.name"
]);
Get posts of type 'vehicles' that have the term 'france' or 'italy' as their country taxonomy, only returning the post title, number of miles, and country name(s).
[
[
"title" => "2010 Ferrari 458 Italia",
"miles" => 13802,
"country" => [
[
"name" => "Italy"
]
]
],
[
"title" => "2019 Renault Alpine A110 Légende GT",
"miles" => 3211,
"country" => [
[
"name" => "France"
]
]
],
...
]