This repository has been archived on 2026-10-23. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
2015-05-01 18:05:29 +02:00

362 lines
8.4 KiB
PHP

<?php
/**
* @package GoogleAnalytics\Admin
*/
/**
* Google Analytics class.
*/
class Yoast_Google_Analytics {
/**
* @var string
*/
private $option_name = 'yst_ga_api';
/**
* @var array|mixed
*/
private $options = array();
/**
* @var null|Yoast_Google_Analytics
*/
private static $instance = null;
/**
* @var The api client object holder
*/
private $client;
/**
* Singleton
*
*/
protected function __construct() {
if ( is_null( self::$instance ) ) {
self::$instance = $this;
}
$this->options = $this->get_options();
// Setting the client
$this->set_client();
}
/**
* Getting the instance object
*
* This method will return the instance of itself, if instance not exists, becauses of it's called for the first
* time, the instance will be created.
*
* @return null|Yoast_Google_Analytics
*/
public static function get_instance() {
if ( is_null( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Check if something went wrong with API calls to Google Analytics
*/
public function check_for_ga_issues() {
$last_run = get_option( 'yst_ga_last_wp_run' );
$has_failed = get_option( 'yst_ga_api_call_fail', false );
// Show error, something went wrong
if ( $has_failed && ( $last_run === false || Yoast_GA_Utils::hours_between( strtotime( $last_run ), time() ) >= 48 ) ) {
$notice_type = 'warning_fetching_data';
// Authentication has been successful, so there will be an access token
if ( ! $this->client->getAccessToken() ) {
$notice_type .= '_authenticate';
}
add_action( 'admin_notices', array( 'Yoast_Google_Analytics_Notice', $notice_type ) );
}
}
/**
* Wrapper for authenticate the client. If authentication code is send it will get and check an access token.
*
* @param mixed $authentication_code
*
* @return boolean
*/
public function authenticate( $authentication_code = null ) {
// When authentication again we should clean up some stuff
$this->api_cleanup();
return $this->client->authenticate_client( $authentication_code );
}
/**
* Getting the analytics profiles
*
* Doing the request to the Google analytics API and if there is a response, parses this response and return its
* array
*
* @return array
*/
public function get_profiles() {
$accounts = $this->format_profile_call(
$this->do_request( 'https://www.googleapis.com/analytics/v3/management/accountSummaries' )
);
if ( is_array( $accounts ) ) {
$this->save_profile_response( $accounts );
return $accounts;
}
return array();
}
/**
* Doing request to Google Analytics
*
* This method will do a request to google and get the response code and body from content
*
* @param string $target_request_url
*
* @return array|null
*/
public function do_request( $target_request_url ) {
$response = $this->client->do_request( $target_request_url );
if ( ! empty( $response ) ) {
return array(
'response' => array( 'code' => $this->client->get_http_response_code() ),
'body' => json_decode( $response->getResponseBody(), true ),
);
}
}
/**
* Check if client has a refresh token
* @return bool
*/
public function has_refresh_token() {
return ( $this->client->get_refresh_token() != '' );
}
/**
* Getting the options bases on $this->option_name from the database
*
* @return mixed
*/
public function get_options() {
return get_option( $this->option_name );
}
/**
* Checks whether we'll ever be able to reach Google.
*
* @return bool
*/
public function check_google_access_from_wp() {
$can_access_google = true;
if ( defined( 'WP_HTTP_BLOCK_EXTERNAL' ) && WP_HTTP_BLOCK_EXTERNAL ) {
$can_access_google = false;
if ( defined( 'WP_ACCESSIBLE_HOSTS' ) ) {
// Better to use the internal WP logic from this point forward.
$can_access_google = $this->test_connection_to_google();
}
}
return $can_access_google;
}
/**
* Check if we can access Google Apis from this server by making a dummy connection
*/
public function check_google_access() {
return $this->test_connection_to_google();
}
/**
* Updating the options based on $this->option_name and the internal property $this->options
*/
protected function update_options() {
update_option( $this->option_name, $this->options );
}
/**
* Setting the client
*
* The filter is a hook to override the configuration/
*/
protected function set_client() {
$config = array(
'application_name' => 'Google Analytics by Yoast',
'client_id' => '346753076522-21smrc6aq0hq8oij8001s57dfoo8igf5.apps.googleusercontent.com',
'client_secret' => '5oWaEGFgp-bSrY6vWBmdPfIF',
);
$config = apply_filters( 'yst-ga-filter-ga-config', $config );
$this->client = new Yoast_Google_Analytics_Client( $config );
}
/**
* Gets an authentication URL
*
* @return mixed
*/
public function create_auth_url() {
return $this->client->createAuthUrl();
}
/**
* Saving profile response in options
*
* @param array $accounts
*/
protected function save_profile_response( $accounts ) {
$this->options['ga_api_response_accounts'] = $accounts;
$this->update_options();
}
/**
* Test a connection to Google
*
* @return bool
*/
private function test_connection_to_google() {
$wp_http = new WP_Http();
if ( $wp_http->block_request( 'https://www.googleapis.com/analytics/v3/management/accountSummaries' ) === false ) {
return true;
}
return false;
}
/**
* Format the accounts request
*
* @param array $response
*
* @return mixed
*/
private function format_profile_call( $response ) {
if ( isset( $response['response']['code'] ) && $response['response']['code'] == 200 ) {
if ( ! empty( $response['body']['items'] ) && is_array( $response['body']['items'] ) ) {
$accounts = array();
foreach ( $response['body']['items'] as $item ) {
// Check if webProperties is set
if ( isset( $item['webProperties'] ) ) {
$profiles = array();
foreach ( $item['webProperties'] as $property_key => $property ) {
$profiles[ $property_key ] = array(
'id' => $property['id'],
'name' => $property['name'],
'items' => array(),
);
// Check if profiles is set
if ( isset( $property['profiles'] ) ) {
foreach ( $property['profiles'] as $key => $profile ) {
$profiles[ $property_key ]['items'][ $key ] = array_merge(
$profile,
array(
'name' => $profile['name'] . ' (' . $property['id'] . ')',
'ua_code' => $property['id'],
)
);
}
}
}
$accounts[ $item['id'] ] = array(
'id' => $item['id'],
'ua_code' => $property['id'],
'parent_name' => $item['name'],
'items' => $profiles,
);
}
}
return $accounts;
}
}
return false;
}
/**
* Doing some clean up when this method is called
*/
private function api_cleanup() {
delete_option( 'yst_ga_api_call_fail' );
}
}
/**
* Notice class.
*/
class Yoast_Google_Analytics_Notice {
/**
* Throw a warning if no UA code is set.
*/
public static function config_warning() {
self::show_error(
sprintf( __( 'Please configure your %sGoogle Analytics settings%s!', 'google-analytics-for-wordpress' ),
'<a href="' . admin_url( 'admin.php?page=yst_ga_settings' ) . '">',
'</a>'
)
);
}
/**
* Throw a warning when the fetching failed
*/
public static function warning_fetching_data_authenticate() {
self::show_error(
sprintf(
__( 'It seems the authentication for the plugin has expired, please %sre-authenticate%s with Google Analytics to allow the plugin to fetch data.', 'google-analytics-for-wordpress' ),
'<a href="' . admin_url( 'admin.php?page=yst_ga_settings' ) . '">',
'</a>'
)
);
}
/**
* Throw a warning when the fetching failed
*/
public static function warning_fetching_data() {
self::show_error(
sprintf(
__( 'Data is not up-to-date, there was an error in retrieving the data from Google Analytics. This error could be caused by several issues. If the error persists, please see %sthis page%s.', 'google-analytics-for-wordpress' ),
'<a href="http://yoa.st/2p">',
'</a>'
)
);
}
/**
* Showing the given error as an error div
*
* @param string $error_message
*/
private static function show_error( $error_message ) {
echo '<div class="error"><p>' . $error_message . '</p></div>';
}
}