woocommerce/includes/class-wc-privacy.php

249 lines
8.2 KiB
PHP
Raw Normal View History

2018-04-17 11:25:03 +00:00
<?php
/**
* Privacy/GDPR related functionality which ties into WordPress functionality.
*
* @since 3.4.0
* @package WooCommerce\Classes
*/
defined( 'ABSPATH' ) || exit;
/**
* WC_Privacy Class.
*/
class WC_Privacy extends WC_Abstract_Privacy {
2018-04-17 11:25:03 +00:00
2018-04-17 14:21:03 +00:00
/**
* Background process to clean up orders.
*
* @var WC_Privacy_Background_Process
*/
2018-04-26 10:29:51 +00:00
protected static $background_process;
2018-04-17 14:21:03 +00:00
2018-04-17 11:25:03 +00:00
/**
* Init - hook into events.
*/
public function __construct() {
parent::__construct( 'WooCommerce' );
2018-04-26 10:29:51 +00:00
if ( ! self::$background_process ) {
self::$background_process = new WC_Privacy_Background_Process();
}
2018-04-17 14:21:03 +00:00
// Include supporting classes.
include_once 'class-wc-privacy-erasers.php';
include_once 'class-wc-privacy-exporters.php';
2018-04-13 17:03:02 +00:00
// This hook registers WooCommerce data exporters.
$this->add_exporter( __( 'Customer Data', 'woocommerce' ), array( 'WC_Privacy_Exporters', 'customer_data_exporter' ) );
$this->add_exporter( __( 'Customer Orders', 'woocommerce' ), array( 'WC_Privacy_Exporters', 'order_data_exporter' ) );
$this->add_exporter( __( 'Customer Downloads', 'woocommerce' ), array( 'WC_Privacy_Exporters', 'download_data_exporter' ) );
// This hook registers WooCommerce data erasers.
$this->add_eraser( __( 'Customer Data', 'woocommerce' ), array( 'WC_Privacy_Erasers', 'customer_data_eraser' ) );
$this->add_eraser( __( 'Customer Orders', 'woocommerce' ), array( 'WC_Privacy_Erasers', 'order_data_eraser' ) );
$this->add_eraser( __( 'Customer Downloads', 'woocommerce' ), array( 'WC_Privacy_Erasers', 'download_data_eraser' ) );
// Cleanup orders daily - this is a callback on a daily cron event.
add_action( 'woocommerce_cleanup_orders', array( $this, 'order_cleanup_process' ) );
2018-04-13 17:03:02 +00:00
// Handles custom anonomization types not included in core.
add_filter( 'wp_privacy_anonymize_data', array( $this, 'anonymize_custom_data_types' ), 10, 3 );
2018-04-26 10:29:51 +00:00
// When this is fired, data is removed in a given order. Called from bulk actions.
add_action( 'woocommerce_remove_order_personal_data', array( 'WC_Privacy_Erasers', 'remove_order_personal_data' ) );
}
/**
* Add privacy policy content for the privacy policy page.
*
* @since 3.4.0
*/
2018-04-26 10:29:51 +00:00
public function get_privacy_message() {
$content = wp_kses_post( apply_filters( 'wc_privacy_policy_content', wpautop( __( '
We collect information about you during the checkout process on our store. This information may include, but is not limited to, your name, billing address, shipping address, email address, phone number, credit card/payment details and any other details that might be requested from you for the purpose of processing your orders.
Handling this data also allows us to:
- Send you important account/order/service information.
- Respond to your queries, refund requests, or complaints.
- Process payments and to prevent fraudulent transactions. We do this on the basis of our legitimate business interests.
- Set up and administer your account, provide technical and customer support, and to verify your identity.
Additionally we may also collect the following information:
- Location and traffic data (including IP address and browser type) if you place an order, or if we need to estimate taxes and shipping costs based on your location.
- Product pages visited and content viewed whist your session is active.
- Your comments and product reviews if you choose to leave them on our website.
- Shipping address if you request shipping rates from us before checkout whist your session is active.
- Cookies which are essential to keep track of the contents of your cart whist your session is active.
- Account email/password to allow you to access your account, if you have one.
- If you choose to create an account with us, your name, address, email and phone number, which will be used to populate the checkout for future orders.
', 'woocommerce' ) ) ) );
return $content;
2018-04-17 14:21:03 +00:00
}
2018-04-26 10:29:51 +00:00
/**
* Spawn events for order cleanup.
*/
public function order_cleanup_process() {
self::$background_process->push_to_queue( array( 'task' => 'trash_pending_orders' ) );
self::$background_process->push_to_queue( array( 'task' => 'trash_failed_orders' ) );
self::$background_process->push_to_queue( array( 'task' => 'trash_cancelled_orders' ) );
self::$background_process->push_to_queue( array( 'task' => 'anonymize_completed_orders' ) );
self::$background_process->save()->dispatch();
}
/**
* Handle some custom types of data and anonymize them.
*
* @param string $anonymous Anonymized string.
* @param string $type Type of data.
* @param string $data The data being anonymized.
* @return string Anonymized string.
*/
public function anonymize_custom_data_types( $anonymous, $type, $data ) {
switch ( $type ) {
case 'address_state':
case 'address_country':
$anonymous = ''; // Empty string - we don't want to store anything after removal.
break;
case 'phone':
$anonymous = preg_replace( '/\d/u', '0', $data );
break;
}
return $anonymous;
}
2018-04-17 14:21:03 +00:00
/**
* For a given query trash all matches.
*
* @since 3.4.0
* @param array $query Query array to pass to wc_get_orders().
* @return int Count of orders that were trashed.
*/
2018-04-26 10:29:51 +00:00
protected static function trash_orders_query( $query ) {
2018-04-17 14:21:03 +00:00
$orders = wc_get_orders( $query );
$count = 0;
if ( $orders ) {
foreach ( $orders as $order ) {
$order->delete( false );
$count ++;
}
}
return $count;
}
/**
* For a given query, anonymize all matches.
*
* @since 3.4.0
* @param array $query Query array to pass to wc_get_orders().
* @return int Count of orders that were anonymized.
*/
2018-04-26 10:29:51 +00:00
protected static function anonymize_orders_query( $query ) {
2018-04-17 14:21:03 +00:00
$orders = wc_get_orders( $query );
$count = 0;
if ( $orders ) {
foreach ( $orders as $order ) {
WC_Privacy_Erasers::remove_order_personal_data( $order );
2018-04-17 14:21:03 +00:00
$count ++;
}
}
return $count;
}
/**
* Find and trash old orders.
*
* @since 3.4.0
* @param int $limit Limit orders to process per batch.
* @return int Number of orders processed.
*/
2018-04-26 10:29:51 +00:00
public static function trash_pending_orders( $limit = 20 ) {
2018-04-18 10:24:07 +00:00
$option = wc_parse_relative_date_option( get_option( 'woocommerce_trash_pending_orders' ) );
2018-04-17 14:21:03 +00:00
2018-04-17 14:33:40 +00:00
if ( empty( $option['number'] ) ) {
2018-04-17 14:21:03 +00:00
return 0;
}
2018-04-26 10:29:51 +00:00
return self::trash_orders_query( array(
2018-04-17 14:33:40 +00:00
'date_created' => '<' . strtotime( '-' . $option['number'] . ' ' . $option['unit'] ),
2018-04-17 14:21:03 +00:00
'limit' => $limit, // Batches of 20.
'status' => 'wc-pending',
) );
}
/**
* Find and trash old orders.
*
* @since 3.4.0
* @param int $limit Limit orders to process per batch.
* @return int Number of orders processed.
*/
2018-04-26 10:29:51 +00:00
public static function trash_failed_orders( $limit = 20 ) {
2018-04-18 10:24:07 +00:00
$option = wc_parse_relative_date_option( get_option( 'woocommerce_trash_failed_orders' ) );
2018-04-17 14:21:03 +00:00
2018-04-17 14:33:40 +00:00
if ( empty( $option['number'] ) ) {
2018-04-17 14:21:03 +00:00
return 0;
}
2018-04-26 10:29:51 +00:00
return self::trash_orders_query( array(
2018-04-17 14:33:40 +00:00
'date_created' => '<' . strtotime( '-' . $option['number'] . ' ' . $option['unit'] ),
2018-04-17 14:21:03 +00:00
'limit' => $limit, // Batches of 20.
'status' => 'wc-failed',
) );
}
/**
* Find and trash old orders.
*
* @since 3.4.0
* @param int $limit Limit orders to process per batch.
* @return int Number of orders processed.
*/
2018-04-26 10:29:51 +00:00
public static function trash_cancelled_orders( $limit = 20 ) {
2018-04-18 10:24:07 +00:00
$option = wc_parse_relative_date_option( get_option( 'woocommerce_trash_cancelled_orders' ) );
2018-04-17 14:21:03 +00:00
2018-04-17 14:33:40 +00:00
if ( empty( $option['number'] ) ) {
2018-04-17 14:21:03 +00:00
return 0;
}
2018-04-26 10:29:51 +00:00
return self::trash_orders_query( array(
2018-04-17 14:33:40 +00:00
'date_created' => '<' . strtotime( '-' . $option['number'] . ' ' . $option['unit'] ),
2018-04-17 14:21:03 +00:00
'limit' => $limit, // Batches of 20.
'status' => 'wc-cancelled',
) );
}
/**
2018-04-24 15:47:55 +00:00
* Anonymize old completed orders.
2018-04-17 14:21:03 +00:00
*
* @since 3.4.0
* @param int $limit Limit orders to process per batch.
* @param int $page Page to process.
* @return int Number of orders processed.
*/
2018-04-26 10:29:51 +00:00
public static function anonymize_completed_orders( $limit = 20, $page = 1 ) {
2018-04-17 14:21:03 +00:00
$option = wc_parse_relative_date_option( get_option( 'woocommerce_anonymize_completed_orders' ) );
2018-04-17 14:33:40 +00:00
if ( empty( $option['number'] ) ) {
2018-04-17 14:21:03 +00:00
return 0;
}
2018-04-17 11:25:03 +00:00
2018-04-26 10:29:51 +00:00
return self::anonymize_orders_query( array(
2018-04-17 14:33:40 +00:00
'date_created' => '<' . strtotime( '-' . $option['number'] . ' ' . $option['unit'] ),
2018-04-17 14:21:03 +00:00
'limit' => $limit, // Batches of 20.
'status' => 'wc-completed',
'anonymized' => false,
) );
2018-04-17 11:25:03 +00:00
}
}
new WC_Privacy();