init_ga4wp_events_defaults();
if (!get_option('ga4wp_event_settings')) {
$ga4wp_event_settings = $defaults;
} else {
$ga4wp_event_settings = get_option('ga4wp_event_settings');
}
?>
get_ga_property_id();
$ga4wp_dash_settings = $this->get_current_dash_settings();
if (class_exists('WooCommerce')) {
$currency_symbol = get_woocommerce_currency_symbol();
} else {
$currency_symbol = '$';
}
if (!empty($ga4wp_dash_settings['report_view'])) {
$new_api = $this->get_google_report_api();
$transient_name = $this->ga4wp_create_transient_name($ga4wp_dash_settings['report_view'], $property_id, $ga4wp_dash_settings['report_from'], $ga4wp_dash_settings['report_to'], $tab_id);
$transient_value = get_transient($transient_name);
if ($transient_value == false) {
$transient_value = $new_api->get_dashboard_data($ga4wp_dash_settings['report_view'], $ga4wp_dash_settings['report_from'], $ga4wp_dash_settings['report_to'], $tab_id);
if (isset($transient_value) && is_array($transient_value)) {
set_transient($transient_name, $transient_value, 3600);
}
}
$stats_data = $transient_value;
$array_name = 'ga4wp_report_chart_data_' . $tab_id;
$chart_data_array = GA4WP_Settings::get_instance()->$array_name;
} else {
$new_api = $this->get_google_analytics_data_api();
$transient_name = $this->ga4wp_create_transient_name(false, $property_id, $ga4wp_dash_settings['report_from'], $ga4wp_dash_settings['report_to'], $tab_id);
$transient_value = get_transient($transient_name);
if ($transient_value == false) {
$transient_value = $new_api->get_dashboard_data($ga4wp_dash_settings['report_from'], $ga4wp_dash_settings['report_to'], $tab_id);
if (isset($transient_value) && is_array($transient_value)) {
set_transient($transient_name, $transient_value, 3600);
}
}
$stats_data = $transient_value;
$array_name = 'ga4wp_report_chart_data_ga4_' . $tab_id;
$chart_data_array = GA4WP_Settings::get_instance()->$array_name;
}
$i = 0;
if(!empty($stats_data) && !empty($chart_data_array)){
foreach ($chart_data_array as $chart_name => $chart_parameters) {
if ($chart_name == 'stats') {
if (!empty($ga4wp_dash_settings['report_view'])) {
$array_name = 'ga4wp_dash_stats_data_' . $tab_id;
$stats_array = GA4WP_Settings::get_instance()->$array_name;
} else {
$array_name = 'ga4wp_dash_stats_data_ga4_' . $tab_id;
$stats_array = GA4WP_Settings::get_instance()->$array_name;
}
$this->publish_stat_data($stats_data[$i], $stats_array, $currency_symbol);
} else {
if ($chart_parameters[0] == 'bar') {
if (($chart_parameters[1] == 'Total Users on Date') || ($chart_parameters[1] == 'Overview Report')) {
echo '
';
} else {
echo '
';
}
if (is_array($stats_data[$i])) {
//$stats_data[$i] = array_reverse($stats_data[$i]);
} else {
$stats_data[$i] = array();
}
$this->publish_simple_bar_chart("chartdiv" . $i . $tab_id, $chart_parameters[1], $chart_parameters[2], $chart_parameters[3], $stats_data[$i], $chart_parameters[4]);
echo '
';
} elseif ($chart_parameters[0] == 'line') {
if (($chart_parameters[1] == 'Total Users on Date') || ($chart_parameters[1] == 'Overview Report')) {
echo '
';
} else {
echo '
';
}
if (is_array($stats_data[$i])) {
//$stats_data[$i] = array_reverse($stats_data[$i]);
} else {
$stats_data[$i] = array();
}
$this->publish_simple_line_chart("chartdiv" . $i . $tab_id, $chart_parameters[1], $chart_parameters[2], $chart_parameters[3], $stats_data[$i], $chart_parameters[4]);
echo '
';
} elseif ($chart_parameters[0] == 'doughnut') {
echo '
';
if (is_array($stats_data[$i])) {
//$stats_data[$i] = array_reverse($stats_data[$i]);
} else {
$stats_data[$i] = array();
}
$this->publish_simple_doughnut_chart("chartdiv" . $i . $tab_id, $chart_parameters[1], $stats_data[$i], $chart_parameters[4]);
echo '
';
} elseif ($chart_parameters[0] == 'table') {
echo '
';
if (is_array($stats_data[$i])) {
//$stats_data[$i] = array_reverse($stats_data[$i]);
} else {
$stats_data[$i] = array();
}
$this->publish_simple_table("chartdiv" . $i . $tab_id, $chart_parameters[1], $chart_parameters[2], $chart_parameters[3], $stats_data[$i], $chart_parameters[4]);
echo '
';
}
}
$i++;
}
}else{
echo '';
}
echo '
';
}
wp_die();
}
/* revoke google analytics access from website */
public function web_revoke_access()
{
check_ajax_referer('ga4wp-revoke-access', 'security');
$url = $this->get_access_token_revoke_url();
$response = wp_remote_get($url);
if (is_wp_error($response)) {
error_log(sprintf('Could not revoke access token: %s', json_encode($response->errors)), 0);
}
delete_option('ga4wp_access_token');
delete_option('ga4wp_dash_settings');
delete_option('ga4wp_refresh_token');
delete_option('ga4wp_auth_settings');
delete_option('ga4wp_granted_scopes');
delete_option('measurement_key');
delete_option('measurement_key_process');
delete_option('custom_dimension_process');
delete_option('dimension_key');
delete_option('ga4wp_refresh_token_fail');
delete_option('ga_properties');
wp_die();
}
/* Adding localize script */
public function load_local_script()
{
wp_register_script('ga4wp_js', GA4WP_URL . 'assests/js/ga4wp.js', array('jquery'), null, true);
wp_localize_script(
'ga4wp_js',
'ga4wp_js_object',
array(
'ajax_url' => admin_url('admin-ajax.php'),
'auth_url' => $this->get_link_url(),
'revoke_access_nonce' => wp_create_nonce('ga4wp-revoke-access'),
'un_link_nonce' => wp_create_nonce('ga4wp-un-link'),
'tab_update_nonce' => wp_create_nonce('ga4wp-tab-update'),
'current_tab_id' => get_option('ga4wp_current_tab_id', 'audience'),
)
);
wp_enqueue_script('ga4wp_js');
if (isset($_GET['page']) && ($_GET['page'] == 'ga4wp_pro_plugin_options')) {
$this->ga4wp_edit_action_scope();
}
}
/* parsing access token */
private function parse_access_token($json_token = '')
{
$token = [
'access_token' => '',
'expires_in' => 0,
'created' => current_time('timestamp', true),
];
if (is_string($json_token) && '' !== $json_token) {
$token = wp_parse_args((array) json_decode($json_token), $token);
}
return (object) $token;
}
/*get access token from database */
public function get_access_token()
{
return get_option('ga4wp_access_token', null);
}
/* get revoke url for revoking access token */
public function get_access_token_revoke_url()
{
$revoke_url = null;
$token = $this->parse_access_token($this->get_access_token())->access_token;
if (isset($token) && !empty($token)) {
$revoke_url = self::PROXY_URL . '/auth/revoke?token2=' . base64_encode($token);
}
return $revoke_url;
}
/* get linking url for linking Google Analytics and Website */
public function get_link_url()
{
return self::PROXY_URL . '/auth?callback=' . urlencode($this->get_callback_url());
}
/* get call back url for completing rest work of linking */
public function get_callback_url()
{
return get_home_url(null, 'wc-api/ga4wp-analytics/auth');
}
/* get call back url for get refreshed token */
public function get_refresh_callback_url()
{
return get_home_url(null, 'wc-api/ga4wp-analytics/refresh');
}
/* authentication function */
public function ga4wp_authenticate()
{
if (isset($_GET['access_token'])) {
if (!isset($_REQUEST['access_token']) || empty($_REQUEST['access_token'])) {
echo '';
wp_die('some error occured please try again after some time or use manual connect method');
}
$json_token = sanitize_text_field(base64_decode($_REQUEST['access_token'], true));
$token = json_decode($json_token, true);
if (!$token) {
echo '';
wp_die('some error occured please try again after some time or use manual connect method');
}
//if we receive require data from token then save value
if (isset($token['refresh_token']) && isset($token['access_token'])) {
$this->ga4wp_granted_scopes($token['scope']);
update_option('ga4wp_access_token', $json_token);
update_option('ga4wp_refresh_token', $token['refresh_token']);
}
echo '';
wp_die();
}
}
/* Save granted scopes and use later for recheck */
public function ga4wp_granted_scopes($scopes)
{
if (!empty($scopes) && (stripos($scopes, 'googleapis') !== false)) {
$scopes = explode(' ', $scopes);
update_option('ga4wp_granted_scopes', $scopes);
}
}
/* getting tracking id and account id information */
private function get_ga_property_part($key)
{
$auth_settings = get_option('ga4wp_auth_settings');
$property = $auth_settings['property_id'];
if (!$property) {
return;
}
$pieces = explode('|', $property);
if (!isset($pieces[$key])) {
return;
}
return $pieces[$key];
}
/* getting account id */
public function get_ga_account_id()
{
return $this->get_ga_property_part(0);
}
/* getting property id */
public function get_ga_property_id()
{
return $this->get_ga_property_part(1);
}
/* getting list of ga4 properties */
public function get_analytics_g4_properties()
{
$g4_account_summary = array();
if ($this->get_access_token()) {
$api = $this->get_google_management_api();
$g4_account_summary_object = $api->get_g4_account_summaries();
if (!empty($g4_account_summary_object)) {
$g4_account_summary = $g4_account_summary_object->accountSummaries;
} else {
try {
$token = $this->refresh_access_token();
} catch (Exception $e) {
error_log($e->getMessage());
$token = $this->parse_access_token();
}
}
}
return $g4_account_summary;
}
/* getting list of properties
public function get_analytics_properties()
{
$list_account_summaries = array();
if ($this->get_access_token()) {
$api = $this->get_google_management_api();
$account_summary_object = $api->get_account_summaries();
if (!empty($account_summary_object)) {
$list_account_summaries = $api->list_account_summaries($account_summary_object);
} else {
try {
$token = $this->refresh_access_token();
} catch (Exception $e) {
error_log($e->getMessage());
$token = $this->parse_access_token();
}
}
}
return $list_account_summaries;
}
/* getting list of views for property
public function get_analytics_property_views()
{
$list_property_views = array();
$account_id = $this->get_ga_account_id();
$property_id = $this->get_ga_property_id();
if ($this->get_access_token() && !empty($property_id) && (strpos($property_id, 'UA') !== false) && !empty($account_id)) {
$api = $this->get_google_management_api();
$property_view_summary = $api->get_property_views($account_id, $property_id);
$list_property_views = $api->list_views($property_view_summary);
}
return $list_property_views;
}
/* getting management api */
public function get_google_management_api()
{
require_once(GA4WP_DIR . 'inc/api/ga4wp-google-management-api.php');
$token = $this->parse_access_token($this->get_access_token());
// refresh token if it's expired
if ($this->is_access_token_expired($token)) {
try {
$token = $this->refresh_access_token();
} catch (Exception $e) {
error_log($e->getMessage());
$token = $this->parse_access_token();
}
}
return $this->management_api = new GA4WP_Google_Management_API($token->access_token);
}
/* getting report api */
public function get_google_report_api()
{
require_once(GA4WP_DIR . 'inc/api/ga4wp-google-report-api.php');
$token = $this->parse_access_token($this->get_access_token());
// refresh token if it's expired
if ($this->is_access_token_expired($token)) {
try {
$token = $this->refresh_access_token();
} catch (Exception $e) {
error_log($e->getMessage());
$token = $this->parse_access_token();
}
}
return $this->report_api = new GA4WP_Google_Report_API($token->access_token);
}
/* getting report api */
public function get_google_analytics_data_api()
{
require_once(GA4WP_DIR . 'inc/api/ga4wp-google-analytics-data-api.php');
$token = $this->parse_access_token($this->get_access_token());
// refresh token if it's expired
if ($this->is_access_token_expired($token)) {
try {
$token = $this->refresh_access_token();
} catch (Exception $e) {
error_log($e->getMessage());
$token = $this->parse_access_token();
}
}
return $this->report_api = new GA4WP_Google_Analytics_Data_API($token->access_token);
}
/* refeshing access token */
private function refresh_access_token()
{
if (!$this->get_refresh_token()) {
throw new Exception('Could not refresh access token: refresh token not available.');
}
$refresh_url = $this->get_access_token_refresh_url();
$response = wp_remote_get($refresh_url, array('timeout' => MINUTE_IN_SECONDS));
if ($response instanceof \WP_Error) {
$updated = update_option('ga4wp_access_token', false);
throw new Exception(sprintf('Could not refresh access token: %s', json_encode($response->errors)));
return false;
}
if (!$response || empty($response['body'])) {
$updated = update_option('ga4wp_access_token', false);
throw new Exception('Could not refresh access token: response was empty.');
return false;
}
if (isset($response['response']['code']) && 500 === (int) $response['response']['code']) {
$updated = update_option('ga4wp_access_token', false);
throw new Exception('Could not refresh access token: a server error occurred.');
return false;
}
// try to decode and sanitizing the token
$json_token = sanitize_text_field(base64_decode($response['body'], true));
if (!json_decode($json_token, true) || (stripos($json_token, 'error') !== false)) {
$updated = update_option('ga4wp_access_token', false);
$process_status = get_option('ga4wp_refresh_token_fail');
if (empty($process_status)) {
update_option('ga4wp_refresh_token_fail', 'retry');
} else {
update_option('ga4wp_refresh_token_fail', 'yes');
}
throw new Exception('Could not refresh access token: returned token was invalid.');
return false;
}
$updated = update_option('ga4wp_access_token', $json_token);
return $this->parse_access_token($json_token);
}
/* getting refresh token url */
public function get_access_token_refresh_url()
{
$refresh_url = null;
if ($refresh_token = $this->get_refresh_token()) {
$refresh_url = self::PROXY_URL . '/auth/refresh?token=' . base64_encode($refresh_token) . '&callback=' . urlencode($this->get_refresh_callback_url());
}
return $refresh_url;
}
/* getting refresh token */
private function get_refresh_token()
{
return get_option('ga4wp_refresh_token', null);
}
/* checking access token is expired or not */
private function is_access_token_expired($token)
{
$expired = !(is_object($token) && $token->created && $token->expires_in);
if (!$expired) {
$time_now = current_time('timestamp', true);
$time_expires = max(0, (int) $token->created + (int) $token->expires_in);
$expired = $time_expires <= $time_now;
}
return $expired;
}
}