ga4wp_get_mesurement_key(); } $c_process_status = get_option('custom_dimension_process'); if (stripos($c_process_status, 'completed') === false) { $this->ga4wp_create_custom_dimension(); } }else{ } } } } /* creating dashboard widget */ function ga4wp_dashboard_widget() { global $wp_meta_boxes; if ($auth_settings = get_option('ga4wp_auth_settings')) { $ga4wp_refresh_token_fail = get_option('ga4wp_refresh_token_fail'); if(isset($auth_settings['property_id']) && ($ga4wp_refresh_token_fail != 'yes')){ $this->transient_value = $this->g4wp_required_dashboard_data(); if((strpos($auth_settings['property_id'], 'UA') !== false)){ $dash_data_widget = GA4WP_Settings::get_instance()->ga4wp_dash_data_widget; }else{ $dash_data_widget = GA4WP_Settings::get_instance()->ga4wp_dash_data_ga4_widget; } $i = 0; foreach ($dash_data_widget as $widget_title => $widget_data) { $i++; wp_add_dashboard_widget('ga4wp_status_widget' . $i, $widget_title, array($this, 'ga4wp_dashboard_help'), '', $widget_data, '', 'high'); } } } else { wp_add_dashboard_widget('ga4wp_status_widget_6', 'GA4WP Setup', array($this, 'ga4wp_dashboard_help6')); } } function g4wp_required_dashboard_data() { $ga4wp_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($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, $dash_start, $dash_end, $tab_id); $transient_value = get_transient($transient_name); if ($transient_value == false) { $transient_value = $new_api->get_dashboard_data($ga4wp_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->ga4wp_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 ga4wp_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 ga4wp_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 ga4wp_dashboard_help6() { if (is_multisite() && is_network_admin()) { $button_url = network_admin_url('admin.php?page=ga4wp_pro_plugin_options'); } else { $button_url = admin_url('admin.php?page=ga4wp_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 == 'GA4WP_secret_Key'){ $ga4_match = true; update_option('measurement_key', $response->secretValue); update_option('measurement_key_process', 'completed'); break; } } if(!$ga4_match){ $this->ga4wp_create_mesurement_key(); } } else{ $this->ga4wp_create_mesurement_key(); } } } /* Creating Measurement Secret Key for GA4 Property */ public function ga4wp_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 ga4wp_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() { $ga4wp_settings = GA4WP_Settings::get_instance(); $defaults_track = $ga4wp_settings->init_ga4wp_track_defaults(); if (!get_option('ga4wp_track_settings')) { update_option('ga4wp_track_settings', $defaults_track); } $defaults_event = $ga4wp_settings->init_ga4wp_event_defaults(); if (!get_option('ga4wp_event_settings')) { update_option('ga4wp_event_settings', $defaults_event); } } /* Un-link Google Analytics Account from Website */ public function web_un_link() { check_ajax_referer('ga4wp-un-link', 'security'); 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(); } /* getting current values of settings */ public function get_current_dash_settings() { $ga4wp_dash_settings = get_option('ga4wp_dash_settings'); if (empty($ga4wp_dash_settings)) { $ga4wp_dash_settings = $ga4wp_settings->init_ga4wp_dash_defaults(); } /*$property_views = $this->get_analytics_property_views(); if (is_array($property_views) && !empty($property_views)) { if (!isset($ga4wp_dash_settings['report_view']) || !in_array($ga4wp_dash_settings['report_view'], $property_views)) { $ga4wp_dash_settings['report_view'] = $property_views[0]->id; } } else { $ga4wp_dash_settings['report_view'] = false; }*/ if ($ga4wp_dash_settings['report_frame'] == 'Yesterday') { $ga4wp_dash_settings['report_to'] = date('Y-m-d', strtotime('-1 day')); $ga4wp_dash_settings['report_from'] = date('Y-m-d', strtotime('-1 day')); } elseif ($ga4wp_dash_settings['report_frame'] == 'Last 7 days') { $ga4wp_dash_settings['report_to'] = date('Y-m-d', strtotime('-1 day')); $ga4wp_dash_settings['report_from'] = date('Y-m-d', strtotime('-7 day')); } elseif ($ga4wp_dash_settings['report_frame'] == 'Today') { $ga4wp_dash_settings['report_to'] = date('Y-m-d', strtotime('now')); $ga4wp_dash_settings['report_from'] = date('Y-m-d', strtotime('now')); } elseif ($ga4wp_dash_settings['report_frame'] == 'Current Year') { $ga4wp_dash_settings['report_to'] = date('Y-m-d', strtotime('now')); $ga4wp_dash_settings['report_from'] = date('Y') . '-01-01'; } elseif ($ga4wp_dash_settings['report_frame'] == 'Custom Range') { if (isset($ga4wp_dash_settings['report_to']) && isset($ga4wp_dash_settings['report_from'])) { } else { $ga4wp_dash_settings['report_to'] = date('Y-m-d', strtotime('-1 day')); $ga4wp_dash_settings['report_from'] = date('Y-m-d', strtotime('-30 day')); } } else { $ga4wp_dash_settings['report_to'] = date('Y-m-d', strtotime('-1 day')); $ga4wp_dash_settings['report_from'] = date('Y-m-d', strtotime('-30 day')); } return $ga4wp_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) { if (class_exists('WooCommerce')) { $currency_symbol = get_woocommerce_currency_symbol(); } else { $currency_symbol = '$'; } $ga4wp_dash_settings = $this->get_current_dash_settings(); $tab_id = 'dash'; 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; } 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 ''; foreach ($y as $object) { echo ''; } echo ''; } else { echo ''; } $j++; } ?>
Index ' . $ytitle . '
' . $j . '' . $x . '' . round($object->value, 2) . '
' . $j . '' . $x . '' . round($y, 2) . '
$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

init_ga4wp_track_defaults(); if (!get_option('ga4wp_track_settings')) { $ga4wp_track_settings = $defaults_track; update_option('ga4wp_track_settings', $defaults_track); } else { $ga4wp_track_settings = get_option('ga4wp_track_settings'); } ?>

GDPR Compliance

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

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; } }