在 WordPress 4.9.6 中,新增了工具以简化遵守法律(如欧盟的《通用数据保护条例》,简称 GDPR)的工作。新增的工具包括个人数据移除工具,该工具支持擦除/匿名化指定用户的个人数据。它不会删除已注册的用户账户——删除用户账户仍然是管理员可以选择是否执行的单独步骤。

除了存储在 WordPress 评论等地方中的个人数据外,插件还可以钩入擦除功能以擦除它们收集的个人数据,无论这些数据是存储在 postmeta 中还是全新的自定义文章类型(CPT)中。

与导出器一样,所有擦除器的“密钥”都是用户的电子邮件地址——选择它是因为它支持擦除完整注册的用户的个人数据以及未注册用户(例如已登出的评论者)的个人数据。

然而,由于执行个人数据擦除是一个破坏性过程,我们不想在未确认请求的情况下直接执行,因此面向管理员的用户界面首先要求管理员输入提出请求的用户名或电子邮件地址,然后发送一个链接供其点击以确认请求。一旦请求得到确认,管理员就可以启动该用户的个人数据擦除,或在需要时强制进行擦除。

个人数据的擦除方式与个人数据导出器类似——它依赖于钩入“擦除器”回调来执行擦除数据的繁重工作。当管理员点击移除个人数据链接时,会开始一个 AJAX 循环,该循环逐个遍历系统中注册的所有擦除器。除了核心内置的擦除器外,插件还可以注册自己的擦除器回调。

擦除器回调接口的设计尽可能简单。擦除器回调接收我们正在处理的电子邮件地址以及一个 page 参数。page 参数(从 1 开始)用于避免插件因尝试一次性擦除其收集的所有个人数据而导致超时。行为良好的插件将限制每页尝试擦除的数据量(例如 100 篇文章、200 条评论等)。

擦除器回调会回复是否擦除了包含个人数据的项,是否保留了任何包含个人数据的项,向管理员显示的用于解释为何保留某些项的消息数组,以及是否已完成。如果擦除器回调报告尚未完成,它将在单独的请求中再次被调用,此时 page 参数将递增 1。

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

让我们为一个假设的插件工作,该插件为评论添加了评论者位置数据。假设该插件已使用 add_comment_meta 添加位置数据,使用的 meta_keys 为 latitude 和 longitude

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

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

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