Gamajo Template Loader
A class to copy into your WordPress plugin, to allow loading template parts with fallback through the child theme > parent theme > plugin.
Description
Easy Digital Downloads, WooCommerce, and Events Calendar plugins, amongst others, allow you to add files to your theme to override the default templates that come with the plugin. As a developer, adding this convenience in to your own plugin can be a little tricky.
The get_template_part()
function in WordPress was never really designed with plugins in mind, since it relies on locate_template()
which only checks child and parent themes. So we can add in a final fallback that uses the templates in the plugin, we have to use a custom locate_template()
function, and a custom get_template_part()
function. The solution here just wraps them up as a class for convenience.
Installation
This isn't a WordPress plugin on its own, so the usual instructions don't apply. Instead:
- Copy
class-gamajo-template-loader.php
into your plugin. It can be into a file in the plugin root, or better, anincludes
directory. - Create a new file, such as
class-your-plugin-template-loader.php
, in the same directory. - Create a class in that file that extends
Gamajo_Tech_Loader
. You can copy the meal planner example class as a starting point if it helps. - Override the class properties to suit your plugin. You could also override the
get_templates_dir()
method if it isn't right for you. - You can now instantiate your custom template loader class, and use it to call the
get_template_part()
method. This could be within a shortcode callback, or something you want theme developers to include in their files. - Optionally, you can wrap the reference to the object in a functions e.g.
// Template loader instantiated elsewhere, such as the main plugin file
$meal_planner_template_loader = new Meal_Planner_Template_Loader;
// ...
// This function can live wherever is suitable in your plugin
function meal_planner_get_template_part( $slug, $name = null, $load = true ) {
global $meal_planner_template_loader;
$meal_planner_template_loader->get_template_part( $slug, $name, $load );
}
- An example using the helper function (or class method) would be:
add_filter( 'the_content', 'meal_planner_single_recipe_content' );
function meal_planner_single_recipe_content( $content ) {
if ( ! function_exists( 'meal_planner_get_template_part' ) ) {
return $content;
}
meal_planner_get_template_part( 'recipe', 'ingredients' );
meal_planner_get_template_part( 'recipe', 'instructions' );
}
This will try to load up wp-content/themes/my-theme/meal-planner/recipe-ingredients.php
, or wp-content/themes/my-theme/meal-planner/recipe.php
, then fallback to wp-content/themes/plugins/meal-planner/templates/recipe-ingredients.php
or wp-content/themes/plugins/meal-planner/templates/recipe.php
.
Contributions
Contributions are welcome - fork, fix and send pull requests against the develop
branch please.
Credits
Built by Gary Jones
Copyright 2013 Gamajo Tech