devuri / twigit
Twig integration library
Requires
- php: ^7.4 || ^8.0
- pimple/pimple: 3.5.*
- psr/container: ^2.0
- symfony/deprecation-contracts: ^2.5
- twig/twig: 3.11.3
Requires (Dev)
- brain/monkey: ^2.6
- fakerphp/faker: ^1.23
- php-stubs/wordpress-stubs: ^6.0
- phpstan/phpstan: ^1.8
- phpstan/phpstan-strict-rules: ^1.3
- phpunit/phpunit: ^9.5
- symfony/console: ^5.4
- symfony/var-dumper: ^5.4
- szepeviktor/phpstan-wordpress: ^1.1
- vimeo/psalm: ^4.24 || ^5.0
README
A Streamlined Templating Approach
Modern development increasingly leans toward mono repo architectures that centralize application code, dependencies, and templates in a unified repository. This approach simplifies collaboration, version control, and deployment—making it ideal for large-scale and maintainable web projects.
Embrace the Hybrid CMS:
A hybrid-cms approach allows you to keep WordPress’ as your back end while bypassing the default theme system in favor of a templating engine like Twig.
1. Install Twigit via Composer
In your project root (mysite
), install Twigit using Composer:
composer require devuri/twigit
This installs Twigit and Twig in the vendor
directory.
2. Configure Twigit to Use the templates
Directory
Twigit can be configured via an mu-plugin or programmatically to locate templates in mysite/templates
. For example:
// Recommended to define constants upstream for flexibility. if (\defined('USE_TWIGIT') && true === \constant('USE_TWIGIT')) { $twig = Twigit\Twigit::init('path/to/mysite', ['autoescape' => 'html']); // Apply a template filter that overrides traditional theme handling. $twig->templateFilter(); }
If using Raydium, many configuration steps are already handled. Learn more here: Raydium GitHub Repository.
3. Organize Your Templates
Create a templates
directory in your project root:
mysite/
└── templates/
├── base.twig
├── header.twig
└── footer.twig
You can copy and adapt Twigit's base templates from its GitHub repository: Twigit Base Templates
4. Example Twig Template
Here’s a simple example of a base Twig template:
<!DOCTYPE html> <html lang="en"> <head> <title>{{ title }}</title> </head> <body> {% block content %} {% endblock %} </body> </html>