5.3 Добавление Стирателя личных данных к вашему плагину

В WordPress 4.9.6 были добавлены новые инструменты, облегчающие соблюдение таких законов, как Общее Положение Европейского Союза о Защите Данных, или сокращенно GDPR.

Среди инструментов, добавленных в WordPress 4.9.6, появился инструмент удаления личных данных (Personal Data Removal или Personal Data Eraser), который поддерживает удаление/анонимизацию личных данных для конкретного пользователя.

Он НЕ удаляет зарегистрированные учетные записи пользователей – это все еще отдельный шаг, который администратор может выбрать, делать это или нет.

В дополнение к личным данным, хранящимся в таких объектах, как комментарии WordPress, плагины могут также подключаться к стирателю, чтобы стереть личные данные, которые они собирают, будь то postmeta или даже в совершенно новых Пользовательских типах записей (Custom Post Type, CPT).

Как и в случае с экспортерами, “ключом” для всех ластиков является адрес электронной почты пользователя – он был выбран потому, что поддерживает стирание личных данных как для полноценных зарегистрированных пользователей, так и для незарегистрированных (например, как для комментатора, вышедшего из системы).

Однако, поскольку выполнение стирания личных данных является разрушительным процессом, мы не хотим просто сделать это без подтверждения запроса, поэтому пользовательский интерфейс, обращенный к администратору, начинает все запросы с того, что администратор вводит имя пользователя или адрес электронной почты, делая запрос, а затем посылает ссылку, нажав на которую, пользователь может подтвердить свой запрос. Как только запрос был подтвержден, администратор может начать стирание личных данных для пользователя, или заставить его, если необходимость возникает.

Способ стирания экспортируемых персональных данных аналогичен способу экспортеров персональных данных – и полагается на перехват “стирающих” обратных вызовов для выполнения грязной работы по стиранию данных. Когда администратор нажимает на ссылку удаления персональных данных, начинается цикл AJAX, который итературизирует все стиратели, зарегистрированные в системе, по очереди. В дополнение к стирателям, встроенным в ядро, плагины могут регистрировать свои собственные обратные вызовы стирателей.

Интерфейс обратного вызова стирателя разработан таким образом, чтобы быть как можно более простым. Обратный вызов стирателя получает адрес электронной почты, с которым мы работаем, а также параметр страницы. Параметр страницы (который начинается с 1) используется для того, чтобы избежать использования плагинов, которые могут вызывать таймауты, пытаясь стереть все личные данные, которые они собрали за один раз. Хорошо себя зарекомендовавший плагин ограничит количество данных, которые он пытается стереть на одной странице (например, 100 сообщений, 200 комментариев и т.д.).

Обратный вызов стирателя отвечает, были ли удалены элементы, содержащие личные данные, были ли сохранены какие-либо элементы, содержащие личные данные, массив сообщений для представления администратору (объясняя, почему элементы, которые были сохранены, были сохранены), и было ли это сделано или нет. Если обратный вызов стирателя сообщает, что это не было сделано, он будет вызван снова (в отдельном запросе) с параметром страницы, увеличенным на 1.

Когда все экспортеры были вызваны для завершения, пользовательский интерфейс администратора обновляется, чтобы показать, были ли стерты все найденные персональные данные, а также любые сообщения, объясняющие, почему персональные данные были сохранены.

Поработаем над гипотетическим плагином, который добавляет к комментариям данные о местоположении комментатора. Предположим, что плагин использовал add_comment_meta для добавления данных о местоположении, используя meta_keys из latitude (широта) и longitude (долгота).

Первое, что нужно сделать плагину, это создать функцию стирателя, которая будет принимать адрес электронной почты и страницу, например:

function my_plugin_eraser( $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.

При регистрации вы предоставляете дружественное имя для стирателя (для помощи в отладке – это дружественное имя в данный момент никому не показывается) и обратного вызова, например:

function register_my_plugin_eraser( $erasers ) {
  $erasers['my-plugin-slug'] = array(
    'eraser_friendly_name' => __( 'Comment Location Plugin' ),
    'callback'             => 'my_plugin_eraser',
    );
  return $erasers;
}
 
add_filter(
  'wp_privacy_personal_data_erasers',
  'register_my_plugin_eraser',
  10
);

И это все! Ваш плагин теперь очистит свои личные данные!

Наверх ↑