WordPress Utilities
kaiseki/wp-template-renderer
Render WordPress template parts by slug or from a class, with a configurable class-to-slug generator.
Two renderers, both wired through ConfigProvider:
TemplateRenderer— renders a template part by slug from a configurable base directory under the active theme (defaulttemplate-parts), capturing its output as a string.ClassTemplateRenderer— renders a template part that lives next to a given object’s class file, deriving the slug from the class short name (kebab-cased by default) via aClassSlugGeneratorInterface.
Installation
composer require kaiseki/wp-template-renderer
Requires PHP 8.2 or newer.
Usage
Register ConfigProvider with your laminas-style config aggregator. It declares the renderer factories
and aliases ClassSlugGeneratorInterface to the kebab-case ClassTemplateSlugGenerator, and exposes a
template_renderer config key for the defaults:
use Kaiseki\WordPress\TemplateRenderer\ConfigProvider;
return (new ConfigProvider())();
// [
// 'template_renderer' => [
// 'template_renderer' => ['template_directory' => 'template-parts'],
// 'class_template_renderer' => ['template_name' => 'template'],
// ],
// 'dependencies' => [ /* aliases + factories */ ],
// 'hook' => ['provider' => []],
// ]
Rendering a template part by slug
use Kaiseki\WordPress\TemplateRenderer\TemplateRenderer;
/** @var TemplateRenderer $renderer */
$renderer = $container->get(TemplateRenderer::class);
// Renders <stylesheet>/template-parts/card.php and returns its output.
$html = $renderer->render('card', ['title' => 'Hello']);
// With a name variant: <stylesheet>/template-parts/card-featured.php
$html = $renderer->render('card', ['title' => 'Hello'], 'featured');
The base directory is configurable via template_renderer.template_renderer.template_directory.
Rendering a template part from a class
use Kaiseki\WordPress\TemplateRenderer\ClassTemplateRenderer;
/** @var ClassTemplateRenderer $renderer */
$renderer = $container->get(ClassTemplateRenderer::class);
// For an instance of App\Blocks\HeroBlock, looks for hero-block-template.php
// next to HeroBlock's class file and returns its output.
$html = $renderer->render($block, ['heading' => 'Welcome']);
// Override the derived slug and/or the template name suffix:
$html = $renderer->render($block, ['heading' => 'Welcome'], slug: 'hero', templateName: '');
The slug is produced by the ClassSlugGeneratorInterface binding (kebab-cased class short name by
default); the template-name suffix defaults to
template_renderer.class_template_renderer.template_name.
Both renderers throw a RuntimeException when the resolved template file does not exist.
Development
composer install
composer check # check-deps, cs-check, phpstan
License
MIT — see LICENSE.