2017-08-08 12:06:05 +02:00
< ? php
/**
* Tracking functions for reporting plugin usage to the Ninja Forms site for users that have opted in
*
* @ package Ninja Forms
* @ subpackage Admin
* @ copyright Copyright ( c ) 2016 , The WP Ninjas
* @ license http :// opensource . org / licenses / gpl - 2.0 . php GNU Public License
* @ since 2.9 . 52
*/
// Exit if accessed directly
if ( ! defined ( 'ABSPATH' ) ) exit ;
/**
* Class NF_Tracking
*/
final class NF_Tracking
{
const OPT_IN = 1 ;
const OPT_OUT = 0 ;
const FLAG = 'ninja_forms_opt_in' ;
/**
* NF_Tracking constructor .
*/
public function __construct ()
{
if ( isset ( $_GET [ self :: FLAG ] ) ){
add_action ( 'admin_init' , array ( $this , 'maybe_opt_in' ) );
}
2017-12-11 16:34:19 +01:00
// Temporary: Report previously opted-in users that were not already reported. @todo Remove after a couple of versions.
add_action ( 'admin_init' , array ( $this , 'report_optin' ) );
2017-08-08 12:06:05 +02:00
add_filter ( 'nf_admin_notices' , array ( $this , 'admin_notice' ) );
2017-12-11 16:34:19 +01:00
add_filter ( 'ninja_forms_check_setting_allow_tracking' , array ( $this , 'check_setting' ) );
add_filter ( 'ninja_forms_update_setting_allow_tracking' , array ( $this , 'update_setting' ) );
2017-08-08 12:06:05 +02:00
}
/**
* Check if an opt in / out action should be performed .
*
* @ access public
* @ hook admin_init
*/
public function maybe_opt_in ()
{
if ( $this -> can_opt_in () ) {
$opt_in_action = htmlspecialchars ( $_GET [ self :: FLAG ] );
if ( self :: OPT_IN == $opt_in_action ){
$this -> opt_in ();
}
if ( self :: OPT_OUT == $opt_in_action ){
$this -> opt_out ();
}
}
header ( 'Location: ' . admin_url ( 'admin.php?page=ninja-forms' ) );
}
2017-12-11 16:34:19 +01:00
/**
* Report that a user has opted - in .
*
* @ param array $data Dispatch event data .
*/
function report_optin ( $data = array () )
{
// Only send initial opt-in.
if ( get_option ( 'ninja_forms_optin_reported' , 0 ) ) return ;
$data = wp_parse_args ( $data , array (
'send_email' => 1 // "Send Email" by default, if not specified (legacy).
) );
Ninja_Forms () -> dispatcher () -> send ( 'optin' , $data );
Ninja_Forms () -> dispatcher () -> update_environment_vars ();
// Debounce opt-in dispatch.
update_option ( 'ninja_forms_optin_reported' , 1 );
}
2017-08-08 12:06:05 +02:00
/**
* Register the Admin Notice for asking users to opt in to tracking
*
* @ access public
* @ hook nf_admin_notices
* @ param array $notices
* @ return array $notices
*/
public function admin_notice ( $notices )
{
// Check if the user is allowed to opt in.
if ( ! $this -> can_opt_in () ) return $notices ;
// Check if the user is already opted in/out.
if ( $this -> is_opted_in () || $this -> is_opted_out () ) return $notices ;
$notices [ 'allow_tracking' ] = array (
'title' => __ ( 'Please help us improve Ninja Forms!' , 'ninja-forms' ),
2017-12-11 16:34:19 +01:00
'msg' => '
If you agree , we will collect some server data and information about how you use Ninja Forms .
< em > No submission data will be collected .</ em >
This data will help us troubleshoot errors and improve your Ninja Forms experience .
< p >
< input id = " nf-optin-send-email " type = " checkbox " checked = " checked " > You can also occasionally send me an email about using Ninja Forms .
</ p > ' ,
2017-08-08 12:06:05 +02:00
'link' => implode ( ' ' , array (
2017-12-11 16:34:19 +01:00
sprintf ( __ ( '%sYes, I want to make Ninja Forms better!%s' , 'ninja-forms' ), '<a href="' . $this -> get_opt_in_url ( admin_url ( 'admin.php?page=ninja-forms' ) ) . '" class="button-primary" id="ninja-forms-improve">' , '</a>' ),
sprintf ( __ ( '%sNo, please don\'t collect errors or other data.%s' , 'ninja-forms' ), '<a href="' . $this -> get_opt_out_url ( admin_url ( 'admin.php?page=ninja-forms' ) ) . '" class="button-secondary" id="ninja-forms-do-not-improve">' , '</a>' ),
2017-08-08 12:06:05 +02:00
)),
'int' => 0 , // No delay
'blacklist' => array (
'ninja-forms-three'
)
);
2017-12-11 16:34:19 +01:00
echo " <script type='text/javascript'>
jQuery ( document ) . ready ( function ( $ ) {
jQuery ( '#ninja-forms-improve' ) . click ( function ( e ) {
e . preventDefault ();
var send_email , url ;
if ( jQuery ( '#nf-optin-send-email' ) . attr ( 'checked' ) ) {
send_email = 1 ;
} else {
send_email = 0 ;
}
url = jQuery ( e . target ) . attr ( 'href' );
window . location . href = url + '&send_email=' + send_email ;
} );
} );
</ script > " ;
2017-08-08 12:06:05 +02:00
return $notices ;
}
/**
* Check if the current user is allowed to opt in on behalf of a site
*
* @ return bool
*/
private function can_opt_in ()
{
return current_user_can ( apply_filters ( 'ninja_forms_admin_opt_in_capabilities' , 'manage_options' ) );
}
/**
* Check if a site is opted in
*
* @ access public
* @ return bool
*/
public function is_opted_in ()
{
return ( bool ) get_option ( 'ninja_forms_allow_tracking' , $this -> is_freemius_opted_in () );
}
private function is_freemius_opted_in ()
{
$freemius = get_option ( 'fs_accounts' );
if ( ! $freemius ) return false ;
if ( ! isset ( $freemius [ 'plugin_data' ] ) ) return false ;
if ( ! isset ( $freemius [ 'plugin_data' ][ 'ninja-forms' ] ) ) return false ;
if ( ! isset ( $freemius [ 'plugin_data' ][ 'ninja-forms' ][ 'activation_timestamp' ] ) ) return false ;
return true ;
}
/**
* Opt In a site for tracking
*
* @ access private
* @ return null
*/
public function opt_in ()
{
2017-12-11 16:34:19 +01:00
if ( $this -> is_opted_in () ) return ;
/**
* Update our tracking options .
*/
2017-08-08 12:06:05 +02:00
update_option ( 'ninja_forms_allow_tracking' , true );
2017-12-11 16:34:19 +01:00
update_option ( 'ninja_forms_do_not_allow_tracking' , false );
/**
* Send updated environment variables .
*/
Ninja_Forms () -> dispatcher () -> update_environment_vars ();
/**
* Send our optin event
*/
if ( isset ( $_REQUEST [ 'send_email' ] ) ) {
$send_email = absint ( $_REQUEST [ 'send_email' ] );
} else {
$send_email = 1 ;
}
$this -> report_optin ( array ( 'send_email' => $send_email ) );
2017-08-08 12:06:05 +02:00
}
/**
* Get the Opt In URL
*
* @ access private
* @ param string $url
* @ return string $url
*/
private function get_opt_in_url ( $url )
{
return add_query_arg ( 'ninja_forms_opt_in' , self :: OPT_IN , $url );
}
/**
* Check if a site is opted out
*
* @ access public
* @ return bool
*/
public function is_opted_out ()
{
return ( bool ) get_option ( 'ninja_forms_do_not_allow_tracking' , $this -> is_freemius_opted_out () );
}
private function is_freemius_opted_out ()
{
$freemius = get_option ( 'fs_accounts' );
if ( ! $freemius ) return false ;
if ( ! isset ( $freemius [ 'plugin_data' ] ) ) return false ;
if ( ! isset ( $freemius [ 'plugin_data' ][ 'ninja-forms' ] ) ) return false ;
if ( ! isset ( $freemius [ 'plugin_data' ][ 'ninja-forms' ][ 'is_anonymous' ] ) ) return false ;
return true ;
}
/**
* Opt Out a site from tracking
*
* @ access private
* @ return null
*/
private function opt_out ()
{
2017-12-11 16:34:19 +01:00
if ( $this -> is_opted_out () ) return ;
// Disable tracking.
update_option ( 'ninja_forms_allow_tracking' , false );
2017-08-08 12:06:05 +02:00
update_option ( 'ninja_forms_do_not_allow_tracking' , true );
2017-12-11 16:34:19 +01:00
// Clear dispatch debounce flag.
update_option ( 'ninja_forms_optin_reported' , 0 );
2017-08-08 12:06:05 +02:00
}
/**
* Get the Opt Out URL
*
* @ access private
* @ param string $url
* @ return string $url
*/
private function get_opt_out_url ( $url )
{
return add_query_arg ( 'ninja_forms_opt_in' , self :: OPT_OUT , $url );
}
2017-12-11 16:34:19 +01:00
public function check_setting ( $setting )
{
if ( $this -> is_opted_in () && ! $this -> is_opted_out () ) {
$setting [ 'value' ] = " 1 " ;
} else {
$setting [ 'value' ] = " 0 " ;
}
return $setting ;
}
public function update_setting ( $value )
{
if ( " 1 " == $value ){ // Allow Tracking
$this -> opt_in ();
} else {
$this -> opt_out ();
}
return $value ;
}
2017-08-08 12:06:05 +02:00
} // END CLASS NF_Tracking