in includes/Modules/Analytics.php [385:718]
protected function create_data_request( Data_Request $data ) {
switch ( "{$data->method}:{$data->datapoint}" ) {
case 'GET:accounts-properties-profiles':
return function () use ( $data ) {
$restore_defer = $this->with_client_defer( false );
try {
return $this->get_service( 'analytics' )->management_accounts->listManagementAccounts();
} catch ( Google_Service_Exception $exception ) {
// The exception message is a JSON object of all errors, so we'll convert it to our WP Error first.
$wp_error = $this->exception_to_error( $exception, $data->datapoint );
// Unfortunately there isn't a better way to identify this without checking the message.
if ( 'User does not have any Google Analytics account.' === $wp_error->get_error_message() ) {
return new Google_Service_Analytics_Accounts();
}
// If any other exception was caught, re-throw it.
throw $exception;
} finally {
$restore_defer(); // Will be called before returning in all cases.
}
};
case 'POST:create-account-ticket':
if ( ! isset( $data['accountName'] ) ) {
/* translators: %s: Missing parameter name */
return new WP_Error( 'missing_required_param', sprintf( __( 'Request parameter is empty: %s.', 'google-site-kit' ), 'accountName' ), array( 'status' => 400 ) );
}
if ( ! isset( $data['propertyName'] ) ) {
/* translators: %s: Missing parameter name */
return new WP_Error( 'missing_required_param', sprintf( __( 'Request parameter is empty: %s.', 'google-site-kit' ), 'propertyName' ), array( 'status' => 400 ) );
}
if ( ! isset( $data['profileName'] ) ) {
/* translators: %s: Missing parameter name */
return new WP_Error( 'missing_required_param', sprintf( __( 'Request parameter is empty: %s.', 'google-site-kit' ), 'profileName' ), array( 'status' => 400 ) );
}
if ( ! isset( $data['timezone'] ) ) {
/* translators: %s: Missing parameter name */
return new WP_Error( 'missing_required_param', sprintf( __( 'Request parameter is empty: %s.', 'google-site-kit' ), 'timezone' ), array( 'status' => 400 ) );
}
if ( ! $this->authentication->credentials()->using_proxy() ) {
return new WP_Error( 'requires_service', __( 'Analytics provisioning requires connecting via the Site Kit Service.', 'google-site-kit' ), array( 'status' => 400 ) );
}
$account = new Google_Service_Analytics_Account();
$account->setName( $data['accountName'] );
$property = new Google_Service_Analytics_Webproperty();
$property->setName( $data['propertyName'] );
$property->setWebsiteUrl( $this->context->get_reference_site_url() );
$profile = new Google_Service_Analytics_Profile();
$profile->setName( $data['profileName'] );
$profile->setTimezone( $data['timezone'] );
$account_ticket = new Proxy_AccountTicket();
$account_ticket->setAccount( $account );
$account_ticket->setWebproperty( $property );
$account_ticket->setProfile( $profile );
$account_ticket->setRedirectUri( $this->get_provisioning_redirect_uri() );
// Add site id and secret.
$creds = $this->authentication->credentials()->get();
$account_ticket->setSiteId( $creds['oauth2_client_id'] );
$account_ticket->setSiteSecret( $creds['oauth2_client_secret'] );
return $this->get_service( 'analyticsprovisioning' )
->provisioning->createAccountTicket( $account_ticket );
case 'GET:goals':
$connection = $this->get_settings()->get();
if (
empty( $connection['accountID'] ) ||
empty( $connection['internalWebPropertyID'] ) ||
empty( $connection['profileID'] )
) {
// This is needed to return and emulate the same error format from Analytics API.
return function() {
return array(
'error' => array(
'code' => 400,
'message' => __( 'Analytics module needs to be configured.', 'google-site-kit' ),
'status' => 'INVALID_ARGUMENT',
),
);
};
}
$service = $this->get_service( 'analytics' );
return $service->management_goals->listManagementGoals( $connection['accountID'], $connection['propertyID'], $connection['profileID'] );
case 'GET:profiles':
if ( ! isset( $data['accountID'] ) ) {
return new WP_Error(
'missing_required_param',
/* translators: %s: Missing parameter name */
sprintf( __( 'Request parameter is empty: %s.', 'google-site-kit' ), 'accountID' ),
array( 'status' => 400 )
);
}
if ( ! isset( $data['propertyID'] ) ) {
return new WP_Error(
'missing_required_param',
/* translators: %s: Missing parameter name */
sprintf( __( 'Request parameter is empty: %s.', 'google-site-kit' ), 'propertyID' ),
array( 'status' => 400 )
);
}
return $this->get_service( 'analytics' )->management_profiles->listManagementProfiles( $data['accountID'], $data['propertyID'] );
case 'GET:properties-profiles':
if ( ! isset( $data['accountID'] ) ) {
return new WP_Error(
'missing_required_param',
/* translators: %s: Missing parameter name */
sprintf( __( 'Request parameter is empty: %s.', 'google-site-kit' ), 'accountID' ),
array( 'status' => 400 )
);
}
return $this->get_service( 'analytics' )->management_webproperties->listManagementWebproperties( $data['accountID'] );
case 'GET:report':
$request_args = array();
if ( empty( $data['metrics'] ) ) {
/* translators: %s: Missing parameter name */
return new WP_Error( 'missing_required_param', sprintf( __( 'Request parameter is empty: %s.', 'google-site-kit' ), 'metrics' ), array( 'status' => 400 ) );
}
if ( ! empty( $data['url'] ) ) {
$request_args['page'] = $data['url'];
}
if ( ! empty( $data['limit'] ) ) {
$request_args['row_limit'] = $data['limit'];
}
$dimensions = $data['dimensions'];
if ( ! empty( $dimensions ) && ( is_string( $dimensions ) || is_array( $dimensions ) ) ) {
if ( is_string( $dimensions ) ) {
$dimensions = explode( ',', $dimensions );
} elseif ( is_array( $dimensions ) && ! wp_is_numeric_array( $dimensions ) ) { // If single object is passed.
$dimensions = array( $dimensions );
}
$dimensions = array_filter(
array_map(
function ( $dimension_def ) {
$dimension = new Google_Service_AnalyticsReporting_Dimension();
if ( is_string( $dimension_def ) ) {
$dimension->setName( $dimension_def );
} elseif ( is_array( $dimension_def ) && ! empty( $dimension_def['name'] ) ) {
$dimension->setName( $dimension_def['name'] );
} else {
return null;
}
return $dimension;
},
array_filter( $dimensions )
)
);
if ( ! empty( $dimensions ) ) {
$request_args['dimensions'] = $dimensions;
}
}
$dimension_filters = $data['dimensionFilters'];
$dimension_filter_instances = array();
if ( ! empty( $dimension_filters ) && is_array( $dimension_filters ) ) {
foreach ( $dimension_filters as $dimension_name => $dimension_value ) {
$dimension_filter = new Google_Service_AnalyticsReporting_DimensionFilter();
$dimension_filter->setDimensionName( $dimension_name );
if ( is_array( $dimension_value ) ) {
$dimension_filter->setOperator( 'IN_LIST' );
$dimension_filter->setExpressions( $dimension_value );
} else {
$dimension_filter->setOperator( 'EXACT' );
$dimension_filter->setExpressions( array( $dimension_value ) );
}
$dimension_filter_instances[] = $dimension_filter;
}
if ( ! empty( $dimension_filter_instances ) ) {
$request_args['dimension_filters'] = $dimension_filter_instances;
}
}
$request = $this->create_analytics_site_data_request( $request_args );
if ( is_wp_error( $request ) ) {
return $request;
}
$date_ranges = array();
$start_date = $data['startDate'];
$end_date = $data['endDate'];
if ( strtotime( $start_date ) && strtotime( $end_date ) ) {
$compare_start_date = $data['compareStartDate'];
$compare_end_date = $data['compareEndDate'];
$date_ranges[] = array( $start_date, $end_date );
// When using multiple date ranges, it changes the structure of the response,
// where each date range becomes an item in a list.
if ( strtotime( $compare_start_date ) && strtotime( $compare_end_date ) ) {
$date_ranges[] = array( $compare_start_date, $compare_end_date );
}
} else {
$date_range = $data['dateRange'] ?: 'last-28-days';
$date_ranges[] = $this->parse_date_range( $date_range, $data['compareDateRanges'] ? 2 : 1 );
// When using multiple date ranges, it changes the structure of the response,
// where each date range becomes an item in a list.
if ( ! empty( $data['multiDateRange'] ) ) {
$date_ranges[] = $this->parse_date_range( $date_range, 1, 1, true );
}
}
$date_ranges = array_map(
function ( $date_range ) {
list ( $start_date, $end_date ) = $date_range;
$date_range = new Google_Service_AnalyticsReporting_DateRange();
$date_range->setStartDate( $start_date );
$date_range->setEndDate( $end_date );
return $date_range;
},
$date_ranges
);
$request->setDateRanges( $date_ranges );
$metrics = $data['metrics'];
if ( is_string( $metrics ) || is_array( $metrics ) ) {
if ( is_string( $metrics ) ) {
$metrics = explode( ',', $data['metrics'] );
} elseif ( is_array( $metrics ) && ! wp_is_numeric_array( $metrics ) ) { // If single object is passed.
$metrics = array( $metrics );
}
$metrics = array_filter(
array_map(
function ( $metric_def ) {
$metric = new Google_Service_AnalyticsReporting_Metric();
if ( is_string( $metric_def ) ) {
$metric->setAlias( $metric_def );
$metric->setExpression( $metric_def );
} elseif ( is_array( $metric_def ) && ! empty( $metric_def['expression'] ) ) {
$metric->setExpression( $metric_def['expression'] );
$metric->setAlias( ! empty( $metric_def['alias'] ) ? $metric_def['alias'] : $metric_def['expression'] );
} else {
return null;
}
return $metric;
},
array_filter( $metrics )
)
);
if ( ! empty( $metrics ) ) {
$request->setMetrics( $metrics );
}
}
// Order by.
$orderby = $this->parse_reporting_orderby( $data['orderby'] );
if ( ! empty( $orderby ) ) {
$request->setOrderBys( $orderby );
}
// Batch reports requests.
$body = new Google_Service_AnalyticsReporting_GetReportsRequest();
$body->setReportRequests( array( $request ) );
return $this->get_analyticsreporting_service()->reports->batchGet( $body );
case 'POST:create-profile':
if ( ! isset( $data['accountID'] ) ) {
return new WP_Error(
'missing_required_param',
/* translators: %s: Missing parameter name */
sprintf( __( 'Request parameter is empty: %s.', 'google-site-kit' ), 'accountID' ),
array( 'status' => 400 )
);
}
if ( ! isset( $data['propertyID'] ) ) {
return new WP_Error(
'missing_required_param',
/* translators: %s: Missing parameter name */
sprintf( __( 'Request parameter is empty: %s.', 'google-site-kit' ), 'propertyID' ),
array( 'status' => 400 )
);
}
$profile_name = trim( $data['profileName'] );
if ( empty( $profile_name ) ) {
$profile_name = _x( 'All Web Site Data', 'default Analytics view name', 'google-site-kit' );
}
$profile = new Google_Service_Analytics_Profile();
$profile->setName( $profile_name );
return $profile = $this->get_service( 'analytics' )->management_profiles->insert( $data['accountID'], $data['propertyID'], $profile );
case 'POST:create-property':
if ( ! isset( $data['accountID'] ) ) {
return new WP_Error(
'missing_required_param',
/* translators: %s: Missing parameter name */
sprintf( __( 'Request parameter is empty: %s.', 'google-site-kit' ), 'accountID' ),
array( 'status' => 400 )
);
}
$property = new Google_Service_Analytics_Webproperty();
$property->setName( wp_parse_url( $this->context->get_reference_site_url(), PHP_URL_HOST ) );
$property->setWebsiteUrl( $this->context->get_reference_site_url() );
return $this->get_service( 'analytics' )->management_webproperties->insert( $data['accountID'], $property );
case 'GET:tag-permission':
return function() use ( $data ) {
if ( ! isset( $data['propertyID'] ) ) {
return new WP_Error(
'missing_required_param',
/* translators: %s: Missing parameter name */
sprintf( __( 'Request parameter is empty: %s.', 'google-site-kit' ), 'propertyID' ),
array( 'status' => 400 )
);
}
$property_id = $data['propertyID'];
return array_merge(
array(
'accountID' => '', // Set the accountID to be an empty string and let has_access_to_property handle determining actual ID.
'propertyID' => $property_id,
),
$this->has_access_to_property( $property_id )
);
};
}
return parent::create_data_request( $data );
}