options = $this->get_options(); $this->api = Yoast_Api_Libs::load_api_libraries( array( 'google', 'googleanalytics' ) ); $dashboards = Yoast_GA_Dashboards::get_instance(); // Listener for reconnecting with google analytics $this->google_analytics_listener(); if ( is_null( $this->get_tracking_code() ) && $this->show_admin_warning() ) { add_action( 'admin_notices', array( 'Yoast_Google_Analytics_Notice', 'config_warning' ) ); } // Check if something has went wrong with GA-api calls $has_tracking_code = ( ! is_null( $this->get_tracking_code() ) && empty( $this->options['manual_ua_code_field'] ) ); if ( $has_tracking_code && $this->show_admin_dashboard_warning() ) { Yoast_Google_Analytics::get_instance()->check_for_ga_issues(); } if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) { $this->handle_ga_post_request( $dashboards ); } /** * Show the notifications if we have one */ $this->show_notification( 'ga_notifications' ); // Load the Google Analytics Dashboards functionality $dashboards->init_dashboards( $this->get_current_profile() ); } /** * This function saves the settings in the option field and returns a wp success message on success * * @param array $data */ public function save_settings( $data ) { unset( $data['google_auth_code'] ); foreach ( $data as $key => $value ) { if ( $key != 'return_tab' ) { if ( $key != 'custom_code' && is_string( $value ) ) { $value = strip_tags( $value ); } $this->options[ $key ] = $value; } } // Check checkboxes, on a uncheck they won't be posted to this function $defaults = $this->default_ga_values(); foreach ( $defaults[ $this->option_prefix ] as $option_name => $value ) { $this->handle_default_setting( $data, $option_name, $value ); } if ( ! empty( $this->options['analytics_profile'] ) ) { $this->options['analytics_profile_code'] = $this->get_ua_code_from_profile( $this->options['analytics_profile'] ); } if ( ! empty( $this->options['manual_ua_code_field'] ) ) { $this->options['manual_ua_code_field'] = trim( $this->options['manual_ua_code_field'] ); // en dash to minus, prevents issue with code copied from web with "fancy" dash $this->options['manual_ua_code_field'] = str_replace( '–', '-', $this->options['manual_ua_code_field'] ); if ( ! preg_match( '|^UA-\d{4,}-\d+$|', $this->options['manual_ua_code_field'] ) ) { $this->add_notification( 'ga_notifications', array( 'type' => 'error', 'description' => __( 'The UA code needs to follow UA-XXXXXXXX-X format.', 'google-analytics-for-wordpress' ), ) ); wp_redirect( admin_url( 'admin.php' ) . '?page=yst_ga_settings#top#' . $data['return_tab'], 301 ); exit; } } if ( $this->update_option( $this->options ) ) { // Success, add a new notification $this->add_notification( 'ga_notifications', array( 'type' => 'success', 'description' => __( 'Settings saved.', 'google-analytics-for-wordpress' ), ) ); } else { // Fail, add a new notification $this->add_notification( 'ga_notifications', array( 'type' => 'error', 'description' => __( 'There were no changes to save, please try again.', 'google-analytics-for-wordpress' ), ) ); } // redirect wp_redirect( admin_url( 'admin.php' ) . '?page=yst_ga_settings#top#' . $data['return_tab'], 301 ); exit; } /** * Run a this deactivation hook on deactivation of GA. When this happens we'll * remove the options for the profiles and the refresh token. */ public static function ga_deactivation_hook() { // Remove the refresh token and other API settings self::analytics_api_clean_up(); } /** * Handle a default setting in GA * * @param array $data * @param string $option_name * @param mixed $value */ private function handle_default_setting( $data, $option_name, $value ) { if ( ! isset( $data[ $option_name ] ) ) { // If no data was passed in, set it to the default. if ( $value === 1 ) { // Disable the checkbox for now, use value 0 $this->options[ $option_name ] = 0; } else { $this->options[ $option_name ] = $value; } } } /** * Handle the post requests in the admin form of the GA plugin * * @param Yoast_GA_Dashboards $dashboards */ private function handle_ga_post_request( $dashboards ) { if ( ! function_exists( 'wp_verify_nonce' ) ) { require_once( ABSPATH . 'wp-includes/pluggable.php' ); } if ( isset( $_POST['ga-form-settings'] ) && wp_verify_nonce( $_POST['yoast_ga_nonce'], 'save_settings' ) ) { if ( ! isset ( $_POST['ignore_users'] ) ) { $_POST['ignore_users'] = array(); } $dashboards_disabled = Yoast_GA_Settings::get_instance()->dashboards_disabled(); if ( ( $dashboards_disabled == false && isset( $_POST['dashboards_disabled'] ) ) || $this->ga_profile_changed( $_POST ) ) { $dashboards->reset_dashboards_data(); } // Post submitted and verified with our nonce $this->save_settings( $_POST ); } } /** * Is there selected an other property in the settings post? Returns true or false. * * @param array $post * * @return bool */ private function ga_profile_changed( $post ) { if ( isset( $post['analytics_profile'] ) && isset( $this->options['analytics_profile'] ) ) { if ( $post['analytics_profile'] != $this->options['analytics_profile'] ) { return true; } } return false; } /** * Are we allowed to show a warning message? returns true if it's allowed * * @return bool */ private function show_admin_warning() { return ( current_user_can( 'manage_options' ) && ( ! isset( $_GET['page'] ) || ( isset( $_GET['page'] ) && $_GET['page'] !== 'yst_ga_settings' ) ) ); } /** * Are we allowed to show a warning message? returns true if it's allowed ( this is meant to be only for dashboard ) * * @return bool */ private function show_admin_dashboard_warning() { return ( current_user_can( 'manage_options' ) && isset( $_GET['page'] ) && $_GET['page'] === 'yst_ga_dashboard' ); } /** * Transform the Profile ID into an helpful UA code * * @param integer $profile_id * * @return null */ private function get_ua_code_from_profile( $profile_id ) { $profiles = $this->get_profiles(); $ua_code = null; foreach ( $profiles as $account ) { foreach ( $account['items'] as $profile ) { foreach ( $profile['items'] as $subprofile ) { if ( isset( $subprofile['id'] ) && $subprofile['id'] === $profile_id ) { return $subprofile['ua_code']; } } } } return $ua_code; } /** * Add a link to the settings page to the plugins list * * @param array $links array of links for the plugins, adapted when the current plugin is found. * * @return array $links */ public function add_action_links( $links ) { // add link to knowledgebase // @todo UTM link fix $faq_link = '' . __( 'FAQ', 'google-analytics-for-wordpress' ) . ''; array_unshift( $links, $faq_link ); $settings_link = '' . __( 'Settings', 'google-analytics-for-wordpress' ) . ''; array_unshift( $links, $settings_link ); return $links; } /** * Adds some promo text for the premium plugin on the custom dimensions tab. */ public function premium_promo() { echo '
'; echo '

'; printf( __( 'If you want to track custom dimensions like page views per author or post type, you should upgrade to the %1$spremium version of Google Analytics by Yoast%2$s.', 'google-analytics-for-wordpress' ), '', '' ); echo ' '; _e( 'This will also give you email access to the support team at Yoast, who will provide support on the plugin 24/7.', 'google-analytics-for-wordpress' ); echo '

'; echo '
'; } /** * Initialize the promo class for our translate site * * @return yoast_i18n */ public function translate_promo() { $yoast_ga_i18n = new yoast_i18n( array( 'textdomain' => 'google-analytics-for-wordpress', 'project_slug' => 'google-analytics-for-wordpress', 'plugin_name' => 'Google Analytics by Yoast', 'hook' => 'yoast_ga_admin_footer', 'glotpress_url' => 'https://translate.yoast.com', 'glotpress_name' => 'Yoast Translate', 'glotpress_logo' => 'https://cdn.yoast.com/wp-content/uploads/i18n-images/Yoast_Translate.svg', 'register_url ' => 'https://translate.yoast.com/projects#utm_source=plugin&utm_medium=promo-box&utm_campaign=yoast-ga-i18n-promo', ) ); return $yoast_ga_i18n; } /** * Load the page of a menu item in the GA plugin */ public function load_page() { $this->translate_promo(); if ( ! has_action( 'yst_ga_custom_dimensions_tab-content' ) ) { add_action( 'yst_ga_custom_dimensions_tab-content', array( $this, 'premium_promo' ) ); } if ( ! has_action( 'yst_ga_custom_dimension_add-dashboards-tab' ) ) { add_action( 'yst_ga_custom_dimension_add-dashboards-tab', array( $this, 'premium_promo' ) ); } switch ( filter_input( INPUT_GET, 'page' ) ) { case 'yst_ga_settings': require_once( $this->plugin_path . 'admin/pages/settings.php' ); break; case 'yst_ga_extensions': require_once( $this->plugin_path . 'admin/pages/extensions.php' ); break; case 'yst_ga_dashboard': default: require_once( $this->plugin_path . 'admin/pages/dashboard.php' ); break; } } /** * Get the Google Analytics profiles which are in this google account * * @return array */ public function get_profiles() { $return = Yoast_Google_Analytics::get_instance()->get_profiles(); return $return; } /** * Checks if there is a callback to get token from Google Analytics API */ private function google_analytics_listener() { $google_auth_code = filter_input( INPUT_POST, 'google_auth_code' ); if ( $google_auth_code && current_user_can( 'manage_options' ) && wp_verify_nonce( filter_input( INPUT_POST, 'yoast_ga_nonce' ), 'save_settings' ) ) { self::analytics_api_clean_up(); Yoast_Google_Analytics::get_instance()->authenticate( trim( $google_auth_code ) ); } } /** * Clean up the Analytics API settings */ public static function analytics_api_clean_up() { delete_option( 'yoast-ga-refresh_token' ); delete_option( 'yst_ga_api_call_fail' ); delete_option( 'yst_ga_last_wp_run' ); delete_option( 'yst_ga_api' ); } /** * Get the current GA profile * * @return null */ private function get_current_profile() { if ( ! empty( $this->options['analytics_profile'] ) ) { return $this->options['analytics_profile']; } return null; } /** * Get the user roles of this WordPress blog * * @return array */ public function get_userroles() { global $wp_roles; $all_roles = $wp_roles->roles; $roles = array(); /** * Filter: 'editable_roles' - Allows filtering of the roles shown within the plugin (and elsewhere in WP as it's a WP filter) * * @api array $all_roles */ $editable_roles = apply_filters( 'editable_roles', $all_roles ); foreach ( $editable_roles as $id => $name ) { $roles[] = array( 'id' => $id, 'name' => translate_user_role( $name['name'] ), ); } return $roles; } /** * Get types of how we can track downloads * * @return array */ public function track_download_types() { return array( 0 => array( 'id' => 'event', 'name' => __( 'Event', 'google-analytics-for-wordpress' ) ), 1 => array( 'id' => 'pageview', 'name' => __( 'Pageview', 'google-analytics-for-wordpress' ) ), ); } /** * Get options for the track full url or links setting * * @return array */ public function get_track_full_url() { return array( 0 => array( 'id' => 'domain', 'name' => __( 'Just the domain', 'google-analytics-for-wordpress' ) ), 1 => array( 'id' => 'full_links', 'name' => __( 'Full links', 'google-analytics-for-wordpress' ) ), ); } /** * Render the admin page head for the GA Plugin */ public function content_head() { require 'views/content_head.php'; } /** * Render the admin page footer with sidebar for the GA Plugin */ public function content_footer() { do_action( 'yoast_ga_admin_footer' ); if ( true == WP_DEBUG ) { // Show the debug information if debug is enabled in the wp_config file echo '

' . __( 'Debug information', 'google-analytics-for-wordpress' ) . '

';
			var_dump( $this->options );
			echo '
'; } if ( class_exists( 'Yoast_Product_GA_Premium' ) ) { $license_manager = new Yoast_Plugin_License_Manager( new Yoast_Product_GA_Premium() ); if ( $license_manager->license_is_valid() ) { return; } } $banners = array(); $banners[] = array( 'url' => 'https://yoast.com/hire-us/website-review/#utm_medium=banner&utm_source=gawp-config&utm_campaign=wpgaplugin', 'banner' => $this->plugin_url . 'assets/img/banner-website-review.png', 'title' => 'Get a website review by Yoast', ); $banners[] = array( 'url' => 'https://yoast.com/wordpress/plugins/google-analytics/#utm_medium=banner&utm_source=gawp-config&utm_campaign=wpgaplugin', 'banner' => $this->plugin_url . 'assets/img/banner-premium-ga.png', 'title' => 'Get the premium version of Google Analytics by Yoast!', ); $banners[] = array( 'url' => 'https://yoast.com/ebook-optimize-wordpress-site/#utm_medium=banner&utm_source=gawp-config&utm_campaign=wpgaplugin', 'banner' => $this->plugin_url . 'assets/img/eBook_261x130.png', 'title' => 'Get the Yoast ebook!', ); $banners[] = array( 'url' => 'https://yoast.com/wordpress/plugins/ga-ecommerce/#utm_medium=banner&utm_source=gawp-config&utm_campaign=wpgaplugin', 'banner' => $this->plugin_url . 'assets/img/banner-ga-ecommerce.png', 'title' => 'Get advanced eCommerce tracking for WooCommerce and Easy Digital Downloads!', ); shuffle( $banners ); require 'views/content-footer.php'; } /** * Returns a list of all available extensions * * @return array */ public function get_extensions() { $extensions = array( 'ga_premium' => (object) array( 'url' => 'https://yoast.com/wordpress/plugins/google-analytics/', 'title' => __( 'Google Analytics by Yoast Premium', 'google-analytics-for-wordpress' ), 'desc' => __( 'The premium version of Google Analytics by Yoast with more features and support.', 'google-analytics-for-wordpress' ), 'status' => 'uninstalled', ), 'ecommerce' => (object) array( 'url' => 'https://yoast.com/wordpress/plugins/ga-ecommerce/', 'title' => __( 'Google Analytics by Yoast', 'google-analytics-for-wordpress' ) . '
' . __( 'eCommerce tracking', 'google-analytics-for-wordpress' ), 'desc' => __( 'Track your eCommerce data and transactions with this eCommerce extension for Google Analytics.', 'google-analytics-for-wordpress' ), 'status' => 'uninstalled', ), ); $extensions = apply_filters( 'yst_ga_extension_status', $extensions ); return $extensions; } /** * Add a notification to the notification transient * * @param string $transient_name * @param array $settings */ private function add_notification( $transient_name, $settings ) { set_transient( $transient_name, $settings, MINUTE_IN_SECONDS ); } /** * Show the notification that should be set, after showing the notification this function unset the transient * * @param string $transient_name The name of the transient which contains the notification */ public function show_notification( $transient_name ) { $transient = get_transient( $transient_name ); if ( isset( $transient['type'] ) && isset( $transient['description'] ) ) { if ( $transient['type'] == 'success' ) { add_settings_error( 'yoast_google_analytics', 'yoast_google_analytics', $transient['description'], 'updated' ); } else { add_settings_error( 'yoast_google_analytics', 'yoast_google_analytics', $transient['description'], 'error' ); } delete_transient( $transient_name ); } } }