awca_get_mesurement_key(); } $c_process_status = get_option('custom_dimension_process'); if (stripos($c_process_status, 'completed') === false) { $this->awca_create_custom_dimension(); } } else { } } } } /* creating dashboard widget */ function awca_dashboard_widget() { global $wp_meta_boxes; if ($auth_settings = get_option('awca_auth_settings')) { $awca_refresh_token_fail = get_option('awca_refresh_token_fail'); if (isset($auth_settings['property_id']) && ($awca_refresh_token_fail != 'yes')) { $this->transient_value = $this->awca_required_dashboard_data(); $dash_data_widget = AWCA_Settings::get_instance()->awca_dash_data_ga4_widget; $i = 0; foreach ($dash_data_widget as $widget_title => $widget_data) { $i++; wp_add_dashboard_widget('awca_status_widget' . $i, $widget_title, array($this, 'awca_dashboard_help'), '', $widget_data, '', 'high'); } } } else { wp_add_dashboard_widget('awca_status_widget_6', 'AWCA Setup', array($this, 'awca_dashboard_help6')); } } function awca_required_dashboard_data() { $awca_dash_settings = $this->get_current_dash_settings(); $property_id = $this->get_ga_property_id(); $dash_end = date('Y-m-d', strtotime('-1 day')); $dash_start = date('Y-m-d', strtotime('-30 day')); $tab_id = 'dash'; if (!empty($awca_dash_settings['report_view'])) { $new_api = $this->get_google_report_api(); $transient_name = $this->awca_create_transient_name($awca_dash_settings['report_view'], $property_id, $dash_start, $dash_end, $tab_id); $transient_value = get_transient($transient_name); if ($transient_value == false) { $transient_value = $new_api->get_dashboard_data($awca_dash_settings['report_view'], $dash_start, $dash_end, $tab_id); if (isset($transient_value) && is_array($transient_value)) { set_transient($transient_name, $transient_value, 3600); } } } else { $new_api = $this->get_google_analytics_data_api(); $transient_name = $this->awca_create_transient_name(false, $property_id, $dash_start, $dash_end, $tab_id); $transient_value = get_transient($transient_name); if ($transient_value == false) { $transient_value = $new_api->get_dashboard_data($dash_start, $dash_end, $tab_id); if (isset($transient_value) && is_array($transient_value)) { set_transient($transient_name, $transient_value, 3600); } } } return $transient_value; } function awca_create_transient_name($view_id, $property_id, $start_date, $end_date, $tab_id) { if ($view_id) { $transient_name = md5(serialize(array($view_id, $property_id, $start_date, $end_date, $tab_id))); } else { $transient_name = md5(serialize(array($property_id, $start_date, $end_date, $tab_id))); } return $transient_name; } function awca_dashboard_help($var, $widget_data_array) { $widget_data = $widget_data_array['args']; if ($widget_data['1'] == 'line') { echo '
'; $this->publish_simple_line_chart('dash_chartbox_' . $widget_data['4'], $widget_data['0'], $widget_data['2'], $widget_data['3'], $this->transient_value[$widget_data['4']], $widget_data['5']); } elseif ($widget_data['1'] == 'bar') { echo '
'; $this->publish_simple_bar_chart('dash_chartbox_' . $widget_data['4'], $widget_data['0'], $widget_data['2'], $widget_data['3'], $this->transient_value[$widget_data['4']], $widget_data['5']); } elseif ($widget_data['1'] == 'doughnut') { echo '
'; $this->publish_simple_doughnut_chart('dash_chartbox_' . $widget_data['4'], $widget_data['0'], $this->transient_value[$widget_data['4']], $widget_data['5']); } elseif ($widget_data['1'] == 'stats') { $this->publish_stat_data_2($this->transient_value[$widget_data['4']]); } echo '
Data Period: Last 30 Days'; } function awca_dashboard_help6() { if (is_multisite() && is_network_admin()) { $button_url = network_admin_url('admin.php?page=awca_pro_plugin_options'); } else { $button_url = admin_url('admin.php?page=awca_pro_plugin_options'); } ?>

get_ga_account_id(); if (!empty($account_id) && (stripos($account_id, 'data') != false)) { $api = $this->get_google_management_api(); $responses = $api->get_measurement_protocall($account_id); if (!empty($responses)) { $ga4_match = false; foreach ($responses->measurementProtocolSecrets as $response) { if ($response->displayName == 'AWCA_secret_Key') { $ga4_match = true; update_option('measurement_key', $response->secretValue); update_option('measurement_key_process', 'completed'); break; } } if (!$ga4_match) { $this->awca_create_mesurement_key(); } } else { $this->awca_create_mesurement_key(); } } } /* Creating Measurement Secret Key for GA4 Property */ public function awca_create_mesurement_key() { $account_id = $this->get_ga_account_id(); if (!empty($account_id) && (stripos($account_id, 'data') != false)) { $api = $this->get_google_management_api(); $response = $api->create_measurement_protocall($account_id); if (!empty($response->secretValue)) { update_option('measurement_key', $response->secretValue); update_option('measurement_key_process', 'completed'); } else { $process_status = get_option('measurement_key_process'); if (empty($process_status)) { update_option('measurement_key_process', 'retry'); } else { update_option('measurement_key_process', 'completed_with_error'); } } } } /* Creating Custom Dimensions for GA4 Property */ public function awca_create_custom_dimension() { $account_id = $this->get_ga_account_id(); $pieces = explode('/', $account_id); $property_id = $pieces[0] . '/' . $pieces[1]; if (!empty($property_id) && (stripos($property_id, 'properties') !== false)) { $api = $this->get_google_management_api(); $response = $api->create_custom_dimensions($property_id); $custom_dimension_generated = get_option('custom_dimension_generated'); $custom_dimension_generated = (int) $custom_dimension_generated; if ($custom_dimension_generated > 1233) { update_option('custom_dimension_process', 'completed'); } else { $process_status = get_option('custom_dimension_process'); if (empty($process_status)) { update_option('custom_dimension_process', 'retry'); } else { update_option('custom_dimension_process', 'completed_with_error'); } } } } /* Update plugin settings for latest update */ public function new_update_settings() { $awca_settings = AWCA_Settings::get_instance(); $defaults_track = $awca_settings->init_awca_track_defaults(); if (!get_option('awca_track_settings')) { update_option('awca_track_settings', $defaults_track); } $defaults_event = $awca_settings->init_awca_events_defaults(); if (!get_option('awca_event_settings')) { update_option('awca_event_settings', $defaults_event); } } /* Un-link Google Analytics Account from Website */ public function web_un_link() { check_ajax_referer('awca-un-link', 'security'); if (! is_user_logged_in() || ! current_user_can('manage_options')) { wp_send_json_error(array('message' => 'Unauthorized'), 403); } delete_option('awca_access_token'); delete_option('awca_refresh_token'); delete_option('awca_auth_settings'); delete_option('awca_granted_scopes'); delete_option('measurement_key'); delete_option('measurement_key_process'); delete_option('custom_dimension_process'); delete_option('dimension_key'); delete_option('awca_refresh_token_fail'); delete_option('ga_properties'); wp_die(); } /* getting current values of settings */ public function get_current_dash_settings() { $awca_settings = AWCA_Settings::get_instance(); $awca_dash_settings = get_option('awca_dash_settings'); if (empty($awca_dash_settings)) { $awca_dash_settings = $awca_settings->init_awca_dash_defaults(); } /*$property_views = $this->get_analytics_property_views(); if (is_array($property_views) && !empty($property_views)) { if (!isset($awca_dash_settings['report_view']) || !in_array($awca_dash_settings['report_view'], $property_views)) { $awca_dash_settings['report_view'] = $property_views[0]->id; } } else { $awca_dash_settings['report_view'] = false; }*/ if ($awca_dash_settings['report_frame'] == 'Yesterday') { $awca_dash_settings['report_to'] = date('Y-m-d', strtotime('-1 day')); $awca_dash_settings['report_from'] = date('Y-m-d', strtotime('-1 day')); } elseif ($awca_dash_settings['report_frame'] == 'Last 7 days') { $awca_dash_settings['report_to'] = date('Y-m-d', strtotime('-1 day')); $awca_dash_settings['report_from'] = date('Y-m-d', strtotime('-7 day')); } elseif ($awca_dash_settings['report_frame'] == 'Current Year') { $awca_dash_settings['report_to'] = date('Y-m-d', strtotime('now')); $awca_dash_settings['report_from'] = date('Y') . '-01-01'; } elseif ($awca_dash_settings['report_frame'] == 'Custom Range') { if (isset($awca_dash_settings['report_to']) && isset($awca_dash_settings['report_from'])) { } else { $awca_dash_settings['report_to'] = date('Y-m-d', strtotime('-1 day')); $awca_dash_settings['report_from'] = date('Y-m-d', strtotime('-30 day')); } } else { $awca_dash_settings['report_to'] = date('Y-m-d', strtotime('-1 day')); $awca_dash_settings['report_from'] = date('Y-m-d', strtotime('-30 day')); } return $awca_dash_settings; } /* publishing stat data on dashboard */ public function publish_stat_data($stats_data, $stats_array, $currency_symbol) { if (is_array($stats_data) && !empty($stats_data)) { echo '
'; foreach ($stats_data as $stat_name => $stat) { $stat[0] = round($stat[0], 4); if (!empty($stats_array[$stat_name][2])) { if ($stats_array[$stat_name][3]) { if ($stats_array[$stat_name][2] == 'money') { $stat_value = $currency_symbol . $stat[0]; } else { $stat_value = $stats_array[$stat_name][2] . $stat[0]; } } else { if ($stats_array[$stat_name][2] == '100%') { $stat_value = $stat[0] * 100 . '%'; } else { $stat_value = $stat[0] . $stats_array[$stat_name][2]; } } } else { $stat_value = $stat[0]; } $comp_percentage = $this->stat_percentage_cal($stat[1], $stat[0]); $per_icon = $this->comp_icon_style_color($comp_percentage, $stats_array[$stat_name][4]); echo '
' . $stats_array[$stat_name][0] . '

' . $comp_percentage . ' %

' . $stat_value . '

' . $stats_array[$stat_name][1] . '

' . $per_icon['style'] . '
'; } echo '
'; echo '
'; } } /* publishing stat data on dashboard */ public function publish_stat_data_2($stats_data) { global $woocommerce; if (class_exists('WooCommerce')) { $currency_symbol = get_woocommerce_currency_symbol(); } else { $currency_symbol = '$'; } if (empty($currency_symbol)) { $currency_symbol = '$'; } $awca_dash_settings = $this->get_current_dash_settings(); $tab_id = 'dash'; if (!empty($awca_dash_settings['report_view'])) { $array_name = 'awca_dash_stats_data_' . $tab_id; $stats_array = AWCA_Settings::get_instance()->$array_name; } else { $array_name = 'awca_dash_stats_data_ga4_' . $tab_id; $stats_array = AWCA_Settings::get_instance()->$array_name; } if (is_array($stats_data) && !empty($stats_data)) { echo '
'; foreach ($stats_data as $stat_name => $stat) { $stat[0] = round($stat[0], 4); if (!empty($stats_array[$stat_name][2])) { if ($stats_array[$stat_name][3]) { if ($stats_array[$stat_name][2] == 'money') { $stat_value = $currency_symbol . $stat[0]; } else { $stat_value = $stats_array[$stat_name][2] . $stat[0]; } } else { if ($stats_array[$stat_name][2] == '100%') { $stat_value = $stat[0] * 100 . '%'; } else { $stat_value = $stat[0] . $stats_array[$stat_name][2]; } } } else { $stat_value = $stat[0]; } $comp_percentage = $this->stat_percentage_cal($stat[1], $stat[0]); $per_icon = $this->comp_icon_style_color($comp_percentage, $stats_array[$stat_name][4]); echo '

' . $stat_value . '

' . $stats_array[$stat_name][1] . '

' . $comp_percentage . ' %

' . $per_icon['style'] . '
'; } echo '
'; } } /* providing compare icons and colors */ public function comp_icon_style_color($percentage, $type) { if (is_float($percentage)) { if ($percentage == 0) { $per_icon['style'] = "trending_flat"; $per_icon['color'] = "teal-text"; } elseif ($percentage > 0) { $per_icon['style'] = "trending_up"; if ($type) { $per_icon['color'] = "green-text"; } else { $per_icon['color'] = "red-text"; } } elseif ($percentage < 0) { $per_icon['style'] = "trending_down"; if ($type) { $per_icon['color'] = "red-text"; } else { $per_icon['color'] = "green-text"; } } } else { if ($percentage == '--') { $per_icon['style'] = "trending_flat"; $per_icon['color'] = "teal-text"; } else { $per_icon['style'] = "trending_up"; if ($type) { $per_icon['color'] = "green-text"; } else { $per_icon['color'] = "red-text"; } } } return $per_icon; } /* calculating percentage for stats */ public function stat_percentage_cal($stat_old, $stat_new) { if ($stat_old == 0) { if ($stat_new > 0) { return "∞"; } else { return "--"; } } else { return round(((($stat_new - $stat_old) / $stat_old) * 100), 2); } } /* publishing simple table */ public function publish_simple_table($location, $title, $xtitle, $ytitle, $chart_data, $description) { ?>

info

' . $title . ''; } } else { echo ''; } ?> $y) { if (is_array($y)) { echo ''; $i = 0; $j = 0; foreach ($y as $key => $element) { if (is_array($element)) { if ($i < 1) { foreach ($element as $key2 => $object) { echo ''; $j++; } $j = 0; } $i++; } elseif (is_object($element)) { echo ''; } $i++; } echo ''; } else { echo ''; } $h++; } ?>
Index ' . $ytitle . '
' . $h . '' . $x . '' . round($y[$i][$j]->value, 2) . ' ' . $this->publish_compare_stats($y[$i][$j]->value, $y[$i + 1][$j]->value) . '' . round($element->value, 2) . '
' . $h . '' . $x . '' . round($y, 2) . '
0) { return '∞ % trending_up'; } else { return '- % trending_flat'; } } elseif ((float) $data2 > 0) { $stat_number = round((float) ((($data1 - $data2) / $data2) * 100), 2); if ($stat_number > 0) { $stat_return = (string) $stat_number . ' % trending_up'; } elseif ($stat_number < 0) { $stat_return = (string) $stat_number . ' % trending_down'; } else { $stat_return = (string) $stat_number . ' % trending_flat'; } return $stat_return; } } /* publishing simple bar chart */ public function publish_simple_bar_chart($location, $title, $xtitle, $ytitle, $chart_data, $description) { if ($chart_data == false) { $chart_data = array(); } foreach ($chart_data as $x => $y) { if (($title == 'Total Users on Date') || ($title == 'Overview Report')) { $xdate = date_format(date_create($x), 'd-M'); $labels[] = $xdate; } else { $labels[] = $x; } if (is_array($y)) { $j = 0; foreach ($y as $z => $object) { $data[$j][] = round($object->value, 2); $j++; } } else { $data[] = round($y, 2); } } if ($title == 'Total Users on Date') { $len = (int) count($labels); $labels = array_slice($labels, $len / 2); } ?>

info

$y) { if (($title == 'Total Users on Date') || ($title == 'Overview Report')) { $xdate = date_format(date_create($x), 'd-M'); $labels[] = $xdate; } else { $labels[] = $x; } if (is_array($y)) { $j = 0; foreach ($y as $z => $object) { $data[$j][] = round($object->value, 2); $j++; } } else { $data[] = round($y, 2); } } if ($title == 'Total Users on Date') { $len = (int) count($labels); $labels = array_slice($labels, $len / 2); } ?>

info

$y) { $labels[] = $x; if (is_array($y)) { $j = 0; foreach ($y as $z => $object) { $data[$j][] = round($object->value, 2); $j++; } } else { $data[] = round($y, 2); } } ?>

info

value; $i++; } } $j++; } } ?>

info

publish_simple_table($location . '-table', 'Device Category Based Purchase Journey Report', $xtitle, $ytitle, $chart_data, $description); ?>
'Unauthorized'), 403); } $tab_id = str_replace(array('#', '-tab'), '', $_POST['tab']); update_option('awca_current_tab_id', $tab_id); if (stripos($tab_id, 'et-')) { if (stripos($tab_id, 'track')) { $awca_settings = AWCA_Settings::get_instance(); $defaults = $awca_settings->init_awca_track_defaults(); if (!get_option('awca_track_settings')) { $awca_track_settings = $defaults; update_option('awca_track_settings', $defaults); } else { $awca_track_settings = get_option('awca_track_settings'); } ?>

GDPR Compliance

init_awca_advance_defaults(); if (!get_option('awca_advance_settings')) { $awca_advance_settings = $defaults; } else { $awca_advance_settings = get_option('awca_advance_settings'); } ?>

init_awca_events_defaults(); if (!get_option('awca_event_settings')) { $awca_event_settings = $defaults; } else { $awca_event_settings = get_option('awca_event_settings'); } ?>
$value) { ?>

get_ga_property_id(); $awca_dash_settings = $this->get_current_dash_settings(); if (class_exists('WooCommerce')) { $currency_symbol = get_woocommerce_currency_symbol(); } else { $currency_symbol = '$'; } if (!empty($awca_dash_settings['report_view'])) { $new_api = $this->get_google_report_api(); $transient_name = $this->awca_create_transient_name($awca_dash_settings['report_view'], $property_id, $awca_dash_settings['report_from'], $awca_dash_settings['report_to'], $tab_id); $transient_value = get_transient($transient_name); if ($transient_value == false) { $transient_value = $new_api->get_dashboard_data($awca_dash_settings['report_view'], $awca_dash_settings['report_from'], $awca_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 = 'awca_report_chart_data_' . $tab_id; $chart_data_array = AWCA_Settings::get_instance()->$array_name; } else { $new_api = $this->get_google_analytics_data_api(); $transient_name = $this->awca_create_transient_name(false, $property_id, $awca_dash_settings['report_from'], $awca_dash_settings['report_to'], $tab_id); $transient_value = get_transient($transient_name); if ($transient_value == false) { $transient_value = $new_api->get_dashboard_data($awca_dash_settings['report_from'], $awca_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 = 'awca_report_chart_data_ga4_' . $tab_id; $chart_data_array = AWCA_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($awca_dash_settings['report_view'])) { $array_name = 'awca_dash_stats_data_' . $tab_id; $stats_array = AWCA_Settings::get_instance()->$array_name; } else { $array_name = 'awca_dash_stats_data_ga4_' . $tab_id; $stats_array = AWCA_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 '
'; } elseif ($chart_parameters[0] == 'large_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 '
'; } elseif ($chart_parameters[0] == 'funnel') { echo '
'; if (is_array($stats_data[$i])) { //$stats_data[$i] = array_reverse($stats_data[$i]); } else { $stats_data[$i] = array(); } $this->publish_simple_funnel_chart("chartdiv" . $i + 1 . $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('awca-revoke-access', 'security'); if (! is_user_logged_in() || ! current_user_can('manage_options')) { wp_send_json_error(array('message' => 'Unauthorized'), 403); } $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('awca_access_token'); delete_option('awca_refresh_token'); delete_option('awca_auth_settings'); delete_option('awca_granted_scopes'); delete_option('measurement_key'); delete_option('measurement_key_process'); delete_option('custom_dimension_process'); delete_option('dimension_key'); delete_option('awca_refresh_token_fail'); delete_option('ga_properties'); wp_die(); } /* Adding localize script */ public function load_local_script() { if (isset($_GET['tab']) && !empty($_GET['tab'])) { $tab_id = str_replace(array('#', '-tab'), '', $_GET['tab']); update_option('awca_current_tab_id', $tab_id); } wp_register_script('awca_js', AWCA_URL . 'assests/js/awca.js', array('jquery'), null, true); wp_localize_script( 'awca_js', 'awca_js_object', array( 'ajax_url' => admin_url('admin-ajax.php'), 'auth_url' => $this->get_link_url(), 'revoke_access_nonce' => wp_create_nonce('awca-revoke-access'), 'un_link_nonce' => wp_create_nonce('awca-un-link'), 'tab_update_nonce' => wp_create_nonce('awca-tab-update'), 'current_tab_id' => get_option('awca_current_tab_id', 'audience'), ) ); wp_enqueue_script('awca_js'); if (isset($_GET['page']) && ($_GET['page'] == 'awca_pro_plugin_options')) { $this->awca_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('awca_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/awca-analytics/auth'); } /* get call back url for get refreshed token */ public function get_refresh_callback_url() { return get_home_url(null, 'wc-api/awca-analytics/refresh'); } /* authentication function */ public function awca_authenticate() { if (isset($_GET['access_token'])) { if (! is_user_logged_in() || ! current_user_can('manage_options')) { wp_die('Unauthorized'); } 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->awca_granted_scopes($token['scope']); update_option('awca_access_token', $json_token); update_option('awca_refresh_token', $token['refresh_token']); } echo ''; wp_die(); } } /* Save granted scopes and use later for recheck */ public function awca_granted_scopes($scopes) { if (!empty($scopes) && (stripos($scopes, 'googleapis') !== false)) { $scopes = explode(' ', $scopes); update_option('awca_granted_scopes', $scopes); } } /* getting tracking id and account id information */ private function get_ga_property_part($key) { $auth_settings = get_option('awca_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(AWCA_DIR . 'inc/api/awca-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 AWCA_Google_Management_API($token->access_token); } /* getting report api */ public function get_google_report_api() { require_once(AWCA_DIR . 'inc/api/awca-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 AWCA_Google_Report_API($token->access_token); } /* getting report api */ public function get_google_analytics_data_api() { require_once(AWCA_DIR . 'inc/api/awca-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 AWCA_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('awca_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('awca_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('awca_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('awca_access_token', false); $process_status = get_option('awca_refresh_token_fail'); if (empty($process_status)) { update_option('awca_refresh_token_fail', 'retry'); } else { update_option('awca_refresh_token_fail', 'yes'); } throw new Exception('Could not refresh access token: returned token was invalid.'); return false; } $updated = update_option('awca_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('awca_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; } }