PHPackages                             grottopress/jentil - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. grottopress/jentil

ActiveWordpress-theme[Framework](/categories/framework)

grottopress/jentil
==================

Jentil is a modern framework for rapid WordPress theme development

v1.0.4(2y ago)670442MITPHPPHP &gt;=7.0CI failing

Since Oct 5Pushed yesterday2 watchersCompare

[ Source](https://github.com/GrottoPress/jentil)[ Packagist](https://packagist.org/packages/grottopress/jentil)[ Docs](https://www.grottopress.com/jentil/)[ RSS](/packages/grottopress-jentil/feed)WikiDiscussions master Synced today

READMEChangelogDependencies (10)Versions (37)Used By (2)

Jentil
======

[](#jentil)

[![Jentil Theme logo](screenshot.png)](screenshot.png)

Jentil is a modern framework for rapid WordPress theme development. It emphasizes a cleaner, more modular way of building WordPress themes, without straying too far from the core WordPress API.

Jentil is designed with the [SUV](https://github.com/grottopress/wordpress-suv/) architecture, and makes full use of the express power of core WordPress' event driven architecture.

Jentil features a more organised directory structure. Templates are loaded from the `templates/` directory, and partials from the `partials/` directory.

It is packed with predefined, pluggable features, including powerful content options which allows users to configure how posts display on archives right from the customizer.

Jentil may be installed either as a parent theme, or as a package in another theme.

Features
--------

[](#features)

- Robust [architecture](https://github.com/grottopress/wordpress-suv/), with a more organised directory structure. The days of dumping templates in your theme's root are over!
- Numerous action and filter hooks to allow easy extension via child themes and plugins.
- Clean, object-oriented codebase.
- Modern web development tools.
- Compliant with [PSR-1](http://www.php-fig.org/psr/psr-1/), [PSR-2](http://www.php-fig.org/psr/psr-2/) and [PSR-4](http://www.php-fig.org/psr/psr-4/).
- Powerful posts display options via the customizer.
- Page builder [post type templates](https://make.wordpress.org/core/2016/11/03/post-type-templates-in-4-7/)
- Six (6) layout options
    - Content
    - Content / Sidebar
    - Sidbar / Content
    - Sidebar / Content / Sidebar
    - Content / Sidebar / Sidebar
    - Sidebar / Sidebar / Content
- HTML5 / CSS3
- SEO-ready
- Responsive (mobile-ready)

Requirements
------------

[](#requirements)

- [PHP](https://secure.php.net) &gt;= 7.0
- [WordPress](https://wordpress.org) &gt;= 5.3
- [Composer](https://getcomposer.org)
- [Node JS](https://nodejs.org)

These are the core requirements you need to get in place. The rest would be installed by the theme itself during installation.

Installation
------------

[](#installation)

Install *jentil-theme*, which is a starter for building your own theme with Jentil:

1. From the `wp-content/themes/` directory, run `composer create-project --remove-vcs grottopress/jentil-theme your-theme-slug-here`.
2. Switch to `your-theme-slug-here/` directory: `cd your-theme-slug-here/`.
3. Update theme information in `style.css`. You may also want to change package name, description and author in `composer.json` and `package.json`.
4. Copy `bs-config-sample.js` to `bs-config.js`: `cp bs-config-sample.js bs-config.js`. Edit to taste.
5. Replace all occurrences of `'jentil-theme'` text domain with your own theme slug. Your theme slug should match your theme folder name, which should just be the *slugified* version of your theme's name.
6. Do a `git init` to initialize a new git repository for your theme.
7. Run `vendor/bin/wp theme activate your-theme-slug-here` to activate your new theme.
8. Dive into your theme's source, and start developing.

### Install Jentil as parent theme

[](#install-jentil-as-parent-theme)

By default, your new theme is installed with Jentil as package (in the `vendor/` directory). This is recommended.

However, Jentil is a full-fledged WordPress theme by itself, and can, therefore, be installed as such.

If, for any reason, you would like to use Jentil as parent theme instead, follow the steps below:

1. Add `Template: jentil` to your theme's `style.css` headers.
2. Run `composer remove grottopress/jentil` to remove Jentil from your theme's dependencies.
3. Swicth to `wp-content/themes/` directory: `cd ../`
4. Install Jentil as (parent) theme: `composer create-project grottopress/jentil jentil`
5. Switch to your own theme's directory: `cd your-theme-slug-here/`
6. Activate your own theme (not Jentil), if not already active.

### Install via Docker

[](#install-via-docker)

Your new theme has docker files in the `docker/` directory. The following `Dockerfile`s are available:

- `apache.Dockerfile`: Builds an image of WordPress + PHP + apache, with your theme installed.
- `apache.child.Dockerfile`: Builds an image of WordPress + PHP + apache, with your theme installed **as child theme** of Jentil.
- `fpm-alpine.Dockerfile`: Builds an image of WordPress + PHP-FPM, with your theme installed.
- `fpm-alpine.child.Dockerfile`: Builds an image of WordPress + PHP-FPM, with your theme installed **as child theme** of Jentil.

You may build an image using any of the `Dockerfile`s:

```
docker build \
    --build-arg PHP_VERSION=7.4 \
    --build-arg THEME_NAME=your-theme-slug-here \
    --build-arg WORDPRESS_VERSION=6.1 \
    -f docker/fpm-alpine.Dockerfile \
    -t your-image-tag-here .
```

You may run your built image thus:

```
docker run -d --name your-container-name-here \
    -v ${PWD}/wordpress:/var/www/html \
    your-image-tag-here
```

Developing your theme
---------------------

[](#developing-your-theme)

Whether Jentil is installed as theme or package, it acts as a parent theme, in the WordPress sense. This means your theme inherits all features of Jentil.

You can remove or override Jentil's features, just as you would any WordPress parent theme; via `remove_action` or `remove_filter` calls in your own theme.

You may override templates and partials by placing a similarly-named template or partial in the `templates/` or `partials/` directory of your theme, respectively.

Your own theme's singleton instance is available via a call to `\Theme()` (unless you changed it in `app/helpers.php`), while Jentil's is available via `\Jentil()`. You may use these in files outside `app` directory (eg: in templates and partials) to access the respective instances.

The Jentil singleton instance is exposed as the `$parent` attribute in the main `Theme` class (`app/Theme.php`).

### Directory Structure

[](#directory-structure)

The directory structure for your theme, after installation, should be similar to this:

```
.
├── app/
│   ├── Theme/
│   │   ├── Setups/
│   │   ├── Utilities/
│   │   └── Utilities.php
│   ├── helpers.php
│   └── Theme.php
├── assets/
│   ├── css/
│   └── js/
├── dist/
│   ├── css/
│   └── js/
├── lang/
├── node_modules/
├── partials/
├── templates/
├── tests/
├── vendor/
├── .editorconfig
├── .gitignore
├── CHANGELOG.md
├── codeception.yml
├── composer.json
├── composer.lock
├── functions.php
├── index.php
├── LICENSE
├── package.json
├── package-lock.json
├── postcss.config.js
├── README.md
├── screenshot.png*
├── style.css
├── tailwind.config.js
├── tsconfig.json
└── webpack.mix.js

```

### Adding templates and partials

[](#adding-templates-and-partials)

Templates and partials should be filed in `templates/` and `partials/` respectively. The rules and naming conventions are as defined by WordPress. Therefore, a `templates/singular.php` in your theme overrides the same in Jentil.

If you decide to add your own templates, do not use WordPress' `\get_header()`, `\get_footer()` and `\get_sidebar()` functions in them. These functions expect your partials to be in your theme's root, and WordPress provides no way of overriding those.

Jentil uses it's own loader to load partials from the `partials/` directory. You should call eg: `\Jentil()->utilities->loader->loadPartial('header', 'some-slug')`, instead of `\get_header('some-slug')`.

### Template hooks

[](#template-hooks)

You should rarely need to add your own templates, as Jentil comes with template hooks you can use to add or remove stuff from the bundled templates.

The following action hooks are available:

- `jentil_before_header`
- `jentil_inside_header`
- `jentil_after_header`
- `jentil_after_after_header`
- `jentil_before_before_title`
- `jentil_before_title`
- `jentil_after_title`
- `jentil_before_content`
- `jentil_after_content`
- `jentil_after_after_content`
- `jentil_before_before_footer`
- `jentil_before_footer`
- `jentil_inside_footer`
- `jentil_after_footer`

### Post type templates

[](#post-type-templates)

WordPress introduced [post type templates](https://make.wordpress.org/core/2016/11/03/post-type-templates-in-4-7/) in version 4.7, as an extension of page templates to all post types. WordPress looks for post type templates in the root of your theme.

Jentil's loader does not load any template (or partial) from your theme's root at all. So if you placed post type templates here, though they may be recognised by WordPress and listed in the Page Template dropdown in the post edit screen, they would not be loaded by Jentil.

To use post type templates in your own theme, add the templates in the `templates/` directory, and use the [`theme_{$post_type}_templates`](https://developer.wordpress.org/reference/hooks/theme_post_type_templates/) filter.

Jentil uses this hook to add page builder templates, and provides an `AbstractPostTypeTemplate` setup class your theme's post type templates can inherit from.

### Styling

[](#styling)

Jentil's styles are designed to be used, so we do **not** encourage that you dequeue it, unless you intend to recompile and enqueue in your own theme.

Care has been taken to make them as basic as possible, so they do not get in your way. You can simply enqueue your own theme's style sheet(s) after Jentil's.

### Testing

[](#testing)

Jentil employs, and encourages, proper, isolated unit tests. *jentil-theme* comes with [WP Browser](https://github.com/lucatume/wp-browser) and [Function Mocker](https://github.com/lucatume/function-mocker) for testing. You may swap these out for whatever testing framework you are comfortable with.

WP Browser uses [Codeception](https://codeception.com), which, in turn uses [PHPUnit](https://phpunit.de), so it should take care of most testing needs. In addition to unit tests, you may add integration, functional and acceptance tests, using the same setup.

Run all tests with `composer run test`, as defined in `composer.json`, under `scripts` configuration.

Architecture
------------

[](#architecture)

Jentil is desinged using the [SUV](https://github.com/grottopress/wordpress-suv/) architecture. You might want to [check that out](https://github.com/grottopress/wordpress-suv/), as it may give a better understanding of the core philosophy underpinning Jentil's development.

Showcase
--------

[](#showcase)

The following projects are powered by Jentil:

- [GrottoPress](https://www.grottopress.com)
- [Ghana Gong](https://www.ghanagong.com)
- [iQ College](https://www.iqcollegeghana.com)
- [Betta WordPress theme](https://www.grottopress.com/products/betta-wordpress-theme/)

Development
-----------

[](#development)

Run tests with `composer run test`.

Contributing
------------

[](#contributing)

1. [Fork it](https://github.com/GrottoPress/jentil/fork)
2. Switch to the `master` branch: `git checkout master`
3. Create your feature branch: `git checkout -b my-new-feature`
4. Make your changes, updating changelog and documentation as appropriate.
5. Commit your changes: `git commit`
6. Push to the branch: `git push origin my-new-feature`
7. Submit a new *Pull Request* against the `GrottoPress:master` branch.

###  Health Score

46

—

FairBetter than 93% of packages

Maintenance65

Regular maintenance activity

Popularity21

Limited adoption so far

Community17

Small or concentrated contributor base

Maturity70

Established project with proven stability

 Bus Factor1

Top contributor holds 97.1% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~77 days

Recently: every ~83 days

Total

32

Last Release

731d ago

Major Versions

v0.14.1 → v1.0.02023-06-12

### Community

Maintainers

![](https://www.gravatar.com/avatar/73b1393a3c45523682f9bf693c23e6e05960a1b1492266b4b0d70041bb35eee2?d=identicon)[akadusei](/maintainers/akadusei)

---

Top Contributors

[![akadusei](https://avatars.githubusercontent.com/u/10501389?v=4)](https://github.com/akadusei "akadusei (1536 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (44 commits)")[![XedinUnknown](https://avatars.githubusercontent.com/u/1428973?v=4)](https://github.com/XedinUnknown "XedinUnknown (2 commits)")

---

Tags

jentiltailwindcsstypescriptwordpresswordpress-themewordpressjentil

### Embed Badge

![Health badge](/badges/grottopress-jentil/health.svg)

```
[![Health](https://phpackages.com/badges/grottopress-jentil/health.svg)](https://phpackages.com/packages/grottopress-jentil)
```

###  Alternatives

[pods-framework/pods

Pods is a development framework for creating, extending, managing, and deploying customized content types in WordPress.

1.1k1.7k](/packages/pods-framework-pods)[themosis/theme

The Themosis framework boilerplate theme.

10449.0k3](/packages/themosis-theme)[ronilaukkarinen/dudestack

A modern WordPress stack

1131.2k](/packages/ronilaukkarinen-dudestack)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
