plugin updates
This commit is contained in:
@@ -1 +0,0 @@
|
||||
[ID*="-optin-notice"]{padding:1px 12px;border-right-color:#007cba}[ID*="-optin-notice"] .notice-container{padding-top:10px;padding-bottom:12px}[ID*="-optin-notice"] .notice-content{margin:0}[ID*="-optin-notice"] .notice-heading{padding:0 0 12px 20px}[ID*="-optin-notice"] .button-primary{margin-left:5px}
|
||||
@@ -1 +0,0 @@
|
||||
[ID*="-optin-notice"]{padding:1px 12px;border-left-color:#007cba}[ID*="-optin-notice"] .notice-container{padding-top:10px;padding-bottom:12px}[ID*="-optin-notice"] .notice-content{margin:0}[ID*="-optin-notice"] .notice-heading{padding:0 20px 12px 0}[ID*="-optin-notice"] .button-primary{margin-right:5px}
|
||||
@@ -1,21 +0,0 @@
|
||||
[ID*="-optin-notice"] {
|
||||
padding: 1px 12px;
|
||||
border-right-color: #007cba;
|
||||
}
|
||||
|
||||
[ID*="-optin-notice"] .notice-container {
|
||||
padding-top: 10px;
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
|
||||
[ID*="-optin-notice"] .notice-content {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
[ID*="-optin-notice"] .notice-heading {
|
||||
padding: 0 0 12px 20px;
|
||||
}
|
||||
|
||||
[ID*="-optin-notice"] .button-primary {
|
||||
margin-left: 5px;
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
[ID*="-optin-notice"] {
|
||||
padding: 1px 12px;
|
||||
border-left-color: #007cba;
|
||||
}
|
||||
|
||||
[ID*="-optin-notice"] .notice-container {
|
||||
padding-top: 10px;
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
|
||||
[ID*="-optin-notice"] .notice-content {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
[ID*="-optin-notice"] .notice-heading {
|
||||
padding: 0 20px 12px 0;
|
||||
}
|
||||
|
||||
[ID*="-optin-notice"] .button-primary {
|
||||
margin-right: 5px;
|
||||
}
|
||||
@@ -1,118 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* BSF analytics loader file.
|
||||
*
|
||||
* @version 1.0.0
|
||||
*
|
||||
* @package bsf-analytics
|
||||
*/
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Class BSF_Analytics_Loader.
|
||||
*/
|
||||
class BSF_Analytics_Loader {
|
||||
|
||||
/**
|
||||
* Analytics Entities.
|
||||
*
|
||||
* @access private
|
||||
* @var array Entities array.
|
||||
*/
|
||||
private $entities = array();
|
||||
|
||||
/**
|
||||
* Analytics Version.
|
||||
*
|
||||
* @access private
|
||||
* @var float analytics version.
|
||||
*/
|
||||
private $analytics_version = '';
|
||||
|
||||
/**
|
||||
* Analytics path.
|
||||
*
|
||||
* @access private
|
||||
* @var string path array.
|
||||
*/
|
||||
private $analytics_path = '';
|
||||
|
||||
/**
|
||||
* Instance
|
||||
*
|
||||
* @access private
|
||||
* @var object Class object.
|
||||
*/
|
||||
private static $instance = null;
|
||||
|
||||
/**
|
||||
* Get instace of class.
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
public static function get_instance() {
|
||||
if ( null === self::$instance ) {
|
||||
self::$instance = new self();
|
||||
}
|
||||
|
||||
return self::$instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct() {
|
||||
add_action( 'init', array( $this, 'load_analytics' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set entity for analytics.
|
||||
*
|
||||
* @param string $data Entity attributes data.
|
||||
* @return void
|
||||
*/
|
||||
public function set_entity( $data ) {
|
||||
array_push( $this->entities, $data );
|
||||
}
|
||||
|
||||
/**
|
||||
* Load Analytics library.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function load_analytics() {
|
||||
$unique_entities = array();
|
||||
|
||||
if ( ! empty( $this->entities ) ) {
|
||||
foreach ( $this->entities as $entity ) {
|
||||
foreach ( $entity as $key => $data ) {
|
||||
|
||||
if ( isset( $data['path'] ) ) {
|
||||
if ( file_exists( $data['path'] . '/version.json' ) ) {
|
||||
$file_contents = file_get_contents( $data['path'] . '/version.json' ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
|
||||
$analytics_version = json_decode( $file_contents, 1 );
|
||||
$analytics_version = $analytics_version['bsf-analytics-ver'];
|
||||
|
||||
if ( version_compare( $analytics_version, $this->analytics_version, '>' ) ) {
|
||||
$this->analytics_version = $analytics_version;
|
||||
$this->analytics_path = $data['path'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! isset( $unique_entities[ $key ] ) ) {
|
||||
$unique_entities[ $key ] = $data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( file_exists( $this->analytics_path ) && ! class_exists( 'BSF_Analytics' ) ) {
|
||||
require_once $this->analytics_path . '/class-bsf-analytics.php';
|
||||
new BSF_Analytics( $unique_entities, $this->analytics_path, $this->analytics_version );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,258 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* BSF analytics stat class file.
|
||||
*
|
||||
* @package bsf-analytics
|
||||
*/
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
if ( ! class_exists( 'BSF_Analytics_Stats' ) ) {
|
||||
/**
|
||||
* BSF analytics stat class.
|
||||
*/
|
||||
class BSF_Analytics_Stats {
|
||||
|
||||
/**
|
||||
* Active plugins.
|
||||
*
|
||||
* Holds the sites active plugins list.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $plugins;
|
||||
|
||||
/**
|
||||
* Instance of BSF_Analytics_Stats.
|
||||
*
|
||||
* Holds only the first object of class.
|
||||
*
|
||||
* @var object
|
||||
*/
|
||||
private static $instance = null;
|
||||
|
||||
/**
|
||||
* Create only once instance of a class.
|
||||
*
|
||||
* @return object
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public static function instance() {
|
||||
if ( null === self::$instance ) {
|
||||
self::$instance = new self();
|
||||
}
|
||||
|
||||
return self::$instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get stats.
|
||||
*
|
||||
* @return array stats data.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function get_stats() {
|
||||
return apply_filters( 'bsf_core_stats', $this->get_default_stats() );
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve stats for site.
|
||||
*
|
||||
* @return array stats data.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
private function get_default_stats() {
|
||||
return array(
|
||||
'graupi_version' => defined( 'BSF_UPDATER_VERSION' ) ? BSF_UPDATER_VERSION : false,
|
||||
'domain_name' => get_site_url(),
|
||||
'php_os' => PHP_OS,
|
||||
'server_software' => isset( $_SERVER['SERVER_SOFTWARE'] ) ? sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) ) : '',
|
||||
'mysql_version' => $this->get_mysql_version(),
|
||||
'php_version' => $this->get_php_version(),
|
||||
'php_max_input_vars' => ini_get( 'max_input_vars' ), // phpcs:ignore:PHPCompatibility.IniDirectives.NewIniDirectives.max_input_varsFound
|
||||
'php_post_max_size' => ini_get( 'post_max_size' ),
|
||||
'php_max_execution_time' => ini_get( 'max_execution_time' ),
|
||||
'php_memory_limit' => ini_get( 'memory_limit' ),
|
||||
'zip_installed' => extension_loaded( 'zip' ),
|
||||
'imagick_availabile' => extension_loaded( 'imagick' ),
|
||||
'xmlreader_exists' => class_exists( 'XMLReader' ),
|
||||
'gd_available' => extension_loaded( 'gd' ),
|
||||
'curl_version' => $this->get_curl_version(),
|
||||
'curl_ssl_version' => $this->get_curl_ssl_version(),
|
||||
'is_writable' => $this->is_content_writable(),
|
||||
|
||||
'wp_version' => get_bloginfo( 'version' ),
|
||||
'user_count' => $this->get_user_count(),
|
||||
'posts_count' => wp_count_posts()->publish,
|
||||
'page_count' => wp_count_posts( 'page' )->publish,
|
||||
'site_language' => get_locale(),
|
||||
'timezone' => wp_timezone_string(),
|
||||
'is_ssl' => is_ssl(),
|
||||
'is_multisite' => is_multisite(),
|
||||
'network_url' => network_site_url(),
|
||||
'external_object_cache' => (bool) wp_using_ext_object_cache(),
|
||||
'wp_debug' => WP_DEBUG,
|
||||
'wp_debug_display' => WP_DEBUG_DISPLAY,
|
||||
'script_debug' => SCRIPT_DEBUG,
|
||||
|
||||
'active_plugins' => $this->get_active_plugins(),
|
||||
|
||||
'active_theme' => get_template(),
|
||||
'active_stylesheet' => get_stylesheet(),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get installed PHP version.
|
||||
*
|
||||
* @return float PHP version.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
private function get_php_version() {
|
||||
if ( defined( 'PHP_MAJOR_VERSION' ) && defined( 'PHP_MINOR_VERSION' ) && defined( 'PHP_RELEASE_VERSION' ) ) { // phpcs:ignore
|
||||
return PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION . '.' . PHP_RELEASE_VERSION;
|
||||
}
|
||||
|
||||
return phpversion();
|
||||
}
|
||||
|
||||
/**
|
||||
* User count on site.
|
||||
*
|
||||
* @return int User count.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
private function get_user_count() {
|
||||
if ( is_multisite() ) {
|
||||
$user_count = get_user_count();
|
||||
} else {
|
||||
$count = count_users();
|
||||
$user_count = $count['total_users'];
|
||||
}
|
||||
|
||||
return $user_count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get active plugin's data.
|
||||
*
|
||||
* @return array active plugin's list.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
private function get_active_plugins() {
|
||||
if ( ! $this->plugins ) {
|
||||
// Ensure get_plugin_data function is loaded.
|
||||
if ( ! function_exists( 'get_plugin_data' ) ) {
|
||||
require_once ABSPATH . 'wp-admin/includes/plugin.php';
|
||||
}
|
||||
|
||||
$plugins = wp_get_active_and_valid_plugins();
|
||||
$plugins = array_map( 'get_plugin_data', $plugins );
|
||||
$this->plugins = array_map( array( $this, 'format_plugin' ), $plugins );
|
||||
}
|
||||
|
||||
return $this->plugins;
|
||||
}
|
||||
|
||||
/**
|
||||
* Format plugin data.
|
||||
*
|
||||
* @param string $plugin plugin.
|
||||
* @return array formatted plugin data.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function format_plugin( $plugin ) {
|
||||
return array(
|
||||
'name' => html_entity_decode( $plugin['Name'], ENT_COMPAT, 'UTF-8' ),
|
||||
'url' => $plugin['PluginURI'],
|
||||
'version' => $plugin['Version'],
|
||||
'slug' => $plugin['TextDomain'],
|
||||
'author_name' => html_entity_decode( wp_strip_all_tags( $plugin['Author'] ), ENT_COMPAT, 'UTF-8' ),
|
||||
'author_url' => $plugin['AuthorURI'],
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Curl SSL version.
|
||||
*
|
||||
* @return float SSL version.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
private function get_curl_ssl_version() {
|
||||
$curl = array();
|
||||
if ( function_exists( 'curl_version' ) ) {
|
||||
$curl = curl_version(); // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_version
|
||||
}
|
||||
|
||||
return isset( $curl['ssl_version'] ) ? $curl['ssl_version'] : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get cURL version.
|
||||
*
|
||||
* @return float cURL version.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
private function get_curl_version() {
|
||||
if ( function_exists( 'curl_version' ) ) {
|
||||
$curl = curl_version(); // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_version
|
||||
}
|
||||
|
||||
return isset( $curl['version'] ) ? $curl['version'] : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get MySQL version.
|
||||
*
|
||||
* @return float MySQL version.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
private function get_mysql_version() {
|
||||
global $wpdb;
|
||||
return $wpdb->db_version();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if content directory is writable.
|
||||
*
|
||||
* @return bool
|
||||
* @since 1.0.0
|
||||
*/
|
||||
private function is_content_writable() {
|
||||
$upload_dir = wp_upload_dir();
|
||||
return wp_is_writable( $upload_dir['basedir'] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Polyfill for sites using WP version less than 5.3
|
||||
*/
|
||||
if ( ! function_exists( 'wp_timezone_string' ) ) {
|
||||
/**
|
||||
* Get timezone string.
|
||||
*
|
||||
* @return string timezone string.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
function wp_timezone_string() {
|
||||
$timezone_string = get_option( 'timezone_string' );
|
||||
|
||||
if ( $timezone_string ) {
|
||||
return $timezone_string;
|
||||
}
|
||||
|
||||
$offset = (float) get_option( 'gmt_offset' );
|
||||
$hours = (int) $offset;
|
||||
$minutes = ( $offset - $hours );
|
||||
|
||||
$sign = ( $offset < 0 ) ? '-' : '+';
|
||||
$abs_hour = abs( $hours );
|
||||
$abs_mins = abs( $minutes * 60 );
|
||||
$tz_offset = sprintf( '%s%02d:%02d', $sign, $abs_hour, $abs_mins );
|
||||
|
||||
return $tz_offset;
|
||||
}
|
||||
}
|
||||
@@ -1,514 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* BSF analytics class file.
|
||||
*
|
||||
* @version 1.0.0
|
||||
*
|
||||
* @package bsf-analytics
|
||||
*/
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
if ( ! class_exists( 'BSF_Analytics' ) ) {
|
||||
|
||||
/**
|
||||
* BSF analytics
|
||||
*/
|
||||
class BSF_Analytics {
|
||||
|
||||
/**
|
||||
* Member Variable
|
||||
*
|
||||
* @var array Entities data.
|
||||
*/
|
||||
private $entities;
|
||||
|
||||
/**
|
||||
* Member Variable
|
||||
*
|
||||
* @var string Usage tracking document URL
|
||||
*/
|
||||
public $usage_doc_link = 'https://store.brainstormforce.com/usage-tracking/?utm_source=wp_dashboard&utm_medium=general_settings&utm_campaign=usage_tracking';
|
||||
|
||||
/**
|
||||
* Setup actions, load files.
|
||||
*
|
||||
* @param array $args entity data for analytics.
|
||||
* @param string $analytics_path directory path to analytics library.
|
||||
* @param float $analytics_version analytics library version.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function __construct( $args, $analytics_path, $analytics_version ) {
|
||||
|
||||
// Bail when no analytics entities are registered.
|
||||
if ( empty( $args ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->entities = $args;
|
||||
|
||||
define( 'BSF_ANALYTICS_VERSION', $analytics_version );
|
||||
define( 'BSF_ANALYTICS_URI', $this->get_analytics_url( $analytics_path ) );
|
||||
|
||||
add_action( 'admin_init', array( $this, 'handle_optin_optout' ) );
|
||||
add_action( 'admin_init', array( $this, 'option_notice' ) );
|
||||
add_action( 'init', array( $this, 'maybe_track_analytics' ), 99 );
|
||||
|
||||
$this->set_actions();
|
||||
|
||||
add_action( 'admin_init', array( $this, 'register_usage_tracking_setting' ) );
|
||||
|
||||
$this->includes();
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup actions for admin notice style and analytics cron event.
|
||||
*
|
||||
* @since 1.0.4
|
||||
*/
|
||||
public function set_actions() {
|
||||
|
||||
foreach ( $this->entities as $key => $data ) {
|
||||
add_action( 'astra_notice_before_markup_' . $key . '-optin-notice', array( $this, 'enqueue_assets' ) );
|
||||
add_action( 'update_option_' . $key . '_analytics_optin', array( $this, 'update_analytics_option_callback' ), 10, 3 );
|
||||
add_action( 'add_option_' . $key . '_analytics_optin', array( $this, 'add_analytics_option_callback' ), 10, 2 );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* BSF Analytics URL
|
||||
*
|
||||
* @param string $analytics_path directory path to analytics library.
|
||||
* @return String URL of bsf-analytics directory.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function get_analytics_url( $analytics_path ) {
|
||||
|
||||
$content_dir_path = wp_normalize_path( WP_CONTENT_DIR );
|
||||
|
||||
$analytics_path = wp_normalize_path( $analytics_path );
|
||||
|
||||
return str_replace( $content_dir_path, content_url(), $analytics_path );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get API URL for sending analytics.
|
||||
*
|
||||
* @return string API URL.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
private function get_api_url() {
|
||||
return defined( 'BSF_API_URL' ) ? BSF_API_URL : 'https://support.brainstormforce.com/';
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueue Scripts.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @return void
|
||||
*/
|
||||
public function enqueue_assets() {
|
||||
|
||||
/**
|
||||
* Load unminified if SCRIPT_DEBUG is true.
|
||||
*
|
||||
* Directory and Extensions.
|
||||
*/
|
||||
$dir_name = ( SCRIPT_DEBUG ) ? 'unminified' : 'minified';
|
||||
$file_rtl = ( is_rtl() ) ? '-rtl' : '';
|
||||
$css_ext = ( SCRIPT_DEBUG ) ? '.css' : '.min.css';
|
||||
|
||||
$css_uri = BSF_ANALYTICS_URI . '/assets/css/' . $dir_name . '/style' . $file_rtl . $css_ext;
|
||||
|
||||
wp_enqueue_style( 'bsf-analytics-admin-style', $css_uri, false, BSF_ANALYTICS_VERSION, 'all' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Send analytics API call.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function send() {
|
||||
wp_remote_post(
|
||||
$this->get_api_url() . 'wp-json/bsf-core/v1/analytics/',
|
||||
array(
|
||||
'body' => BSF_Analytics_Stats::instance()->get_stats(),
|
||||
'timeout' => 5,
|
||||
'blocking' => false,
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if usage tracking is enabled.
|
||||
*
|
||||
* @return bool
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function is_tracking_enabled() {
|
||||
|
||||
foreach ( $this->entities as $key => $data ) {
|
||||
|
||||
$is_enabled = get_site_option( $key . '_analytics_optin' ) === 'yes' ? true : false;
|
||||
$is_enabled = $this->is_white_label_enabled( $key ) ? false : $is_enabled;
|
||||
|
||||
if ( apply_filters( $key . '_tracking_enabled', $is_enabled ) ) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if WHITE label is enabled for BSF products.
|
||||
*
|
||||
* @param string $source source of analytics.
|
||||
* @return bool
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function is_white_label_enabled( $source ) {
|
||||
|
||||
$options = apply_filters( $source . '_white_label_options', array() );
|
||||
$is_enabled = false;
|
||||
|
||||
if ( is_array( $options ) ) {
|
||||
foreach ( $options as $option ) {
|
||||
if ( true === $option ) {
|
||||
$is_enabled = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $is_enabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Display admin notice for usage tracking.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function option_notice() {
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
foreach ( $this->entities as $key => $data ) {
|
||||
|
||||
$time_to_display = isset( $data['time_to_display'] ) ? $data['time_to_display'] : '+24 hours';
|
||||
$usage_doc_link = isset( $data['usage_doc_link'] ) ? $data['usage_doc_link'] : $this->usage_doc_link;
|
||||
|
||||
// Don't display the notice if tracking is disabled or White Label is enabled for any of our plugins.
|
||||
if ( false !== get_site_option( $key . '_analytics_optin', false ) || $this->is_white_label_enabled( $key ) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Show tracker consent notice after 24 hours from installed time.
|
||||
if ( strtotime( $time_to_display, $this->get_analytics_install_time( $key ) ) > time() ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* translators: %s product name */
|
||||
$notice_string = __( 'Want to help make <strong>%1s</strong> even more awesome? Allow us to collect non-sensitive diagnostic data and usage information. ', 'wp-schema-pro' );
|
||||
|
||||
if ( is_multisite() ) {
|
||||
$notice_string .= __( 'This will be applicable for all sites from the network.', 'wp-schema-pro' );
|
||||
}
|
||||
|
||||
$language_dir = is_rtl() ? 'rtl' : 'ltr';
|
||||
|
||||
Astra_Notices::add_notice(
|
||||
array(
|
||||
'id' => $key . '-optin-notice',
|
||||
'type' => '',
|
||||
'message' => sprintf(
|
||||
'<div class="notice-content">
|
||||
<div class="notice-heading">
|
||||
%1$s
|
||||
</div>
|
||||
<div class="astra-notices-container">
|
||||
<a href="%2$s" class="astra-notices button-primary">
|
||||
%3$s
|
||||
</a>
|
||||
<a href="%4$s" data-repeat-notice-after="%5$s" class="astra-notices button-secondary">
|
||||
%6$s
|
||||
</a>
|
||||
</div>
|
||||
</div>',
|
||||
/* translators: %s usage doc link */
|
||||
sprintf( $notice_string . '<span dir="%2s"><a href="%3s" target="_blank" rel="noreferrer noopener">%4s</a><span>', esc_html( $data['product_name'] ), $language_dir, esc_url( $usage_doc_link ), __( ' Know More.', 'wp-schema-pro' ) ),
|
||||
esc_url(
|
||||
add_query_arg(
|
||||
array(
|
||||
$key . '_analytics_optin' => 'yes',
|
||||
$key . '_analytics_nonce' => wp_create_nonce( $key . '_analytics_optin' ),
|
||||
'bsf_analytics_source' => $key,
|
||||
)
|
||||
)
|
||||
),
|
||||
__( 'Yes! Allow it', 'wp-schema-pro' ),
|
||||
esc_url(
|
||||
add_query_arg(
|
||||
array(
|
||||
$key . '_analytics_optin' => 'no',
|
||||
$key . '_analytics_nonce' => wp_create_nonce( $key . '_analytics_optin' ),
|
||||
'bsf_analytics_source' => $key,
|
||||
)
|
||||
)
|
||||
),
|
||||
MONTH_IN_SECONDS,
|
||||
__( 'No Thanks', 'wp-schema-pro' )
|
||||
),
|
||||
'show_if' => true,
|
||||
'repeat-notice-after' => false,
|
||||
'priority' => 18,
|
||||
'display-with-other-notices' => true,
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Process usage tracking opt out.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function handle_optin_optout() {
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$source = isset( $_GET['bsf_analytics_source'] ) ? sanitize_text_field( wp_unslash( $_GET['bsf_analytics_source'] ) ) : '';
|
||||
|
||||
if ( ! isset( $_GET[ $source . '_analytics_nonce' ] ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET[ $source . '_analytics_nonce' ] ) ), $source . '_analytics_optin' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$optin_status = isset( $_GET[ $source . '_analytics_optin' ] ) ? sanitize_text_field( wp_unslash( $_GET[ $source . '_analytics_optin' ] ) ) : '';
|
||||
|
||||
if ( 'yes' === $optin_status ) {
|
||||
$this->optin( $source );
|
||||
} elseif ( 'no' === $optin_status ) {
|
||||
$this->optout( $source );
|
||||
}
|
||||
|
||||
wp_safe_redirect(
|
||||
esc_url_raw(
|
||||
remove_query_arg(
|
||||
array(
|
||||
$source . '_analytics_optin',
|
||||
$source . '_analytics_nonce',
|
||||
'bsf_analytics_source',
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Opt in to usage tracking.
|
||||
*
|
||||
* @param string $source source of analytics.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
private function optin( $source ) {
|
||||
update_site_option( $source . '_analytics_optin', 'yes' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Opt out to usage tracking.
|
||||
*
|
||||
* @param string $source source of analytics.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
private function optout( $source ) {
|
||||
update_site_option( $source . '_analytics_optin', 'no' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Load analytics stat class.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
private function includes() {
|
||||
require_once __DIR__ . '/class-bsf-analytics-stats.php';
|
||||
}
|
||||
|
||||
/**
|
||||
* Register usage tracking option in General settings page.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function register_usage_tracking_setting() {
|
||||
|
||||
foreach ( $this->entities as $key => $data ) {
|
||||
|
||||
if ( ! apply_filters( $key . '_tracking_enabled', true ) || $this->is_white_label_enabled( $key ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$usage_doc_link = isset( $data['usage_doc_link'] ) ? $data['usage_doc_link'] : $this->usage_doc_link;
|
||||
$author = isset( $data['author'] ) ? $data['author'] : 'Brainstorm Force';
|
||||
|
||||
register_setting(
|
||||
'general', // Options group.
|
||||
$key . '_analytics_optin', // Option name/database.
|
||||
array( 'sanitize_callback' => array( $this, 'sanitize_option' ) ) // sanitize callback function.
|
||||
);
|
||||
|
||||
add_settings_field(
|
||||
$key . '-analytics-optin', // Field ID.
|
||||
__( 'Usage Tracking', 'wp-schema-pro' ), // Field title.
|
||||
array( $this, 'render_settings_field_html' ), // Field callback function.
|
||||
'general',
|
||||
'default', // Settings page slug.
|
||||
array(
|
||||
'type' => 'checkbox',
|
||||
'title' => $author,
|
||||
'name' => $key . '_analytics_optin',
|
||||
'label_for' => $key . '-analytics-optin',
|
||||
'id' => $key . '-analytics-optin',
|
||||
'usage_doc_link' => $usage_doc_link,
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sanitize Callback Function
|
||||
*
|
||||
* @param bool $input Option value.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function sanitize_option( $input ) {
|
||||
|
||||
if ( ! $input || 'no' === $input ) {
|
||||
return 'no';
|
||||
}
|
||||
|
||||
return 'yes';
|
||||
}
|
||||
|
||||
/**
|
||||
* Print settings field HTML.
|
||||
*
|
||||
* @param array $args arguments to field.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function render_settings_field_html( $args ) {
|
||||
?>
|
||||
<fieldset>
|
||||
<label for="<?php echo esc_attr( $args['label_for'] ); ?>">
|
||||
<input id="<?php echo esc_attr( $args['id'] ); ?>" type="checkbox" value="1" name="<?php echo esc_attr( $args['name'] ); ?>" <?php checked( get_site_option( $args['name'], 'no' ), 'yes' ); ?>>
|
||||
<?php
|
||||
/* translators: %s Product title */
|
||||
echo esc_html( sprintf( __( 'Allow %s products to track non-sensitive usage tracking data.', 'wp-schema-pro' ), $args['title'] ) );// phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralText
|
||||
|
||||
if ( is_multisite() ) {
|
||||
esc_html_e( ' This will be applicable for all sites from the network.', 'wp-schema-pro' );
|
||||
}
|
||||
?>
|
||||
</label>
|
||||
<?php
|
||||
echo wp_kses_post( sprintf( '<a href="%1s" target="_blank" rel="noreferrer noopener">%2s</a>', esc_url( $args['usage_doc_link'] ), __( 'Learn More.', 'wp-schema-pro' ) ) );
|
||||
?>
|
||||
</fieldset>
|
||||
<?php
|
||||
}
|
||||
|
||||
/**
|
||||
* Set analytics installed time in option.
|
||||
*
|
||||
* @param string $source source of analytics.
|
||||
* @return string $time analytics installed time.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
private function get_analytics_install_time( $source ) {
|
||||
|
||||
$time = get_site_option( $source . '_analytics_installed_time' );
|
||||
|
||||
if ( ! $time ) {
|
||||
$time = time();
|
||||
update_site_option( $source . '_analytics_installed_time', time() );
|
||||
}
|
||||
|
||||
return $time;
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule/unschedule cron event on updation of option.
|
||||
*
|
||||
* @param string $old_value old value of option.
|
||||
* @param string $value value of option.
|
||||
* @param string $option Option name.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function update_analytics_option_callback( $old_value, $value, $option ) {
|
||||
if ( is_multisite() ) {
|
||||
$this->add_option_to_network( $option, $value );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Analytics option add callback.
|
||||
*
|
||||
* @param string $option Option name.
|
||||
* @param string $value value of option.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function add_analytics_option_callback( $option, $value ) {
|
||||
if ( is_multisite() ) {
|
||||
$this->add_option_to_network( $option, $value );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send analaytics track event if tracking is enabled.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function maybe_track_analytics() {
|
||||
|
||||
if ( ! $this->is_tracking_enabled() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$analytics_track = get_site_transient( 'bsf_analytics_track' );
|
||||
|
||||
// If the last data sent is 2 days old i.e. transient is expired.
|
||||
if ( ! $analytics_track ) {
|
||||
$this->send();
|
||||
set_site_transient( 'bsf_analytics_track', true, 2 * DAY_IN_SECONDS );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Save analytics option to network.
|
||||
*
|
||||
* @param string $option name of option.
|
||||
* @param string $value value of option.
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function add_option_to_network( $option, $value ) {
|
||||
|
||||
// If action coming from general settings page.
|
||||
if ( isset( $_POST['option_page'] ) && 'general' === $_POST['option_page'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
|
||||
|
||||
if ( get_site_option( $option ) ) {
|
||||
update_site_option( $option, $value );
|
||||
} else {
|
||||
add_site_option( $option, $value );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"bsf-analytics-ver": "1.1.3"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user