wpsmith / plugin
WordPress 插件扩展的核心类,可以隐藏插件页上的 WordPress 插件。
Requires
- php: >=7.4.0
- wpsmith/templates: dev-master
README
一个用于在 WordPress 插件中使用的类,用于防止插件更新、确保依赖插件处于活动状态以及隐藏特定插件。
描述
这些类解决了三个(3)特定问题
-
防止插件更新
WordPress 会自动检查 WordPress 仓库中的插件和主题以更新。如果插件 slug 恰好匹配,则对私有插件来说,这是一个特别的问题。
-
隐藏插件
将特定功能移动到核心功能插件是一种最佳实践。一个人可以使用 mu-plugin,但大多数人使用标准插件。然而,客户可以轻松地停用或删除插件。因此,将插件从插件页面上隐藏变得非常重要。
-
扩展插件
许多核心功能插件会扩展/修改其他插件。如果正在扩展的依赖插件被停用,则该插件会使 WordPress 实例不稳定并破坏整个站点。
-
卸载插件
始终卸载您的插件数据和文件是一种最佳实践。然而,需要构建一个界面来决定应该卸载什么。这使用 WP Pointers 创建了这样一个界面,使用户可以选择只卸载插件文件或所有内容。
-
构建插件
在构建插件时,这个库提供了一个可扩展的基本类,作为新插件的核心类。
安装
这本身不是一个 WordPress 插件,因此通常的说明不适用。相反,您可以手动安装或使用 composer
。
手动安装类
将 Plugin/src
文件夹复制到您的插件中以进行基本使用。请务必相应地要求各种文件。
或
通过 Composer 安装类
- 告诉 Composer 将此类作为依赖项安装:
composer require wpsmith/plugin
- 建议:安装 Mozart 包:
composer require coenjacobs/mozart --dev
并 进行配置。 - 现在,已将类重命名为使用您自己的前缀,以防止与其他捆绑此类的插件发生冲突。
实现与使用
更新预防
防止当前插件更新
new \WPS\WP\Plugin\PreventUpdate( plugin_basename( __FILE__ ) );
防止其他插件(例如,ACF)更新
new \WPS\WP\Plugin\PreventUpdate( 'advanced-custom-fields-pro/acf.php' );
隐藏插件(s)
隐藏当前插件
new \WPS\WP\Plugin\HidePlugin( plugin_basename( __FILE__ ) );
隐藏其他插件(例如,ACF)
new \WPS\WP\Plugin\HidePlugin( 'advanced-custom-fields-pro/acf.php' );
扩展插件(s)
要扩展 ACF,您会这样做
new \WPS\WP\Plugin\ExtendPlugin( 'advanced-custom-fields-pro/acf.php', __FILE__, '5.8.7', 'plugin-text-domain' );
卸载插件(s)
要使用 UninstallManager
,您会在插件的根目录这样做
简单示例
在插件的主要文件中
global $my_plugin_uninstaller; $my_plugin_uninstaller = new \WPS\WP\Plugin\UninstallManager( __FILE__ ); // Register activation stuffs. register_activation_hook( __FILE__, function() { global $my_plugin_uninstaller; UninstallManager::on_activation( $my_plugin_uninstaller ); } ); // Register deactivation stuffs. register_deactivation_hook( __FILE__, function() { global $my_plugin_uninstaller; UninstallManager::on_deactivation( $my_plugin_uninstaller ); } ); // If not using an uninstall.php, you need to register uninstall stuffs. register_uninstall_hook( __FILE__, function() { global $my_plugin_uninstaller; $wps_codeable_delete_action = $my_plugin_uninstaller->get_uninstall_action(); // Bail if not deleting everything. if ( 'everything' !== $wps_codeable_delete_action ) { return; } // Delete Options. $my_plugin_uninstaller->uninstall(); } );
更好的例子
在主要插件文件中
/** * Gets uninstall manager. * * This function can be placed anywhere. Alternatively, you can use a global variable to hold the uninstaller. * * @param string $plugin_file Absolute path to plugin base file. * * @return \WPS\WP\Plugin\UninstallManager */ function get_uninstall_manager( $plugin_file ) { static $mgr; if ( null === $mgr ) { $mgr = new \WPS\WP\Plugin\UninstallManager( $plugin_file ); } return $mgr; } // Setup Uninstall Manager at base of the plugin. get_uninstall_manager( __FILE__ ); register_activation_hook( __FILE__, function() { UninstallManager::on_activation( get_uninstall_manager() ); } ); register_deactivation_hook( __FILE__, function() { UninstallManager::on_deactivation( get_uninstall_manager() ); } );
然后在 uninstall.php
中
// Require the main plugin file. require_once( 'plugin.php' ); // Get what we are supposed to do on deletion/uninstall. $uninstall_manager = get_uninstall_manager(); $wps_codeable_delete_action = $uninstall_manager->get_uninstall_action(); // Bail if not deleting everything. if ( 'everything' !== $wps_codeable_delete_action ) { return; } // Delete Options. $uninstall_manager->uninstall();
构建插件
对于我的所有插件,我为主要插件构建了一个基本类。出厂时,PluginBase
做了三件事
- 相应地加载插件文本域。
- 实现
Singleton
以确保只有一个。 - 提供以下方法
Plugin::doing_ajax()
或PluginBase::doing_ajax()
- 确定是否 WP 正在处理 AJAX 请求。Plugin::get_version()
- 获取插件的版本。默认为0.0.0
。Plugin::get_plugin_name()
- 获取插件的名称。默认为wps
。$this->get_template_loader()
- 获取插件模板加载器。详见 TemplateLoader。$this->add_action()
- 要么将操作添加到正确的钩子,要么如果钩子已经被执行或正在执行,则执行操作。
一般来说,过程是这样的
namespace WPS\WP\Plugins\MyPlugin; use WPS\WP\Plugin\PluginBase; // Exit if accessed directly. if ( ! defined( 'ABSPATH' ) ) { exit; } if ( ! class_exists( __NAMESPACE__ . '\Plugin' ) ) { /** * Class Plugin * * @package \WPS\WP\Plugins\MyPlugin */ class Plugin extends PluginBase { /** * Plugin constructor. * * @param array $args Optional args. * * @since 0.0.1 */ protected function __construct( $args = array() ) { // Construct the parent. parent::__construct( $args ); } } } // Instantiate. Plugin::get_instance( array( 'name' => 'my-plugin', 'version' => '0.0.1', 'file' => __FILE__, ) );
变更日志
请参阅 变更日志。
许可协议
贡献
欢迎贡献 - 请在 master
分支上创建分支、修复问题并发送拉取请求。
致谢
由 Travis Smith 构建
版权所有 2013-2020 Travis Smith