devuri/plugin-interface

一个简单的PHP接口,旨在为WordPress插件提供一致的结构。

v0.2.1 2024-09-06 13:43 UTC

This package is auto-updated.

Last update: 2024-09-12 20:52:51 UTC


README

一个简单的PHP接口,旨在为WordPress插件提供一致的结构。它定义了一组任何实现类都必须遵守的方法,确保了不同插件之间的统一性和易用性。

安装

只需将 PluginInterface.php 文件包含到您的项目中,或者通过Composer安装它。

composer require devuri/plugin-interface

使用方法

实现插件接口

要创建使用插件接口的插件,请按照以下步骤操作

  1. 实现PluginInterface:创建一个实现PluginInterface的类。这个类将定义您插件的行为。

  2. 定义类属性:定义类属性以存储插件目录路径和URL。这些属性将被用作初始化参数。

  3. 实现init()方法:实现init()方法以初始化您的插件。使用类属性设置插件目录路径和URL。

  4. 实现hooks()方法:实现hooks()方法以注册您插件所需的任何WordPress钩子(操作和过滤器)。

使用插件接口

要使用实现插件接口的插件,请按照以下步骤操作

  1. 初始化插件:调用插件类的init()方法,传递插件目录路径和URL作为参数。

  2. 使用插件:一旦初始化,您就可以按需使用插件。任何插件注册的钩子将由WordPress自动执行。

示例

以下是一个使用插件接口的插件实现的示例

<?php

use Urisoft\PluginInterface;

class MyPlugin implements PluginInterface
{
    public static $plugin_dir_path;
    public static $plugin_dir_url;

    public static function init(string $plugin_dir_path = '', string $plugin_dir_url = ''): object
    {
        static $instance = [];

        $called_class = static::class;

        if (!isset($instance[$called_class])) {
            $instance[$called_class] = new $called_class();
        }

        self::$plugin_dir_path = $plugin_dir_path;
        self::$plugin_dir_url = $plugin_dir_url;

        return $instance[$called_class];
    }

    public function hooks(): void
    {
        // Register hooks here using WordPress's hook registration functions
        // For example:
        // add_action('init', [$this, 'my_init_function']);
        // add_filter('the_content', [$this, 'my_content_filter']);
    }
}

或者您也可以使用基抽象实现,它将包括init()和所需的属性$plugin_dir_path$plugin_dir_url

<?php

use Urisoft\AbstractPlugin;

class MyPlugin extends AbstractPlugin
{
    public function hooks(): void
    {
        // Register hooks here using WordPress's hook registration functions
        // For example:
        // add_action('init', [$this, 'my_init_function']);
        // add_filter('the_content', [$this, 'my_content_filter']);
    }
}

以下是如何实例化插件类、设置插件路径和URL的示例

<?php

// Get the plugin directory path
$plugin_dir_path = wp_plugin_dir_path(__FILE__);

// Define the plugin URL
$plugin_dir_url = plugin_dir_url(__FILE__);

// Initialize the plugin
$my_plugin = MyPlugin::init($plugin_dir_path, $plugin_dir_url);

// Optionally, call the hooks() method to register hooks
$my_plugin->hooks();

说明

  1. 包含插件接口和类:包含PluginInterface以确保类遵守接口。

  2. 获取插件目录路径:使用wp_plugin_dir_path()函数检索插件文件的目录路径(__FILE__)。这确保插件目录路径始终准确。

  3. 定义插件URL:使用plugin_dir_url()函数构造插件目录的URL。此URL可用于在插件中排队脚本、样式或创建链接。

  4. 初始化插件:调用MyPlugin类的init()方法,传递插件目录路径和URL作为参数。这初始化了应用程序中的插件实例。

  5. 调用hooks()方法:可选地,可以调用插件类的hooks()方法来注册插件功能所需的任何WordPress钩子。

优点

  • 一致性:通过使用wp_plugin_dir_path()plugin_dir_url(),您确保插件目录路径和URL始终准确和一致。

  • 安全性:使用wp_plugin_dir_path()确保目录路径得到适当的清理和安全性,从而降低目录遍历攻击的风险。

  • 灵活性:可以轻松检索和使用插件代码中的插件目录路径和URL,允许动态生成文件和URL,而无需硬编码路径或URL。

  • 兼容性:使用 WordPress 函数(wp_plugin_dir_path()plugin_dir_url())确保了与未来 WordPress 更新和文件结构变更的兼容性。

使用 wp_plugin_dir_path()plugin_dir_url() 设置插件路径和 URL,为插件开发提供了一种稳健的方法。

TraitInstalled

AbstractPlugin 上的 TraitInstalled 提供了检查 WordPress 插件是否已安装和激活的实用方法。它有助于有效地管理插件依赖关系。

  • 检查插件是否安装
  • 检查插件是否激活
  • 检索所有已安装的插件

1. MyPlugin::is_installed($plugin_file)

检查插件是否安装。

  • 参数:
    $plugin_file (字符串) - 插件文件的路径,例如 'example-plugin/example-plugin.php'

  • 返回值:
    bool - 如果已安装则返回 true,否则返回 false

  • 示例:

    if (MyPlugin::is_installed('example-plugin/example-plugin.php')) {
        echo 'Plugin is installed.';
    }

2. MyPlugin::is_active($plugin_file)

检查插件是否激活。

  • 参数:
    $plugin_file (字符串) - 插件文件的路径,例如 'example-plugin/example-plugin.php'

  • 返回值:
    bool - 如果激活则返回 true,否则返回 false

  • 示例:

    if (MyPlugin::is_active('example-plugin/example-plugin.php')) {
        echo 'Plugin is active.';
    }

3. MyPlugin::get_installed_plugins()

检索所有已安装的插件。

  • 返回值:
    array - 已安装插件的数组。

  • 示例:

    $installed_plugins = MyPlugin::get_installed_plugins();
    print_r($installed_plugins);

示例用法

检查插件是否既已安装又已激活

function is_example_plugin_ready() {
    $plugin_file = 'example-plugin/example-plugin.php';
    return MyPlugin::is_installed($plugin_file) && MyPlugin::is_active($plugin_file);
}

if (!is_example_plugin_ready()) {
    // Show admin notice or handle plugin dependency
}

接口的优点

  • 接口隔离原则(ISP):该接口遵循 ISP,仅定义了必要的函数(init()hooks()),确保实现类不会负担不必要的依赖。

  • 关注点分离:该接口将初始化(init())与钩子注册(hooks())分离,促进了代码组织的清晰性,并使插件的运行行为更容易理解和维护。

  • 干净的构造函数:通过保持构造函数的简洁,该接口遵循单一职责原则(SRP),确保类只负责实例化,从而支持更好的代码可维护性。

  • 支持独立单元测试:干净的构造函数使得独立单元测试变得简单。由于初始化逻辑最少,类可以在隔离的情况下实例化,以便进行集中测试,从而提高可测试性。

  • 实现灵活性:该接口最少的函数要求允许实现类具有实现所需功能的灵活性,同时适应各种插件架构和实现策略,并确保一致的用法。

  • 促进依赖注入init() 方法作为依赖注入的一种形式,允许客户端向实现类提供外部依赖(如插件目录路径和 URL)。这促进了解耦,并增强了灵活性和可重用性。

许可

本项目采用 MIT 许可证 - 详细信息请参阅 LICENSE 文件。