跳转到主要内容

个人数据删除

将个人数据擦除器添加到您的插件中

在 WordPress 4.9.6 中,添加了新工具,以便更轻松地遵守欧盟《通用数据保护条例》(简称 GDPR)等法律。添加的工具之一是个人数据删除工具,它支持删除/匿名化特定用户的个人数据。它不会删除注册的用户帐户 - 这仍然是管理员可以选择是否执行的单独步骤。

除了存储在 WordPress 评论等内容中的个人数据之外,插件还可以连接到橡皮擦功能来删除他们收集的个人数据,无论是在 postmeta 之类的内容中,还是在全新的自定义帖子类型 (CPT) 中。

与导出器一样,所有擦除器的“关键”是用户的电子邮件地址 - 选择此地址是因为它支持擦除正式注册用户和未注册用户(例如,注销的评论者)的个人数据。

但是,由于执行个人数据删除是一个破坏性的过程,我们不想在没有确认请求的情况下就这样做,因此面向管理员的用户界面通过让管理员输入提出请求的用户名或电子邮件地址来启动所有请求然后发送一个链接,单击以确认他们的请求。一旦请求得到确认,管理员就可以开始删除用户的个人数据,或者在需要时强制删除。

擦除个人数据导出的方式与个人数据导出器的方式类似,并且依赖挂钩“擦除器”回调来完成擦除数据的肮脏工作。当管理员单击“删除个人数据”链接时,AJAX 循环就会开始,一次一个地迭代系统中注册的所有橡皮擦。除了核心内置的橡皮擦之外,插件还可以注册自己的橡皮擦回调。

橡皮擦回调接口设计得尽可能简单。橡皮擦回调接收我们正在使用的电子邮件地址以及页面参数。page 参数(从 1 开始)用于避免插件尝试一次性删除其收集的所有个人数据而可能导致超时。一个表现良好的插件会限制它尝试删除每页的数据量(例如 100 个帖子、200 个评论等)

橡皮擦回调会回复是否删除包含个人数据的项目、是否保留任何包含个人数据的项目、向管理员呈现的一系列消息(解释保留项目的原因)以及是否完成。如果橡皮擦回调报告尚未完成,则会再次调用它(在单独的请求中),并且页面参数递增 1。

当所有导出程序完成后,管理用户界面将更新,以显示找到的所有个人数据是否已删除,以及解释为何保留个人数据的任何消息。

让我们研究一个假设的插件,它将评论者位置数据添加到评论中。假设该插件使用ys of和add_comment_meta添加位置数据meta_kelatitudelongitude

该插件需要做的第一件事是创建一个接受电子邮件地址和页面的橡皮擦函数,例如:


/**
 * 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' );

这就是全部!您的插件现在将清理其个人数据!