Examples

Real-world usage patterns for WPZylos Requirements.

WooCommerce Extension

A plugin that requires WooCommerce with specific version:

<?php
// config/requirements.php

return [
    'min_php_version' => '8.0',
    'min_wp_version'  => '6.0',
    'php_extensions'  => [
        'json',
        'curl',
    ],
    'required_plugins' => [
        'WooCommerce' => [
            'plugin_slug'        => 'woocommerce/woocommerce.php',
            'min_plugin_version' => '8.0.0',
        ],
    ],
];

ACF-Based Plugin

A plugin that requires Advanced Custom Fields:

<?php
// config/requirements.php

return [
    'min_php_version'  => '8.1',
    'min_wp_version'   => '6.4',
    'required_plugins' => [
        'Advanced Custom Fields' => [
            'plugin_slug' => 'advanced-custom-fields/acf.php',
        ],
        // Or ACF Pro
        'Advanced Custom Fields PRO' => [
            'plugin_slug'        => 'advanced-custom-fields-pro/acf.php',
            'min_plugin_version' => '6.0.0',
        ],
    ],
];

API Integration Plugin

A plugin that makes HTTP requests and needs JSON/cURL:

<?php
// config/requirements.php

return [
    'min_php_version' => '8.1',
    'min_wp_version'  => '6.0',
    'php_extensions'  => [
        'json',
        'curl',
        'openssl',
        'mbstring',
    ],
];

Single-Site Only Plugin

A plugin that should NOT run on WordPress Multisite:

<?php
// config/requirements.php

return [
    'min_php_version'         => '8.0',
    'min_wp_version'          => '6.0',
    'is_multisite_compatible' => false,
];

Custom Requirement Example

A plugin that needs a minimum MySQL version:

<?php
// src/Requirements/MysqlVersionRequirement.php

namespace MyPlugin\Requirements;

use WPZylos\Framework\Requirements\Contracts\RequirementInterface;

class MysqlVersionRequirement implements RequirementInterface
{
    private string $minVersion;

    public function __construct(string $minVersion = '5.7')
    {
        $this->minVersion = $minVersion;
    }

    public function isSatisfied(): bool
    {
        global $wpdb;
        $version = $wpdb->db_version();
        return version_compare($version, $this->minVersion, '>=');
    }

    public function getErrorMessage(): string
    {
        global $wpdb;
        return sprintf(
            'MySQL %s+ is required. You are running: %s',
            $this->minVersion,
            $wpdb->db_version()
        );
    }

    public function getName(): string
    {
        return 'mysql_version';
    }
}

Usage:

// bootstrap/app.php
use MyPlugin\Requirements\MysqlVersionRequirement;

$app = Application::create($context);
$app->register(RequirementsServiceProvider::class);

// After service provider is registered, add custom requirement
$checker = $app->make('requirements.checker');
$checker->addRequirement(new MysqlVersionRequirement('8.0'));

Memory Limit Requirement

Check for minimum PHP memory limit:

<?php
// src/Requirements/MemoryLimitRequirement.php

namespace MyPlugin\Requirements;

use WPZylos\Framework\Requirements\Contracts\RequirementInterface;

class MemoryLimitRequirement implements RequirementInterface
{
    private int $minBytes;

    public function __construct(string $minMemory = '128M')
    {
        $this->minBytes = $this->parseBytes($minMemory);
    }

    public function isSatisfied(): bool
    {
        $limit = ini_get('memory_limit');
        if ($limit === '-1') {
            return true; // Unlimited
        }
        return $this->parseBytes($limit) >= $this->minBytes;
    }

    public function getErrorMessage(): string
    {
        return sprintf(
            'Memory limit of %s is required. Current: %s',
            $this->formatBytes($this->minBytes),
            ini_get('memory_limit')
        );
    }

    public function getName(): string
    {
        return 'memory_limit';
    }

    private function parseBytes(string $value): int
    {
        $value = trim($value);
        $last = strtolower($value[strlen($value) - 1]);
        $value = (int) $value;

        switch ($last) {
            case 'g': $value *= 1024;
            case 'm': $value *= 1024;
            case 'k': $value *= 1024;
        }

        return $value;
    }

    private function formatBytes(int $bytes): string
    {
        if ($bytes >= 1073741824) {
            return round($bytes / 1073741824, 2) . 'G';
        }
        if ($bytes >= 1048576) {
            return round($bytes / 1048576, 2) . 'M';
        }
        return round($bytes / 1024, 2) . 'K';
    }
}

Early Exit Pattern

Stop plugin loading immediately if requirements fail:

<?php
// plugin.php

defined('ABSPATH') || exit;

// Quick requirements check before loading anything
require_once __DIR__ . '/vendor/autoload.php';

use WPZylos\Framework\Requirements\RequirementsConfig;

$checker = RequirementsConfig::fromFile(__DIR__ . '/config/requirements.php');

if ($checker->hasFailures()) {
    add_action('admin_notices', function() use ($checker) {
        echo '<div class="notice notice-error">';
        echo '<p><strong>My Plugin cannot load:</strong></p><ul>';
        foreach ($checker->getErrors() as $error) {
            echo '<li>' . wp_kses_post($error) . '</li>';
        }
        echo '</ul></div>';
    });
    return; // Don't load plugin
}

// Requirements passed — load the plugin
require_once __DIR__ . '/bootstrap/app.php';