This commit is contained in:
2026-07-02 15:54:39 -06:00
commit 9883323161
17470 changed files with 4470592 additions and 0 deletions
@@ -0,0 +1,369 @@
<?php
namespace Gravity_Forms\Gravity_Forms_Google_Analytics;
defined( 'ABSPATH' ) || die();
use WP_Error;
/**
* Gravity Forms Google Analytics Add-On.
*
* @since 1.0.0
* @package GravityForms
* @author Rocketgenius
* @copyright Copyright (c) 2019, Rocketgenius
*/
/**
* Helper class for retrieving the Google Analytics API validation.
*/
class GF_Google_Analytics_API {
/**
* Google Analytics API URL.
*
* @since 1.0
* @var string $ga_api_url Google Analytics API URL.
*/
protected $ga_api_url = 'https://www.googleapis.com/analytics/v3/';
/**
* Google Analytics Admin API URL.
*
* @since 2.0
* @var string $ga_admin_api_url Google Analytics Admin API URL.
*/
protected $ga_admin_api_url = 'https://analyticsadmin.googleapis.com/v1beta/';
/**
* Google Tag Manager API URL.
*
* @since 1.0
* @var string $gtm_api_url Google Tag Manager API URL.
*/
protected $gtm_api_url = 'https://www.googleapis.com/tagmanager/v2/';
/**
* Google Analytics API token.
*
* @since 1.0
* @var string $token Google Analytics Token.
*/
protected $token = null;
/**
* Add-on instance.
*
* @var GF_Google_Analytics
*/
private $addon;
/**
* Initialize API library.
*
* @since 1.0
*
* @param GF_Google_Analytics $addon GF_Google_Analytics instance.
* @param string $token Google Analytics API token.
*/
public function __construct( $addon, $token = null ) {
$this->token = $token;
$this->addon = $addon;
}
/**
* Make API request.
*
* @since 1.0
*
* @param string $path Request path.
* @param string $mode ga or gtm for Google Analytics or Tag Manager.
* @param array $body Body arguments.
* @param string $method Request method. Defaults to GET.
* @param string $return_key Array key from response to return. Defaults to null (return full response).
*
* @return array|WP_Error
*/
private function make_request( $path = '', $mode = 'ga', $body = array(), $method = 'GET', $return_key = null ) {
// Log API call succeed.
gf_google_analytics()->log_debug( __METHOD__ . '(): Making request to: ' . $path );
// Get API Key.
$token = $this->token;
// Get mode.
$api_url = '';
switch ( $mode ) {
case 'ga4':
$api_url = $this->ga_admin_api_url;
break;
case 'ga':
$api_url = $this->ga_api_url;
break;
case 'gtm':
$api_url = $this->gtm_api_url;
break;
default:
return new WP_Error( 'google_analytics_invalid_mode', esc_html__( 'The API mode supplied is not supported by the Google Analytics API.', 'gravityformsgoogleanalytics' ), array() );
}
// Build request URL.
$request_url = $api_url . $path;
$args = array(
'method' => $method,
/**
* Filters if SSL verification should occur.
*
* @param bool false If the SSL certificate should be verified. Defaults to false.
* @param string $request_url The request URL.
*
* @return bool
*/
'sslverify' => apply_filters( 'https_local_ssl_verify', false, $request_url ),
/**
* Sets the HTTP timeout, in seconds, for the request.
*
* @param int 30 The timeout limit, in seconds. Defaults to 30.
* @param string $request_url The request URL.
*
* @return int
*/
'timeout' => apply_filters( 'http_request_timeout', 30, $request_url ),
);
if ( 'GET' === $method || 'POST' === $method || 'PUT' === $method ) {
$args['body'] = empty( $body ) ? '' : $body;
$args['headers'] = array(
'Authorization' => 'Bearer ' . $token,
'Accept' => 'application/json;ver=1.0',
'Content-Type' => 'application/json; charset=UTF-8',
);
}
if ( 'POST' === $method ) {
$args['body'] = wp_json_encode( $body );
}
// Execute request.
$response = wp_remote_request(
$request_url,
$args
);
if ( is_wp_error( $response ) ) {
return $response;
}
$response_body = gf_google_analytics()->maybe_decode_json( wp_remote_retrieve_body( $response ) );
$retrieved_response_code = $response['response']['code'];
if ( 200 !== $retrieved_response_code ) {
$error_message = rgars( $response_body, 'error/message', "Expected response code: 200. Returned response code: {$retrieved_response_code}." );
$error_code = rgars( $response_body, 'error/errors/reason', 'google_analytics_api_error' );
gf_google_analytics()->log_error( __METHOD__ . '(): Unable to validate with the Google Analytics API: ' . $error_message );
return new WP_Error( $error_code, $error_message, $retrieved_response_code );
}
return $response_body;
}
/**
* Retrieve a refresh token when the original expires.
*
* @since 1.0.0
*
* @param string $refresh_token Refresh token to re-authorize.
*
* @return array|WP_Error
*/
public function refresh_token( $refresh_token ) {
// Connect to Gravity Form's API.
$response = wp_remote_post(
$this->addon->get_gravity_api_url( '/auth/googleanalytics/refresh' ),
array(
'body' => array(
'refresh_token' => rawurlencode( $refresh_token ),
),
)
);
if ( is_wp_error( $response ) ) {
return $response;
}
$response_body = gf_google_analytics()->maybe_decode_json( wp_remote_retrieve_body( $response ) );
$retrieved_response_code = $response['response']['code'];
if ( 200 !== absint( $retrieved_response_code ) || ! rgars( $response_body, 'token/access_token' ) ) {
$error_message = "Expected response code: 200. Returned response code: {$retrieved_response_code}.";
gf_google_analytics()->log_error( __METHOD__ . '(): Unable to Reauthorize refresh token: ' . $error_message );
gf_google_analytics()->log_error( __METHOD__ . '(): Response body: ' . var_export( $response_body, true ) );
return new WP_Error( 'google_analytics_api_error', $error_message, $retrieved_response_code );
}
return $response_body;
}
/**
* Get a list of Google Analytics accounts.
*
* @since 2.0.0
*
* @return array|WP_Error
*/
public function get_ga4_accounts() {
return $this->make_request(
'accountSummaries',
'ga4',
array()
);
}
/**
* Get a list of GA4 data streams.
*
* @since 2.0.0
*
* @param array $property GA4 property associated with the data streams. In the format "property/XXXX".
*
* @return array|WP_Error Returns an array of data streams.
*/
public function get_data_streams( $property ) {
return $this->make_request(
"{$property}/dataStreams",
'ga4',
array()
);
}
/**
* Creates a new Measurement Protocol API Secret.
*
* @since 2.0.0
*
* @param array $path The path to the data stream for which we're creating a secret.
*
* @return array|WP_Error Returns an array of measurement protocol secrets.
*/
public function create_api_secret( $path ) {
return $this->make_request(
$path . '/measurementProtocolSecrets',
'ga4',
array(
'displayName' => 'GravityFormsSecret',
),
'POST'
);
}
/**
* List Measurement Protocol API Secrets.
*
* @since 2.0.0
*
* @param array $path The path to the data stream for which we're retrieving secrets.
*
* @return array|WP_Error Returns an array of measurement protocol secrets.
*/
public function get_api_secrets( $path ) {
return $this->make_request(
$path . '/measurementProtocolSecrets',
'ga4',
array(),
'GET'
);
}
/**
* Get a list of tag manager accounts.
*
* @since 1.0.0
*
* @param array $body Body information.
*
* @return array|WP_Error
*/
public function get_tag_manager_account( $body ) {
return $this->make_request(
'accounts',
'gtm',
$body
);
}
/**
* Get a list of tag manager containers.
*
* @since 1.0.0
*
* @param array $body Body information.
* @param string $account_id Account to retrieve containers for.
*
* @return array|WP_Error
*/
public function get_tag_manager_containers( $body, $account_id ) {
return $this->make_request(
sprintf( 'accounts/%s/containers', $account_id ),
'gtm',
$body
);
}
/**
* Get a list of tag manager workspaces.
*
* @since 1.0.0
*
* @param array $body Body information.
* @param string $path Account path to request.
*
* @return array|WP_Error
*/
public function get_tag_manager_workspaces( $body, $path ) {
return $this->make_request(
sprintf( '%s/workspaces', $path ),
'gtm',
$body
);
}
/**
* Get a list of tag manager triggers.
*
* @since 2.0.0
*
* @param array $body Body information.
* @param string $path Account path to request.
* @param string $workspace The workspace to retrieve variables for.
*
* @return array|WP_Error
*/
public function get_tag_manager_triggers( $body, $path, $workspace ) {
return $this->make_request(
sprintf( '%s/workspaces/%s/triggers', $path, $workspace ),
'gtm',
$body
);
}
/**
* Get a list of tag manager variables.
*
* @since 1.0.0
*
* @param array $body Body information.
* @param string $path Account path to request.
* @param string $workspace The workspace to retrieve variables for.
*
* @return array|WP_Error
*/
public function get_tag_manager_variables( $body, $path, $workspace ) {
return $this->make_request(
sprintf( '%s/workspaces/%s/variables', $path, $workspace ),
'gtm',
$body
);
}
}