首页 / 插件开发手册 / 隐私政策 / 清除个人数据

清除个人数据

在你的插件中添加个人数据清除功能

在WordPress 4.9.6中,添加了新的工具,以使遵守欧盟的一般数据保护法规(简称GDPR)等法律更加容易。在添加的工具中,有一个个人数据删除工具,它支持给定用户的个人数据的删除/匿名化。它不会删除已注册的用户帐户–这仍然是管理员可以选择是否执行的单独步骤。

除了存储在WordPress评论中的个人数据外,插件还可以连接到清除功能来清除他们收集的个人数据,无论是postmeta中的数据,还是全新的自定义文章类型(CPT)。

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

然而,由于执行个人数据清除是一个破坏性的过程,我们不希望在不确认请求的情况下执行此操作,因此面向管理员的用户界面通过让管理员输入发出请求的用户名或电子邮件地址来启动所有请求,然后发送一个链接以单击以确认其请求。一旦确认请求,管理员可以开始为用户清除个人数据,或者在需要时强制清除。

个人数据清除方式与个人数据导出的方式类似,并且依赖于挂接“eraser”回调来完成清除数据的工作。当管理员单击“删除个人数据”链接时,一个AJAX循环开始,循环遍历系统中注册的所有清除器,每次一个。除了内置在内核中的清除器外,插件还可以注册自己的清除器回调。

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

清除器回调回应是否删除了包含个人数据的项目、是否保留了任何包含个人数据的项目、向管理员呈现的一系列消息(解释保留的项目为何被保留)以及是否执行了该操作。如果清除器回调报告没有完成,它将再次调用(在单独的请求中),页面参数增加1。

当所有清除器都被调用完成后,管理用户界面将更新,以显示是否所有找到的个人数据都被删除,以及任何解释个人数据被保留原因的消息。

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

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

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

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