ldc-sbv/pole-sbv-content/plugins/ninja-forms/lib/NF_Tracking.php

289 lines
8.6 KiB
PHP
Raw Normal View History

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