gadwp = GADWP();
include_once ( GADWP_DIR . 'tools/src/Deconf/autoload.php' );
$config = new Deconf_Config();
$config->setCacheClass( 'Deconf_Cache_Null' );
if ( function_exists( 'curl_version' ) ) {
$curlversion = curl_version();
$curl_options = array();
if ( isset( $curlversion['version'] ) ) {
$rightversion = ( version_compare( PHP_VERSION, '5.3.0' ) >= 0 ) && version_compare( $curlversion['version'], '7.10.8' ) >= 0;
} else {
$rightversion = false;
}
if ( $rightversion && defined( 'GADWP_IP_VERSION' ) && GADWP_IP_VERSION ) {
$curl_options[CURLOPT_IPRESOLVE] = GADWP_IP_VERSION; // Force CURL_IPRESOLVE_V4 or CURL_IPRESOLVE_V6
}
// add Proxy server settings to curl, if defined
if ( defined( 'WP_PROXY_HOST' ) && defined( 'WP_PROXY_PORT' ) ) {
$curl_options[CURLOPT_PROXY] = WP_PROXY_HOST;
$curl_options[CURLOPT_PROXYPORT] = WP_PROXY_PORT;
}
if ( defined( 'WP_PROXY_USERNAME' ) && defined( 'WP_PROXY_PASSWORD' ) ) {
$curl_options[CURLOPT_HTTPAUTH] = CURLAUTH_BASIC;
$curl_options[CURLOPT_PROXYUSERPWD] = WP_PROXY_USERNAME . ':' . WP_PROXY_PASSWORD;
}
$curl_options = apply_filters( 'gadwp_curl_options', $curl_options );
if ( ! empty( $curl_options ) ) {
$config->setClassConfig( 'Deconf_IO_Curl', 'options', $curl_options );
}
}
$this->client = new Deconf_Client( $config );
$this->client->setScopes( array( 'https://www.googleapis.com/auth/analytics.readonly' ) );
$this->client->setAccessType( 'offline' );
$this->client->setApplicationName( 'GADWP ' . GADWP_CURRENT_VERSION );
$this->client->setRedirectUri( 'urn:ietf:wg:oauth:2.0:oob' );
$this->managequota = 'u' . get_current_user_id() . 's' . get_current_blog_id();
$this->access = array_map( array( $this, 'map' ), $this->access );
if ( $this->gadwp->config->options['user_api'] ) {
$this->client->setClientId( $this->gadwp->config->options['client_id'] );
$this->client->setClientSecret( $this->gadwp->config->options['client_secret'] );
} else {
$this->client->setClientId( $this->access[0] );
$this->client->setClientSecret( $this->access[1] );
}
/**
* GADWP Endpoint support
*/
add_action( 'gadwp_endpoint_support', array( $this, 'add_endpoint_support' ) );
$this->service = new Deconf_Service_Analytics( $this->client );
if ( $this->gadwp->config->options['token'] ) {
$token = $this->gadwp->config->options['token'];
if ( $token ) {
try {
$this->client->setAccessToken( $token );
if ( $this->client->isAccessTokenExpired() ) {
$refreshtoken = $this->client->getRefreshToken();
$this->client->refreshToken( $refreshtoken );
}
$this->gadwp->config->options['token'] = $this->client->getAccessToken();
} catch ( Deconf_IO_Exception $e ) {
$timeout = $this->get_timeouts( 'midnight' );
GADWP_Tools::set_error( $e, $timeout );
} catch ( Deconf_Service_Exception $e ) {
$timeout = $this->get_timeouts( 'midnight' );
GADWP_Tools::set_error( $e, $timeout );
$this->reset_token();
} catch ( Exception $e ) {
$timeout = $this->get_timeouts( 'midnight' );
GADWP_Tools::set_error( $e, $timeout );
$this->reset_token();
}
if ( is_multisite() && $this->gadwp->config->options['network_mode'] ) {
$this->gadwp->config->set_plugin_options( true );
} else {
$this->gadwp->config->set_plugin_options();
}
}
}
}
public function add_endpoint_support( $request ) {
if ( $this->gadwp->config->options['with_endpoint'] && ! $this->gadwp->config->options['user_api'] ) {
$url = $request->getUrl();
if ( in_array( $url, array( 'https://accounts.google.com/o/oauth2/token', 'https://accounts.google.com/o/oauth2/revoke' ) ) ) {
if ( get_class( $this->client->getIo() ) != 'Deconf_IO_Stream' ) {
$curl_old_options = $this->client->getClassConfig( 'Deconf_IO_Curl' );
$curl_options = $curl_old_options['options'];
$curl_options[CURLOPT_SSL_VERIFYPEER] = 0;
$this->client->setClassConfig( 'Deconf_IO_Curl', 'options', $curl_options );
} else {
add_filter( 'gadwp_endpoint_stream_options', array( $this, 'add_endpoint_stream_ssl' ), 10 );
}
} else {
if ( get_class( $this->client->getIo() ) != 'Deconf_IO_Stream' ) {
$curl_old_options = $this->client->getClassConfig( 'Deconf_IO_Curl' );
$curl_options = $curl_old_options['options'];
if ( isset( $curl_options[CURLOPT_SSL_VERIFYPEER] ) ) {
unset( $curl_options[CURLOPT_SSL_VERIFYPEER] );
if ( empty( $curl_options ) ) {
$this->client->setClassConfig( 'Deconf_IO_Curl', 'options', '' );
} else {
$this->client->setClassConfig( 'Deconf_IO_Curl', 'options', $curl_options );
}
}
}
}
$url = str_replace( 'https://accounts.google.com/o/oauth2/token', GADWP_ENDPOINT_URL . 'gadwp-token.php', $url );
$url = str_replace( 'https://accounts.google.com/o/oauth2/revoke', GADWP_ENDPOINT_URL . 'gadwp-revoke.php', $url );
$request->setUrl( $url );
if ( ! $request->getUserAgent() ) {
$request->setUserAgent( $this->client->getApplicationName() );
}
}
}
public function add_endpoint_stream_ssl( $requestSslContext ) {
return array( "verify_peer" => false );
}
/**
* Handles errors returned by GAPI Library
*
* @return boolean
*/
public function gapi_errors_handler() {
$errors = GADWP_Tools::get_cache( 'gapi_errors' );
if ( false === $errors || ! isset( $errors[0] ) ) { // invalid error
return false;
}
if ( isset( $errors[1][0]['reason'] ) && ( 'invalidParameter' == $errors[1][0]['reason'] || 'badRequest' == $errors[1][0]['reason'] || 'invalidCredentials' == $errors[1][0]['reason'] || 'insufficientPermissions' == $errors[1][0]['reason'] || 'required' == $errors[1][0]['reason'] ) ) {
$this->reset_token();
return true;
}
/** Back-off system for subsequent requests - an Auth error generated after a Service request
* The native back-off system for Service requests is covered by the GAPI PHP Client
*/
if ( isset( $errors[1][0]['reason'] ) && ( 'authError' == $errors[1][0]['reason'] ) ) {
if ( $this->gadwp->config->options['api_backoff'] <= 5 ) {
usleep( $this->gadwp->config->options['api_backoff'] * 1000000 + rand( 100000, 1000000 ) );
$this->gadwp->config->options['api_backoff'] = $this->gadwp->config->options['api_backoff'] + 1;
$this->gadwp->config->set_plugin_options();
return false;
} else {
return true;
}
}
if ( 500 == $errors[0] || 503 == $errors[0] || 400 == $errors[0] || 401 == $errors[0] || 403 == $errors[0] || $errors[0] < - 50 ) {
return true;
}
return false;
}
/**
* Calculates proper timeouts for each GAPI query
*
* @param
* $interval
* @return number
*/
public function get_timeouts( $interval = '' ) {
$local_time = time() + $this->timeshift;
if ( 'daily' == $interval ) {
$nextday = explode( '-', date( 'n-j-Y', strtotime( ' +1 day', $local_time ) ) );
$midnight = mktime( 0, 0, 0, $nextday[0], $nextday[1], $nextday[2] );
return $midnight - $local_time;
} else if ( 'midnight' == $interval ) {
$midnight = strtotime( "tomorrow 00:00:00" ); // UTC midnight
$midnight = $midnight + 8 * 3600; // UTC 8 AM
return $midnight - time();
} else if ( 'hourly' == $interval ) {
$nexthour = explode( '-', date( 'H-n-j-Y', strtotime( ' +1 hour', $local_time ) ) );
$newhour = mktime( $nexthour[0], 0, 0, $nexthour[1], $nexthour[2], $nexthour[3] );
return $newhour - $local_time;
} else {
$newtime = strtotime( ' +5 minutes', $local_time );
return $newtime - $local_time;
}
}
/**
* Generates and retrieves the Access Code
*/
public function token_request() {
$data['authUrl'] = $this->client->createAuthUrl();
GADWP_Tools::load_view( 'admin/views/access-code.php', $data );
}
/**
* Retrieves all Google Analytics Views with details
*
* @return array
*/
public function refresh_profiles() {
try {
$ga_profiles_list = array();
$startindex = 1;
$totalresults = 65535; // use something big
while ( $startindex < $totalresults ) {
$profiles = $this->service->management_profiles->listManagementProfiles( '~all', '~all', array( 'start-index' => $startindex ) );
$items = $profiles->getItems();
$totalresults = $profiles->getTotalResults();
if ( $totalresults > 0 ) {
foreach ( $items as $profile ) {
$timetz = new DateTimeZone( $profile->getTimezone() );
$localtime = new DateTime( 'now', $timetz );
$timeshift = strtotime( $localtime->format( 'Y-m-d H:i:s' ) ) - time();
$ga_profiles_list[] = array( $profile->getName(), $profile->getId(), $profile->getwebPropertyId(), $profile->getwebsiteUrl(), $timeshift, $profile->getTimezone(), $profile->getDefaultPage() );
$startindex++;
}
}
}
if ( empty( $ga_profiles_list ) ) {
$timeout = $this->get_timeouts( 'midnight' );
GADWP_Tools::set_error( 'No properties were found in this account!', $timeout );
} else {
GADWP_Tools::delete_cache( 'last_error' );
}
return $ga_profiles_list;
} catch ( Deconf_IO_Exception $e ) {
$timeout = $this->get_timeouts( 'midnight' );
GADWP_Tools::set_error( $e, $timeout );
return $ga_profiles_list;
} catch ( Deconf_Service_Exception $e ) {
$timeout = $this->get_timeouts( 'midnight' );
GADWP_Tools::set_error( $e, $timeout );
} catch ( Exception $e ) {
$timeout = $this->get_timeouts( 'midnight' );
GADWP_Tools::set_error( $e, $timeout );
}
}
/**
* Handles the token reset process
*
* @param
* $all
*/
public function reset_token( $all = false ) {
$this->gadwp->config->options['token'] = "";
if ( $all ) {
$this->gadwp->config->options['tableid_jail'] = "";
$this->gadwp->config->options['ga_profiles_list'] = array();
try {
$this->client->revokeToken();
} catch ( Exception $e ) {
if ( is_multisite() && $this->gadwp->config->options['network_mode'] ) {
$this->gadwp->config->set_plugin_options( true );
} else {
$this->gadwp->config->set_plugin_options();
}
}
}
if ( is_multisite() && $this->gadwp->config->options['network_mode'] ) {
$this->gadwp->config->set_plugin_options( true );
} else {
$this->gadwp->config->set_plugin_options();
}
}
/**
* Get and cache Core Reports
*
* @param
* $projecId
* @param
* $from
* @param
* $to
* @param
* $metrics
* @param
* $options
* @param
* $serial
* @return int|Deconf_Service_Analytics_GaData
*/
private function handle_corereports( $projectId, $from, $to, $metrics, $options, $serial ) {
try {
if ( 'today' == $from ) {
$interval = 'hourly';
} else {
$interval = 'daily';
}
$transient = GADWP_Tools::get_cache( $serial );
if ( false === $transient ) {
if ( $this->gapi_errors_handler() ) {
return - 23;
}
$options['samplingLevel'] = 'HIGHER_PRECISION';
$data = $this->service->data_ga->get( 'ga:' . $projectId, $from, $to, $metrics, $options );
if ( method_exists( $data, 'getContainsSampledData' ) && $data->getContainsSampledData() ) {
$sampling['date'] = date( 'Y-m-d H:i:s' );
$sampling['percent'] = number_format( ( $data->getSampleSize() / $data->getSampleSpace() ) * 100, 2 ) . '%';
$sampling['sessions'] = $data->getSampleSize() . ' / ' . $data->getSampleSpace();
GADWP_Tools::set_cache( 'sampleddata', $sampling, 30 * 24 * 3600 );
GADWP_Tools::set_cache( $serial, $data, $this->get_timeouts( 'hourly' ) ); // refresh every hour if data is sampled
} else {
GADWP_Tools::set_cache( $serial, $data, $this->get_timeouts( $interval ) );
}
} else {
$data = $transient;
}
} catch ( Deconf_Service_Exception $e ) {
$timeout = $this->get_timeouts( 'midnight' );
GADWP_Tools::set_error( $e, $timeout );
return $e->getCode();
} catch ( Exception $e ) {
$timeout = $this->get_timeouts( 'midnight' );
GADWP_Tools::set_error( $e, $timeout );
return $e->getCode();
}
$this->gadwp->config->options['api_backoff'] = 0;
$this->gadwp->config->set_plugin_options();
if ( $data->getRows() > 0 ) {
return $data;
} else {
$data->rows = array();
return $data;
}
}
/**
* Generates serials for transients
*
* @param
* $serial
* @return string
*/
public function get_serial( $serial ) {
return sprintf( "%u", crc32( $serial ) );
}
/**
* Analytics data for Area Charts (Admin Dashboard Widget report)
*
* @param
* $projectId
* @param
* $from
* @param
* $to
* @param
* $query
* @param
* $filter
* @return array|int
*/
private function get_areachart_data( $projectId, $from, $to, $query, $filter = '' ) {
switch ( $query ) {
case 'users' :
$title = __( "Users", 'google-analytics-dashboard-for-wp' );
break;
case 'pageviews' :
$title = __( "Page Views", 'google-analytics-dashboard-for-wp' );
break;
case 'visitBounceRate' :
$title = __( "Bounce Rate", 'google-analytics-dashboard-for-wp' );
break;
case 'organicSearches' :
$title = __( "Organic Searches", 'google-analytics-dashboard-for-wp' );
break;
case 'uniquePageviews' :
$title = __( "Unique Page Views", 'google-analytics-dashboard-for-wp' );
break;
default :
$title = __( "Sessions", 'google-analytics-dashboard-for-wp' );
}
$metrics = 'ga:' . $query;
if ( 'today' == $from || 'yesterday' == $from ) {
$dimensions = 'ga:hour';
$dayorhour = __( "Hour", 'google-analytics-dashboard-for-wp' );
} else if ( '365daysAgo' == $from || '1095daysAgo' == $from ) {
$dimensions = 'ga:yearMonth, ga:month';
$dayorhour = __( "Date", 'google-analytics-dashboard-for-wp' );
} else {
$dimensions = 'ga:date,ga:dayOfWeekName';
$dayorhour = __( "Date", 'google-analytics-dashboard-for-wp' );
}
$options = array( 'dimensions' => $dimensions, 'quotaUser' => $this->managequota . 'p' . $projectId );
if ( $filter ) {
$options['filters'] = 'ga:pagePath==' . $filter;
}
$serial = 'qr2_' . $this->get_serial( $projectId . $from . $metrics . $filter );
$data = $this->handle_corereports( $projectId, $from, $to, $metrics, $options, $serial );
if ( is_numeric( $data ) ) {
return $data;
}
if ( empty( $data->rows ) ) {
// unable to render it as an Area Chart, returns a numeric value to be handled by reportsx.js
return - 21;
}
$gadwp_data = array( array( $dayorhour, $title ) );
if ( 'today' == $from || 'yesterday' == $from ) {
foreach ( $data->getRows() as $row ) {
$gadwp_data[] = array( (int) $row[0] . ':00', round( $row[1], 2 ) );
}
} else if ( '365daysAgo' == $from || '1095daysAgo' == $from ) {
foreach ( $data->getRows() as $row ) {
/*
* translators:
* Example: 'F, Y' will become 'November, 2015'
* For details see: http://php.net/manual/en/function.date.php#refsect1-function.date-parameters
*/
$gadwp_data[] = array( date_i18n( __( 'F, Y', 'google-analytics-dashboard-for-wp' ), strtotime( $row[0] . '01' ) ), round( $row[2], 2 ) );
}
} else {
foreach ( $data->getRows() as $row ) {
/*
* translators:
* Example: 'l, F j, Y' will become 'Thusday, November 17, 2015'
* For details see: http://php.net/manual/en/function.date.php#refsect1-function.date-parameters
*/
$gadwp_data[] = array( date_i18n( __( 'l, F j, Y', 'google-analytics-dashboard-for-wp' ), strtotime( $row[0] ) ), round( $row[2], 2 ) );
}
}
return $gadwp_data;
}
/**
* Analytics data for Bottom Stats (bottom stats on main report)
*
* @param
* $projectId
* @param
* $from
* @param
* $to
* @param
* $filter
* @return array|int
*/
private function get_bottomstats( $projectId, $from, $to, $filter = '' ) {
$options = array( 'dimensions' => null, 'quotaUser' => $this->managequota . 'p' . $projectId );
if ( $filter ) {
$options['filters'] = 'ga:pagePath==' . $filter;
$metrics = 'ga:uniquePageviews,ga:users,ga:pageviews,ga:BounceRate,ga:organicSearches,ga:pageviewsPerSession,ga:avgTimeOnPage,ga:avgPageLoadTime,ga:exitRate';
} else {
$metrics = 'ga:sessions,ga:users,ga:pageviews,ga:BounceRate,ga:organicSearches,ga:pageviewsPerSession,ga:avgTimeOnPage,ga:avgPageLoadTime,ga:avgSessionDuration';
}
$serial = 'qr3_' . $this->get_serial( $projectId . $from . $filter );
$data = $this->handle_corereports( $projectId, $from, $to, $metrics, $options, $serial );
if ( is_numeric( $data ) ) {
return $data;
}
$gadwp_data = array();
foreach ( $data->getRows() as $row ) {
$gadwp_data = array_map( 'floatval', $row );
}
// i18n support
$gadwp_data[0] = isset( $gadwp_data[0] ) ? number_format_i18n( $gadwp_data[0] ) : 0;
$gadwp_data[1] = isset( $gadwp_data[1] ) ? number_format_i18n( $gadwp_data[1] ) : 0;
$gadwp_data[2] = isset( $gadwp_data[2] ) ? number_format_i18n( $gadwp_data[2] ) : 0;
$gadwp_data[3] = isset( $gadwp_data[3] ) ? number_format_i18n( $gadwp_data[3], 2 ) . '%' : '0%';
$gadwp_data[4] = isset( $gadwp_data[4] ) ? number_format_i18n( $gadwp_data[4] ) : 0;
$gadwp_data[5] = isset( $gadwp_data[5] ) ? number_format_i18n( $gadwp_data[5], 2 ) : 0;
$gadwp_data[6] = isset( $gadwp_data[6] ) ? gmdate( "H:i:s", $gadwp_data[6] ) : '00:00:00';
$gadwp_data[7] = isset( $gadwp_data[7] ) ? number_format_i18n( $gadwp_data[7], 2 ) : 0;
if ( $filter ) {
$gadwp_data[8] = isset( $gadwp_data[8] ) ? number_format_i18n( $gadwp_data[8], 2 ) . '%' : '0%';
} else {
$gadwp_data[8] = isset( $gadwp_data[8] ) ? gmdate( "H:i:s", $gadwp_data[8] ) : '00:00:00';
}
return $gadwp_data;
}
/**
* Analytics data for Table Charts (content pages)
*
* @param
* $projectId
* @param
* $from
* @param
* $to
* @param
* $filter
* @return array|int
*/
private function get_contentpages( $projectId, $from, $to, $filter = '', $metric ) {
$metrics = 'ga:' . $metric;
$dimensions = 'ga:pageTitle';
$options = array( 'dimensions' => $dimensions, 'sort' => '-' . $metrics, 'quotaUser' => $this->managequota . 'p' . $projectId );
if ( $filter ) {
$options['filters'] = 'ga:pagePath==' . $filter;
}
$serial = 'qr4_' . $this->get_serial( $projectId . $from . $filter . $metric );
$data = $this->handle_corereports( $projectId, $from, $to, $metrics, $options, $serial );
if ( is_numeric( $data ) ) {
return $data;
}
$gadwp_data = array( array( __( "Pages", 'google-analytics-dashboard-for-wp' ), __( ucfirst( $metric ), 'google-analytics-dashboard-for-wp' ) ) );
foreach ( $data->getRows() as $row ) {
$gadwp_data[] = array( esc_html( $row[0] ), (int) $row[1] );
}
return $gadwp_data;
}
/**
* Analytics data for 404 Errors
*
* @param
* $projectId
* @param
* $from
* @param
* $to
* @return array|int
*/
private function get_404errors( $projectId, $from, $to, $filter = "Page Not Found", $metric ) {
$metrics = 'ga:' . $metric;
$dimensions = 'ga:pagePath,ga:fullReferrer';
$options = array( 'dimensions' => $dimensions, 'sort' => '-' . $metrics, 'quotaUser' => $this->managequota . 'p' . $projectId );
$options['filters'] = 'ga:pageTitle=@' . $filter;
$serial = 'qr4_' . $this->get_serial( $projectId . $from . $filter . $metric );
$data = $this->handle_corereports( $projectId, $from, $to, $metrics, $options, $serial );
if ( is_numeric( $data ) ) {
return $data;
}
$gadwp_data = array( array( __( "404 Errors", 'google-analytics-dashboard-for-wp' ), __( ucfirst( $metric ), 'google-analytics-dashboard-for-wp' ) ) );
foreach ( $data->getRows() as $row ) {
$path = esc_html( $row[0] );
$source = esc_html( $row[1] );
$gadwp_data[] = array( "" . __( "URI:", 'google-analytics-dashboard-for-wp' ) . " " . $path . "
" . __( "Source:", 'google-analytics-dashboard-for-wp' ) . " " . $source, (int) $row[2] );
}
return $gadwp_data;
}
/**
* Analytics data for Table Charts (referrers)
*
* @param
* $projectId
* @param
* $from
* @param
* $to
* @param
* $filter
* @return array|int
*/
private function get_referrers( $projectId, $from, $to, $filter = '', $metric ) {
$metrics = 'ga:' . $metric;
$dimensions = 'ga:source';
$options = array( 'dimensions' => $dimensions, 'sort' => '-' . $metrics, 'quotaUser' => $this->managequota . 'p' . $projectId );
if ( $filter ) {
$options['filters'] = 'ga:medium==referral;ga:pagePath==' . $filter;
} else {
$options['filters'] = 'ga:medium==referral';
}
$serial = 'qr5_' . $this->get_serial( $projectId . $from . $filter . $metric );
$data = $this->handle_corereports( $projectId, $from, $to, $metrics, $options, $serial );
if ( is_numeric( $data ) ) {
return $data;
}
$gadwp_data = array( array( __( "Referrers", 'google-analytics-dashboard-for-wp' ), __( ucfirst( $metric ), 'google-analytics-dashboard-for-wp' ) ) );
foreach ( $data->getRows() as $row ) {
$gadwp_data[] = array( esc_html( $row[0] ), (int) $row[1] );
}
return $gadwp_data;
}
/**
* Analytics data for Table Charts (searches)
*
* @param
* $projectId
* @param
* $from
* @param
* $to
* @param
* $filter
* @return array|int
*/
private function get_searches( $projectId, $from, $to, $filter = '', $metric ) {
$metrics = 'ga:' . $metric;
$dimensions = 'ga:keyword';
$options = array( 'dimensions' => $dimensions, 'sort' => '-' . $metrics, 'quotaUser' => $this->managequota . 'p' . $projectId );
if ( $filter ) {
$options['filters'] = 'ga:keyword!=(not set);ga:pagePath==' . $filter;
} else {
$options['filters'] = 'ga:keyword!=(not set)';
}
$serial = 'qr6_' . $this->get_serial( $projectId . $from . $filter . $metric );
$data = $this->handle_corereports( $projectId, $from, $to, $metrics, $options, $serial );
if ( is_numeric( $data ) ) {
return $data;
}
$gadwp_data = array( array( __( "Searches", 'google-analytics-dashboard-for-wp' ), __( ucfirst( $metric ), 'google-analytics-dashboard-for-wp' ) ) );
foreach ( $data->getRows() as $row ) {
$gadwp_data[] = array( esc_html( $row[0] ), (int) $row[1] );
}
return $gadwp_data;
}
/**
* Analytics data for Table Charts (location reports)
*
* @param
* $projectId
* @param
* $from
* @param
* $to
* @param
* $filter
* @return array|int
*/
private function get_locations( $projectId, $from, $to, $filter = '', $metric ) {
$metrics = 'ga:' . $metric;
$options = "";
$title = __( "Countries", 'google-analytics-dashboard-for-wp' );
$serial = 'qr7_' . $this->get_serial( $projectId . $from . $filter . $metric );
$dimensions = 'ga:country';
$local_filter = '';
if ( $this->gadwp->config->options['ga_target_geomap'] ) {
$dimensions = 'ga:city, ga:region';
$country_codes = GADWP_Tools::get_countrycodes();
if ( isset( $country_codes[$this->gadwp->config->options['ga_target_geomap']] ) ) {
$local_filter = 'ga:country==' . ( $country_codes[$this->gadwp->config->options['ga_target_geomap']] );
$title = __( "Cities from", 'google-analytics-dashboard-for-wp' ) . ' ' . __( $country_codes[$this->gadwp->config->options['ga_target_geomap']] );
$serial = 'qr7_' . $this->get_serial( $projectId . $from . $this->gadwp->config->options['ga_target_geomap'] . $filter . $metric );
}
}
$options = array( 'dimensions' => $dimensions, 'sort' => '-' . $metrics, 'quotaUser' => $this->managequota . 'p' . $projectId );
if ( $filter ) {
$options['filters'] = 'ga:pagePath==' . $filter;
if ( $local_filter ) {
$options['filters'] .= ';' . $local_filter;
}
} else {
if ( $local_filter ) {
$options['filters'] = $local_filter;
}
}
$data = $this->handle_corereports( $projectId, $from, $to, $metrics, $options, $serial );
if ( is_numeric( $data ) ) {
return $data;
}
$gadwp_data = array( array( $title, __( ucfirst( $metric ), 'google-analytics-dashboard-for-wp' ) ) );
foreach ( $data->getRows() as $row ) {
if ( isset( $row[2] ) ) {
$gadwp_data[] = array( esc_html( $row[0] ) . ', ' . esc_html( $row[1] ), (int) $row[2] );
} else {
$gadwp_data[] = array( esc_html( $row[0] ), (int) $row[1] );
}
}
return $gadwp_data;
}
/**
* Analytics data for Org Charts (traffic channels, device categories)
*
* @param
* $projectId
* @param
* $from
* @param
* $to
* @param
* $query
* @param
* $filter
* @return array|int
*/
private function get_orgchart_data( $projectId, $from, $to, $query, $filter = '', $metric ) {
$metrics = 'ga:' . $metric;
$dimensions = 'ga:' . $query;
$options = array( 'dimensions' => $dimensions, 'sort' => '-' . $metrics, 'quotaUser' => $this->managequota . 'p' . $projectId );
if ( $filter ) {
$options['filters'] = 'ga:pagePath==' . $filter;
}
$serial = 'qr8_' . $this->get_serial( $projectId . $from . $query . $filter . $metric );
$data = $this->handle_corereports( $projectId, $from, $to, $metrics, $options, $serial );
if ( is_numeric( $data ) ) {
return $data;
}
if ( empty( $data->rows ) ) {
// unable to render as an Org Chart, returns a numeric value to be handled by reportsx.js
return - 21;
}
$block = ( 'channelGrouping' == $query ) ? __( "Channels", 'google-analytics-dashboard-for-wp' ) : __( "Devices", 'google-analytics-dashboard-for-wp' );
$gadwp_data = array( array( '