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
namestringExtension display name
idstringUnique identifier
versionstringSemantic version
authorstringAuthor name
descriptionstringExtension description
mainstringEntry point file
classstringFully-qualified class name
requiresobjectRequirements (php, wordpress, jankx)
dependenciesarrayOther 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

  1. Namespace Properly - Use Jankx\Extensions\MyExtension
  2. Use Dependency Injection - Leverage the Application container
  3. Handle Dependencies - Check for required extensions
  4. Version Management - Run migrations on version changes
  5. Error Handling - Use try-catch and Log facade

← Back to Documentation