WordPress 4.9.6 新增了一些工具,以便用户更轻松地遵守欧盟《通用数据保护条例》(简称 GDPR)等法律法规。新增的工具之一是“个人数据删除”工具,该工具支持擦除/匿名化指定用户的个人数据。它不会删除注册用户帐户——这仍然是一个单独的步骤,管理员可以选择是否执行。
除了存储在 WordPress 评论等内容中的个人数据之外,插件还可以挂接橡皮擦功能来擦除其收集的个人数据,无论是在 postmeta 之类的内容中,还是在全新的自定义帖子类型 (CPT) 中。
与导出器一样,所有擦除器的“密钥”都是用户的电子邮件地址——之所以选择它,是因为它支持擦除正式注册用户和未注册用户(例如已注销的评论者)的个人数据。
然而,由于执行个人数据擦除操作具有破坏性,我们不希望在未确认请求的情况下就直接执行此操作。因此,面向管理员的用户界面会先让管理员输入发出请求的用户名或电子邮件地址,然后发送一个链接供用户点击确认请求,从而启动所有请求。请求确认后,管理员可以为用户启动个人数据擦除操作,或者在必要时强制执行。
个人数据导出的擦除方式与个人数据导出器类似,依赖于挂钩“擦除器”回调来完成擦除数据这一繁琐的工作。当管理员点击“移除个人数据”链接时,会启动一个 AJAX 循环,逐个迭代系统中注册的所有擦除器。除了核心内置的擦除器之外,插件还可以注册自己的擦除器回调。
擦除器回调接口的设计尽可能简洁。擦除器回调接收我们正在处理的电子邮件地址以及一个页面参数。页面参数(从 1 开始)用于避免插件尝试一次性擦除所有收集的个人数据而导致的超时。一个行为良好的插件会限制其尝试擦除每页的数据量(例如 100 条帖子、200 条评论等)。
擦除器回调会返回以下信息:包含个人数据的项目是否已被擦除、是否有任何包含个人数据的项目被保留、一组要呈现给管理员的消息(解释保留的项目被保留的原因)以及擦除是否完成。如果擦除器回调报告未完成,则会在单独的请求中再次调用该回调,并将页面参数加 1。
当所有导出器都已完成调用后,管理员用户界面将更新以显示是否已删除所有个人数据,以及解释为何保留个人数据的任何消息。
让我们来开发一个假设的插件,用于在评论中添加评论者的位置数据。假设该插件曾经add_comment_meta使用meta_keys oflatitude和longitude
插件需要做的第一件事是创建一个接受电子邮件地址和页面的橡皮擦函数,例如:
/**
* Removes any stored location data from a user's comment meta for the supplied email address.
*
* @param string $email_address email address to manipulate
* @param int $page pagination
*
* @return array
*/
function wporg_remove_location_meta_from_comments_for_email( $email_address, $page = 1 ) {
$number = 500; // Limit us to avoid timing out
$page = (int) $page;
$comments = get_comments(
array(
'author_email' => $email_address,
'number' => $number,
'paged' => $page,
'order_by' => 'comment_ID',
'order' => 'ASC',
)
);
$items_removed = false;
foreach ( (array) $comments as $comment ) {
$latitude = get_comment_meta( $comment->comment_ID, 'latitude', true );
$longitude = get_comment_meta( $comment->comment_ID, 'longitude', true );
if ( ! empty( $latitude ) ) {
delete_comment_meta( $comment->comment_ID, 'latitude' );
$items_removed = true;
}
if ( ! empty( $longitude ) ) {
delete_comment_meta( $comment->comment_ID, 'longitude' );
$items_removed = true;
}
}
// Tell core if we have more comments to work on still
$done = count( $comments ) < $number;
return array(
'items_removed' => $items_removed,
'items_retained' => false, // always false in this example
'messages' => array(), // no messages in this example
'done' => $done,
);
}
插件接下来需要做的是通过使用“wp_privacy_personal_data_erasers”过滤器过滤橡皮擦数组来注册回调。
注册时,您需要为橡皮擦提供一个友好名称(以帮助调试 - 此友好名称目前不会向任何人显示)和回调,例如
/**
* Registers all data erasers.
*
* @param array $exporters
*
* @return mixed
*/
function wporg_register_privacy_erasers( $erasers ) {
$erasers['my-plugin-slug'] = array(
'eraser_friendly_name' => __( 'Comment Location Plugin', 'text-domain' ),
'callback' => 'wporg_remove_location_meta_from_comments_for_email',
);
return $erasers;
}
add_filter( 'wp_privacy_personal_data_erasers', 'wporg_register_privacy_erasers' );
就这样!你的插件现在将清理其个人数据!