Extension System
Jankx Theme's Extension System allows you to modularize functionality and load features dynamically.
Overview
┌─────────────────────────────────────────┐
│ ExtensionManager │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Plugin │ │ Theme │ │ Custom │ │
│ │ Ext A │ │ Ext B │ │ Ext C │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ └────────────┴────────────┘ │
│ Manifest │
└─────────────────────────────────────────┘
ExtensionManager
The central hub for managing all extensions:
use Jankx\Extensions\ExtensionManager;
// Get singleton instance
$manager = ExtensionManager::getInstance();
// Check if extension is active
if ($manager->is_extension_active('my-extension')) {
// Extension is active
}
// Get all extensions
$extensions = $manager->get_extensions();
Extension Manager API
// Activation
$manager->activate_extension('my-extension');
$manager->deactivate_extension('my-extension');
// Installation
$manager->install_extension('my-extension');
$manager->uninstall_extension('my-extension');
// Requirements
$manager->require_extension('required-ext', true); // Required
$manager->require_extension('optional-ext', false); // Recommended
// Queries
$manager->is_extension_active('my-extension');
$manager->is_extension_required('my-extension');
$manager->is_extension_installed('my-extension');
Creating Extensions
Step 1: Create Extension Class
<?php
namespace Jankx\Extensions\MyExtension;
use Jankx\Extensions\AbstractExtension;
class MyExtension extends AbstractExtension
{
protected $id = 'my-extension';
protected $name = 'My Extension';
protected $version = '1.0.0';
protected $author = 'Your Name';
protected $description = 'Extension description';
public function activate(): void
{
parent::activate();
// Activation logic
$this->register_post_types();
$this->register_taxonomies();
}
public function deactivate(): void
{
// Cleanup logic
parent::deactivate();
}
public function boot(): void
{
// Run after all extensions loaded
add_action('init', [$this, 'init']);
}
}
Step 2: Create Manifest
{
"name": "My Extension",
"id": "my-extension",
"version": "1.0.0",
"author": "Your Name",
"description": "Extension description",
"main": "MyExtension.php",
"class": "Jankx\\Extensions\\MyExtension\\MyExtension",
"requires": {
"php": ">=7.4",
"wordpress": ">=5.8",
"jankx": ">=2.0"
},
"dependencies": [
"other-extension"
]
}
Step 3: Register Extension
use Jankx\Extensions\ExtensionManager;
use Jankx\Extensions\MyExtension\MyExtension;
add_action('jankx/extensions/init', function(ExtensionManager $manager) {
$manager->add_extension('my-extension', new MyExtension());
});
Extension Manifest
| Field | Type | Description |
|---|---|---|
name | string | Extension display name |
id | string | Unique identifier |
version | string | Semantic version |
author | string | Author name |
description | string | Extension description |
main | string | Entry point file |
class | string | Fully-qualified class name |
requires | object | Requirements (php, wordpress, jankx) |
dependencies | array | Other required extensions |
Lifecycle Hooks
class MyExtension extends AbstractExtension
{
// Called on installation
public function install(): bool
{
// Create tables, options, etc.
return true;
}
// Called on activation
public function activate(): void
{
// Register hooks, flush rewrite rules
}
// Called after all extensions loaded
public function boot(): void
{
// Initialize services
}
// Called on WordPress init
public function init(): void
{
// Register shortcodes, widgets
}
// Called on deactivation
public function deactivate(): void
{
// Cleanup, flush cache
}
// Called on uninstall
public function uninstall(): bool
{
// Remove tables, options
return true;
}
}
Pro Features
License Management PRO
use Jankx\Facades\License;
// Check license
if (License::is_valid()) {
// License is valid
}
// Activate license
License::activate('your-license-key');
// Get license info
$info = License::get_info();
Auto-Updates PRO
// Enable auto-update for specific extension
add_filter('jankx/extension/auto_update', function($enabled, $extension) {
if ($extension === 'my-premium-ext') {
return true;
}
return $enabled;
}, 10, 2);
Best Practices
- Namespace Properly - Use
Jankx\Extensions\MyExtension - Use Dependency Injection - Leverage the Application container
- Handle Dependencies - Check for required extensions
- Version Management - Run migrations on version changes
- Error Handling - Use try-catch and Log facade