wpsmith/plugin

WordPress 插件扩展的核心类,可以隐藏插件页上的 WordPress 插件。

2.0.3 2022-02-13 20:33 UTC

This package is auto-updated.

Last update: 2024-09-14 02:50:51 UTC


README

Code Climate

一个用于在 WordPress 插件中使用的类,用于防止插件更新、确保依赖插件处于活动状态以及隐藏特定插件。

描述

这些类解决了三个(3)特定问题

  1. 防止插件更新

    WordPress 会自动检查 WordPress 仓库中的插件和主题以更新。如果插件 slug 恰好匹配,则对私有插件来说,这是一个特别的问题。

  2. 隐藏插件

    将特定功能移动到核心功能插件是一种最佳实践。一个人可以使用 mu-plugin,但大多数人使用标准插件。然而,客户可以轻松地停用或删除插件。因此,将插件从插件页面上隐藏变得非常重要。

  3. 扩展插件

    许多核心功能插件会扩展/修改其他插件。如果正在扩展的依赖插件被停用,则该插件会使 WordPress 实例不稳定并破坏整个站点。

  4. 卸载插件

    始终卸载您的插件数据和文件是一种最佳实践。然而,需要构建一个界面来决定应该卸载什么。这使用 WP Pointers 创建了这样一个界面,使用户可以选择只卸载插件文件或所有内容。

  5. 构建插件

    在构建插件时,这个库提供了一个可扩展的基本类,作为新插件的核心类。

安装

这本身不是一个 WordPress 插件,因此通常的说明不适用。相反,您可以手动安装或使用 composer

手动安装类

Plugin/src 文件夹复制到您的插件中以进行基本使用。请务必相应地要求各种文件。

通过 Composer 安装类

  1. 告诉 Composer 将此类作为依赖项安装:composer require wpsmith/plugin
  2. 建议:安装 Mozart 包:composer require coenjacobs/mozart --dev进行配置
  3. 现在,已将类重命名为使用您自己的前缀,以防止与其他捆绑此类的插件发生冲突。

实现与使用

更新预防

防止当前插件更新

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 做了三件事

  1. 相应地加载插件文本域。
  2. 实现 Singleton 以确保只有一个。
  3. 提供以下方法
  • 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__,
) );

变更日志

请参阅 变更日志

许可协议

GPL 2.0 或更高版本.

贡献

欢迎贡献 - 请在 master 分支上创建分支、修复问题并发送拉取请求。

致谢

Travis Smith 构建
版权所有 2013-2020 Travis Smith