202 lines
5.9 KiB
PHP
202 lines
5.9 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* @package Freemius
|
||
|
* @copyright Copyright (c) 2015, Freemius, Inc.
|
||
|
* @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3
|
||
|
* @since 2.1.0
|
||
|
*/
|
||
|
|
||
|
if ( ! defined( 'ABSPATH' ) ) {
|
||
|
exit;
|
||
|
}
|
||
|
|
||
|
class FS_GDPR_Manager {
|
||
|
/**
|
||
|
* @var FS_Option_Manager
|
||
|
*/
|
||
|
private $_storage;
|
||
|
/**
|
||
|
* @var array {
|
||
|
* @type bool $required Are GDPR rules apply on the current context admin.
|
||
|
* @type bool $show_opt_in_notice Should the marketing and offers opt-in message be shown to the admin or not. If not set, defaults to `true`.
|
||
|
* @type int $notice_shown_at Last time the special GDPR opt-in message was shown to the current admin.
|
||
|
* }
|
||
|
*/
|
||
|
private $_data;
|
||
|
/**
|
||
|
* @var int
|
||
|
*/
|
||
|
private $_wp_user_id;
|
||
|
/**
|
||
|
* @var string
|
||
|
*/
|
||
|
private $_option_name;
|
||
|
/**
|
||
|
* @var FS_Admin_Notices
|
||
|
*/
|
||
|
private $_notices;
|
||
|
|
||
|
#--------------------------------------------------------------------------------
|
||
|
#region Singleton
|
||
|
#--------------------------------------------------------------------------------
|
||
|
|
||
|
/**
|
||
|
* @var FS_GDPR_Manager
|
||
|
*/
|
||
|
private static $_instance;
|
||
|
|
||
|
/**
|
||
|
* @return FS_GDPR_Manager
|
||
|
*/
|
||
|
public static function instance() {
|
||
|
if ( ! isset( self::$_instance ) ) {
|
||
|
self::$_instance = new self();
|
||
|
}
|
||
|
|
||
|
return self::$_instance;
|
||
|
}
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
private function __construct() {
|
||
|
$this->_storage = FS_Option_Manager::get_manager( WP_FS__GDPR_OPTION_NAME, true, true );
|
||
|
$this->_wp_user_id = Freemius::get_current_wp_user_id();
|
||
|
$this->_option_name = "u{$this->_wp_user_id}";
|
||
|
$this->_data = $this->_storage->get_option( $this->_option_name, array() );
|
||
|
$this->_notices = FS_Admin_Notices::instance( 'all_admins', '', '', true );
|
||
|
|
||
|
if ( ! is_array( $this->_data ) ) {
|
||
|
$this->_data = array();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Update a GDPR option for the current admin and store it.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 2.1.0
|
||
|
*
|
||
|
* @param string $name
|
||
|
* @param mixed $value
|
||
|
*/
|
||
|
private function update_option( $name, $value ) {
|
||
|
$this->_data[ $name ] = $value;
|
||
|
|
||
|
$this->_storage->set_option( $this->_option_name, $this->_data, true );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @author Leo Fajardo (@leorw)
|
||
|
* @since 2.1.0
|
||
|
*
|
||
|
* @return bool|null
|
||
|
*/
|
||
|
public function is_required() {
|
||
|
return isset( $this->_data['required'] ) ?
|
||
|
$this->_data['required'] :
|
||
|
null;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @author Leo Fajardo (@leorw)
|
||
|
* @since 2.1.0
|
||
|
*
|
||
|
* @param bool $is_required
|
||
|
*/
|
||
|
public function store_is_required( $is_required ) {
|
||
|
$this->update_option( 'required', $is_required );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Checks if the GDPR opt-in sticky notice is currently shown.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 2.1.0
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function is_opt_in_notice_shown() {
|
||
|
return $this->_notices->has_sticky( "gdpr_optin_actions_{$this->_wp_user_id}", true );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Remove the GDPR opt-in sticky notice.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 2.1.0
|
||
|
*/
|
||
|
public function remove_opt_in_notice() {
|
||
|
$this->_notices->remove_sticky( "gdpr_optin_actions_{$this->_wp_user_id}", true );
|
||
|
|
||
|
$this->disable_opt_in_notice();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Prevents the opt-in message from being added/shown.
|
||
|
*
|
||
|
* @author Leo Fajardo (@leorw)
|
||
|
* @since 2.1.0
|
||
|
*/
|
||
|
public function disable_opt_in_notice() {
|
||
|
$this->update_option( 'show_opt_in_notice', false );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Checks if a GDPR opt-in message needs to be shown to the current admin.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 2.1.0
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function should_show_opt_in_notice() {
|
||
|
return (
|
||
|
! isset( $this->_data['show_opt_in_notice'] ) ||
|
||
|
true === $this->_data['show_opt_in_notice']
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the last time the GDPR opt-in notice was shown.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 2.1.0
|
||
|
*
|
||
|
* @return false|int
|
||
|
*/
|
||
|
public function last_time_notice_was_shown() {
|
||
|
return isset( $this->_data['notice_shown_at'] ) ?
|
||
|
$this->_data['notice_shown_at'] :
|
||
|
false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Update the timestamp of the last time the GDPR opt-in message was shown to now.
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 2.1.0
|
||
|
*/
|
||
|
public function notice_was_just_shown() {
|
||
|
$this->update_option( 'notice_shown_at', WP_FS__SCRIPT_START_TIME );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string $message
|
||
|
* @param string|null $plugin_title
|
||
|
*
|
||
|
* @author Vova Feldman (@svovaf)
|
||
|
* @since 2.1.0
|
||
|
*/
|
||
|
public function add_opt_in_sticky_notice( $message, $plugin_title = null ) {
|
||
|
$this->_notices->add_sticky(
|
||
|
$message,
|
||
|
"gdpr_optin_actions_{$this->_wp_user_id}",
|
||
|
'',
|
||
|
'promotion',
|
||
|
true,
|
||
|
$this->_wp_user_id,
|
||
|
$plugin_title,
|
||
|
true
|
||
|
);
|
||
|
}
|
||
|
}
|