devuri / plugin-interface
一个简单的PHP接口,旨在为WordPress插件提供一致的结构。
Requires
- php: ^7.3 || ^7.4 || ^8.0
Requires (Dev)
- 10up/phpcs-composer: dev-master
- phpstan/phpstan: ^1.8
- phpstan/phpstan-strict-rules: ^1.3
- phpunit/phpunit: ^9.5
- szepeviktor/phpstan-wordpress: ^1.3
- vimeo/psalm: ^4.24 || ^5.0
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
使用方法
实现插件接口
要创建使用插件接口的插件,请按照以下步骤操作
-
实现PluginInterface:创建一个实现
PluginInterface
的类。这个类将定义您插件的行为。 -
定义类属性:定义类属性以存储插件目录路径和URL。这些属性将被用作初始化参数。
-
实现init()方法:实现
init()
方法以初始化您的插件。使用类属性设置插件目录路径和URL。 -
实现hooks()方法:实现
hooks()
方法以注册您插件所需的任何WordPress钩子(操作和过滤器)。
使用插件接口
要使用实现插件接口的插件,请按照以下步骤操作
-
初始化插件:调用插件类的
init()
方法,传递插件目录路径和URL作为参数。 -
使用插件:一旦初始化,您就可以按需使用插件。任何插件注册的钩子将由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();
说明
-
包含插件接口和类:包含
PluginInterface
以确保类遵守接口。 -
获取插件目录路径:使用
wp_plugin_dir_path()
函数检索插件文件的目录路径(__FILE__
)。这确保插件目录路径始终准确。 -
定义插件URL:使用
plugin_dir_url()
函数构造插件目录的URL。此URL可用于在插件中排队脚本、样式或创建链接。 -
初始化插件:调用
MyPlugin
类的init()
方法,传递插件目录路径和URL作为参数。这初始化了应用程序中的插件实例。 -
调用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 文件。