felixarntz / leavesandlove-wp-plugin-util
这是一个用于正确初始化WordPress插件的库,使常规流程更容易处理,并添加了一些有用的功能,例如插件依赖关系管理或自动多站点兼容性。
README
LaL WP Plugin Util
这是一个用于正确初始化WordPress插件的库,使常规流程更容易处理,并添加了一些有用的功能,例如插件依赖关系管理或自动多站点兼容性。我最初开发这个库是为了在我的插件中使用它,但2.0.0版本标志着它的首次公开发布。
功能
- 使用WordPress插件初始化最佳实践
- 提供所需的最小PHP和WordPress版本
- 提供其他插件(包括最小版本)作为依赖项(可选)
- 如果任何必需的依赖项未满足,则优雅地失败并显示有用的管理员提示
- 显示未满足的插件依赖项的插件安装/激活/更新链接
- 通过提供每种操作的一个方法(可选)轻松处理插件的安装、卸载、激活和停用,自动多站点兼容
- 允许插件作为常规插件、必需插件或(如果您提供了一个值为
true
的is_library
参数)甚至作为另一个插件、必需插件或主题中的库捆绑使用 - 自动处理文本域加载,无论您是否使用本地.po文件还是wordpress.org语言包
- 在插件激活时在管理员中显示一个(永久关闭)状态消息(可选)
- 轻松将自定义链接添加到插件列表表中的插件行(可选)
- 让您的插件已经可以使用的实用函数可用,如获取绝对路径和URL、当前插件版本或PHP通知生成器(以防有人篡改您的插件)
这个库使用WordPress最佳实践来初始化插件,仅在必要时增强默认行为 - 它不会重新发明轮子或用数十个内部设置充塞管理员界面。
要求
您的插件本身必须
- 至少需要PHP 5.3和WordPress 3.5(如果用户尝试使用较低版本的插件,则插件加载器将优雅地失败)
- 使用命名空间和composer(并最好使用自动加载)
- 有一个名为
App
的主要初始化类,位于您的插件根命名空间中 - 将本地翻译文件(如有需要)存储在插件子目录
/languages/
中
入门
要使用这个库,首先将其添加到您的项目中,将其添加到您的composer.json文件中(composer require felixarntz/leavesandlove-wp-plugin-util:2.0.1
)。该库使用自动加载来加载其类。建议您还使用自动加载来加载您插件的自定义文件。
您的插件必须有一个主初始化类,名为 App
,并位于插件的根命名空间中(不要将此类放在实际的插件主文件中!)。此主类必须扩展本库中捆绑的 LaL_WP_Plugin
类。有关如何扩展此类的更多信息,请查看 其 PHPDoc 块。下面稍后会提供一个此类可能的样子的基本示例。
然后您从插件的主文件中初始化主类。以下代码片段提供了一个示例
<?php /* Plugin Name: My Plugin Plugin URI: https://wordpress.org/plugins/my-plugin/ Description: This is my plugin's description. Version: 1.0.0 Author: John Doe Author URI: http://example.com License: GNU General Public License v3 License URI: https://gnu.ac.cn/licenses/gpl-3.0.html Text Domain: my-plugin */ if ( version_compare( phpversion(), '5.3.0' ) >= 0 && ! class_exists( 'MyPluginNamespace\App' ) ) { // load the PHP autoloader... if ( file_exists( dirname( __FILE__ ) . '/my-plugin/vendor/autoload.php' ) ) { require_once dirname( __FILE__ ) . '/my-plugin/vendor/autoload.php'; } elseif ( file_exists( dirname( __FILE__ ) . '/vendor/autoload.php' ) ) { require_once dirname( __FILE__ ) . '/vendor/autoload.php'; } } elseif ( ! class_exists( 'LaL_WP_Plugin_Loader' ) ) { // ...or load the plugin loader class itself if ( file_exists( dirname( __FILE__ ) . '/my-plugin/vendor/felixarntz/leavesandlove-wp-plugin-util/leavesandlove-wp-plugin-loader.php' ) ) { require_once dirname( __FILE__ ) . '/my-plugin/vendor/felixarntz/leavesandlove-wp-plugin-util/leavesandlove-wp-plugin-loader.php'; } elseif ( file_exists( dirname( __FILE__ ) . '/vendor/felixarntz/leavesandlove-wp-plugin-util/leavesandlove-wp-plugin-loader.php' ) ) { require_once dirname( __FILE__ ) . '/vendor/felixarntz/leavesandlove-wp-plugin-util/leavesandlove-wp-plugin-loader.php'; } } // the actual plugin loading call LaL_WP_Plugin_Loader::load_plugin( array( 'slug' => 'my-plugin', 'name' => 'My Plugin', 'version' => '1.0.0', 'main_file' => __FILE__, 'namespace' => 'MyPluginNamespace', 'textdomain' => 'my-plugin', 'use_language_packs' => true, ), array( 'phpversion' => '5.3.0', 'wpversion' => '4.0', ) );
以上代码是您应该在插件主文件中包含的所有内容。如果您已经好奇过:您必须不要将任何代码包裹在 plugins_loaded
函数中——插件加载器会为您处理这一点。有关如何利用高级初始化方法的概述,请查看 插件加载器类的 PHPDoc 块。
根据上述示例,以下是在您的主类中应该有的绝对最小代码
<?php namespace MyPluginNamespace; use LaL_WP_Plugin as Plugin; if ( ! class_exists( 'MyPluginNamespace\App' ) ) { class App extends Plugin { protected static $_args = array(); protected function __construct( $args ) { parent::__construct( $args ); } protected function run() { // initialize the plugin here } } }
建议始终将所有类和函数包裹在一个 if 子句中,无论它们是否已经存在,这样可以防止插件同时作为常规插件和捆绑库使用时可能发生的致命错误。
有关如何使用本库的详细指南和参考,请阅读 GitHub 上的 Wiki。 详细指南即将推出 - 目前请参考 PHPDoc。
贡献和错误
如果您有改进本库的想法或发现了一个错误,请提交一个新的问题或 pull-request。
您也可以通过翻译本库来贡献。在库的 /languages/
目录中,有一个 .pot
文件,您可以将其作为起点。完成翻译后,您可以通过创建带有新翻译文件的 pull-request 或手动发送它们给我来贡献。