brianhenryie/bh-wp-private-uploads

这是关于插件_title的简要描述。

0.1.1 2024-05-08 02:19 UTC

This package is auto-updated.

Last update: 2024-09-16 05:18:25 UTC


README

WordPress tested 5.9

BH WP Private Uploads

这是一个库,可以轻松创建一个无法公开下载内容的WordPress上传子目录。基于Chris Dennis的卓越插件Private Uploads。添加了上传文件到受保护目录的便捷函数、CLI和REST API命令,并在目录公开时显示管理员通知。

简介

我在各种插件和库中需要这个功能

例如:

  • BH WP Logger需要“logs”目录是私有的
  • BH WP Mailboxes需要“attachments”目录是私有的
  • BH WC Auto Print Shipping Labels & Receipts需要其PDF目录是私有的

主要功能是它定期运行HTTP请求以确认目录受保护。如果不,它将显示管理员通知。

然后,它允许管理员下载该目录中的所有文件,并有一个过滤器允许其他用户访问文件。

它复制了媒体/附件UI,并为自定义文章类型添加了用于上传文件的元框。

它远未完善,但还有很多内容未在此README中提及。

注意:在v1.0.0版本之前,每次发布都可能导致破坏性更改。

如果您决定使用此功能,我很乐意与您通话,讨论库的方向以及如何改进它。

正在进行的主要功能是允许文件与特定用户相关联,并允许基于父帖子的更广泛权限。特别是为了实现GDPR合规的自动删除。

安装

composer require brianhenryie/bh-wp-private-uploads

日志记录器仅是测试插件的开发需求。

以下代码假定您正在使用brianhenryie/strauss之类的工具前缀库命名空间。

实例化

以下代码将创建一个文件夹wp-content/uploads/my-plugin,其中包含一个保护它的.htaccess文件(通过WordPress重写规则),并创建一个cron作业以验证URL是否受保护,否则显示管理员通知。

$settings = new class() implements \BrianHenryIE\WP_Private_Uploads\Private_Uploads_Settings_Interface {
	use \BrianHenryIE\WP_Private_Uploads\Private_Uploads_Settings_Trait;

	public function get_plugin_slug(): string {
		return 'my-plugin';
	}
};
$private_uploads = \BrianHenryIE\WP_Private_Uploads\Private_Uploads::instance( $settings );

该特性能根据插件别名提供一些合理的默认值,这些默认值可以轻松覆盖。它还允许向前兼容,即可以添加到设置界面中的方法,并提供特质的默认值。

使用

可以将该$private_uploads实例传递,或者可以在代码的任何地方访问单例,而无需再次设置。

$private_uploads = \BrianHenryIE\WP_Private_Uploads\Private_Uploads::instance();

\BrianHenryIE\WP_Private_Uploads\API\API类(它扩展了Private_Uploads)包含方便的函数,用于下载和将文件移动到私有上传文件夹。它们的签名类似于WordPress的内部函数,因为它们在幕后使用wp_handle_upload并具有相同的返回签名。

// Download `https://example.org/doc.pdf` to `wp-content/uploads/my-plugin/2022/02/target-filename.pdf`.
$private_uploads->download_remote_file_to_private_uploads( 'https://example.org/doc.pdf', 'target-filename.pdf' );

// Move `'/local/path/to/doc.pdf` to `wp-content/uploads/my-plugin/2022/02/target-filename.pdf`.
$private_uploads->move_file_to_private_uploads( '/local/path/to/doc.pdf', 'target-filename.pdf' );

默认情况下,管理员可以通过其URL访问文件。这可以通过过滤器扩展到更多用户

/**
 * Allow filtering for other users.
 *
 * @param bool $should_serve_file
 * @param string $file
 */
$should_serve_file = apply_filters( "bh_wp_private_uploads_{$plugin_slug}_allow", $should_serve_file, $file );

例如,WooCommerce插件可能始终希望商店经理能够访问文件

add_filter( "bh_wp_private_uploads_{$plugin_slug}_allow", 'add_shop_manager_to_allow' );
function add_shop_manager_to_allow( bool $should_serve_file ): bool {
	return $should_serve_file || current_user_can( 'manage_woocommerce' );
}

高级

文件夹名称

文件夹名称可以轻松更改,例如wp-content/uploads/email-attachments

$settings = new class() implements \BrianHenryIE\WP_Private_Uploads\API\Private_Uploads_Settings_Interface {
	use \BrianHenryIE\WP_Private_Uploads\API\Private_Uploads_Settings_Trait;

	public function get_plugin_slug(): string {
		return 'my-plugin';
	}
	
    /**
	 * Defaults to the plugin slug when using Private_Uploads_Settings_Trait.
	 */
	public function get_uploads_subdirectory_name(): string {
		return 'email-attachments';
	}

};
$private_uploads = \BrianHenryIE\WP_Private_Uploads\Private_Uploads::instance( $settings );

CLI命令

在配置过程中轻松添加 CLI 命令

$settings = new class() implements \BrianHenryIE\WP_Private_Uploads\API\Private_Uploads_Settings_Interface {
	use \BrianHenryIE\WP_Private_Uploads\API\Private_Uploads_Settings_Trait;

	public function get_plugin_slug(): string {
		return 'my-plugin';
	}
	
	/**
	 * Defaults to no CLI commands when using Private_Uploads_Settings_Trait.
	 */
	public function get_cli_base(): ?string {
		return 'my-plugin';
	}

};
$private_uploads = \BrianHenryIE\WP_Private_Uploads\Private_Uploads::instance( $settings );
wp my-plugin download https://example.org/doc.pdf

!单例

不需要使用单例。

$private_uploads = new Private_Uploads( $private_uploads_settings, $logger );
// Add the hooks:
new BH_WP_Private_Uploads( $private_uploads, $private_uploads_settings, $logger );

快速测试

使用 cURL 快速测试 URL 是否私有

curl -o /dev/null --silent --head --write-out '%{http_code}\n' http://localhost:8080/bh-wp-private-uploads/wp-content/uploads/private/private.txt

状态

待办事项

  1. 测试 API 和提供私有文件的类
  2. 将设置重点放在帖子类型上,而不是插件别名(可能需要将设置界面重命名为反映这一点)
  3. 使用 API 类作为参数实例化钩子,而不是设置(即避免交叉连线的情况)
  4. 为媒体上传 UI 添加文档
  5. 更新此文档,包括帖子类型对象筛选器。
  6. 验证此 README 中的所有测试步骤
  7. 使用 bh-wp-logger 进行测试

已经完成了一些 PHPUnit、WPCS、PhpStan 的工作,但仍有很多工作要做。

  • 按文件级别设置用户权限。(自定义帖子类型,使用文件路径/URL 作为 GUID)
  • 验收测试: https://github.com/gamajo/codeception-redirects
  • 单元测试 REST 端点
  • WordPress 安装在子目录中时,重写规则是否工作?
  • 添加 Nginx 指令
  • 检测用户的托管提供商
  • GDPR 删除
  • REST API 文件上传 -> webhook。

权限

我们已经注册了一个帖子类型来注册 REST 端点。对于需要与特定用户关联的文件,使它们成为帖子的作者。对于更广泛的权限,使用帖子的父级——例如,将父帖子设置为 WooCommerce 订单,任何被允许查看订单的人都可以查看文件。这也与隐私(GDPR 删除等)相关联。