*/ class Google_Analytics_OBFX_Module extends Orbit_Fox_Module_Abstract { /** * @var string Uptime api endpoint. */ private $api_url = 'https://analytics.orbitfox.com/api/pirate-bridge/v1'; /** * Test_OBFX_Module constructor. * * @since 4.0.3 * @access public */ public function __construct() { parent::__construct(); $this->name = __( 'Analytics Integration', 'themeisle-companion' ); $this->description = __( 'A module to integrate Google Analytics into your site easily.', 'themeisle-companion' ); } /** * Determine if module should be loaded. * * @since 1.0.0 * @access public * @return bool */ public function enable_module() { return true; } /** * The loading logic for the module. * * @since 1.0.0 * @access public */ public function load() { } /** * Method called on module activation. * Calls the API to register an url to monitor. * * @since 2.3.3 * @access public */ public function after_options_save() { } /** * Method invoked before options save. * * @since 2.3.3 * @access public */ public function before_options_save() { $this->deactivate(); } /** * Method to define hooks needed. * * @since 1.0.0 * @access public */ public function hooks() { $this->loader->add_action( 'rest_api_init', $this, 'register_endpoints' ); $this->loader->add_action( 'current_screen', $this, 'maybe_save_obfx_token' ); $this->loader->add_action( 'admin_enqueue_scripts', $this, 'enqueue_analytics_scripts' ); $this->loader->add_action( 'wp_head', $this, 'output_analytics_code', 0 ); } /** * Register endpoint for refreshing analytics. */ public function register_endpoints() { register_rest_route( 'obfx-' . $this->slug, '/obfx-analytics', array( array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => array( $this, 'refresh_tracking_links' ), 'permission_callback' => function () { return current_user_can( 'manage_options' ); }, ), ) ); } /** * Refresh Tracking links. * * @return array|bool|WP_Error */ public function refresh_tracking_links() { if ( ! current_user_can( 'manage_options' ) ) { return false; } $obfx_token = get_option( 'obfx_token', '' ); if ( ( $_POST['deactivate'] === 'unregister' ) ) { //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated return $this->unregister_website( $obfx_token ); } if ( empty( $obfx_token ) ) { return new WP_Error( '200', 'Your site is not registered.' ); } $this->get_tracking_codes( $obfx_token, true ); } /** * Unregister website. * * @param $obfx_token * * @return array|bool|WP_Error */ public function unregister_website( $obfx_token ) { if ( ! isset( $obfx_token ) ) { return false; } delete_option( 'obfx_token' ); delete_option( 'obfx_google_accounts_tracking_codes' ); $req_headers = array( 'x-obfx-auth' => $obfx_token ); $req_body = array( 'site_url' => home_url(), 'site_hash' => $this->get_site_hash(), ); $request = wp_remote_post( $this->api_url . '/remove_website', array( 'headers' => $req_headers, 'body' => $req_body, ) ); return $request; } /** * Method that returns an array of scripts and styles to be loaded * for the front end part. * * @since 1.0.0 * @access public * @return array */ public function public_enqueue() { return array(); } /** * Enqueue JavaScript that requires localization. */ public function enqueue_analytics_scripts() { $current_screen = get_current_screen(); if ( ! isset( $current_screen->id ) ) { return array(); } if ( $current_screen->id != 'toplevel_page_obfx_companion' ) { return array(); } $script_handle = $this->slug . '-script'; wp_register_script( $script_handle, plugin_dir_url( $this->get_dir() ) . $this->slug . '/js/script.js', array( 'jquery' ), $this->version, true ); wp_localize_script( $script_handle, 'obfxAnalyticsObj', array( 'url' => $this->get_endpoint_url( '/obfx-analytics' ), 'nonce' => wp_create_nonce( 'wp_rest' ), ) ); wp_enqueue_script( $script_handle ); } /** * Returns rest endpoint url. * * @param string $path * * @return string */ public function get_endpoint_url( $path = '' ) { return rest_url( 'obfx-' . $this->slug . $path ); } /** * Method that returns an array of scripts and styles to be loaded * for the admin part. * * @since 1.0.0 * @access public * @return array|boolean */ public function admin_enqueue() { return array(); } /** * Method to define the options fields for the module * * @since 1.0.0 * @access public * @return array */ public function options() { $token = get_option( 'obfx_token', '' ); if ( empty( $token ) ) { $url = $this->api_url . '/auth'; $url = add_query_arg( array( 'site_hash' => $this->get_site_hash(), 'site_url' => home_url(), 'site_return' => admin_url( 'admin.php?page=obfx_companion#obfx-mod-google-analytics' ), ), $url ); return array( array( 'id' => 'google_signin', 'name' => 'google_signin', 'type' => 'link', 'url' => $url, 'link-class' => 'btn btn-success', 'text' => '' . __( 'Authenticate with Google', 'themeisle-companion' ), ), ); } $options = array( '-' => __( 'Select a tracking code', 'themeisle-companion' ) . '...' ); $accounts = get_option( 'obfx_google_accounts_tracking_codes', array() ); if ( ! empty( $accounts ) ) { foreach ( $accounts as $account ) { if ( ! isset( $account->tracking_code ) ) { continue; } $options[ $account->tracking_code ] = $account->account_name . ' - ' . $account->tracking_code; } } return array( array( 'id' => 'analytics_accounts_refresh', 'name' => 'analytics_accounts_refresh', 'type' => 'link', 'link-class' => 'btn btn-primary btn-sm', 'link-id' => 'refresh-analytics-accounts', 'text' => ' ' . __( 'Refresh Accounts', 'themeisle-companion' ), 'url' => '', ), array( 'id' => 'analytics_accounts_select', 'name' => 'analytics_accounts_select', 'type' => 'select', 'options' => $options, 'default' => '-', ), array( 'id' => 'analytics_accounts_unregister', 'name' => 'analytics_accounts_unregister', 'type' => 'link', 'link-class' => 'btn btn-sm', 'link-id' => 'unregister-analytics', 'text' => '' . __( 'Unregister Site', 'themeisle-companion' ), 'url' => '', ), ); } /** * Get tracking codes from server. * * @param string $obfx_token * @param bool $forced * * @return bool|string */ public function get_tracking_codes( $obfx_token = '', $forced = false ) { if ( empty( $obfx_token ) ) { return false; } $req_headers = array( 'x-obfx-auth' => $obfx_token ); $req_body = array( 'site_url' => home_url(), 'site_hash' => $this->get_site_hash(), 'forced_update' => 'not_forced', ); if ( $forced === true ) { $req_body['forced_update'] = 'forced_update'; } $request = wp_remote_post( $this->api_url . '/get_tracking_links', array( 'headers' => $req_headers, 'body' => $req_body, ) ); if ( empty( $request['body'] ) ) { return false; } $accounts = json_decode( $request['body'] ); if ( empty( $accounts ) ) { return false; } update_option( 'obfx_google_accounts_tracking_codes', $accounts ); } /** * Generate a website hash. * * @return string */ final private function get_site_hash() { $hash_base = ''; if ( defined( 'AUTH_KEY' ) && defined( 'SECURE_AUTH_KEY' ) && defined( 'LOGGED_IN_KEY' ) ) { $hash_base = AUTH_KEY . SECURE_AUTH_KEY . LOGGED_IN_KEY; } else { $hash_base = sha1( ABSPATH ) . sha1( get_site_url() ); } $pre_hash = rtrim( ltrim( sanitize_text_field( preg_replace( '/[^a-zA-Z0-9]/', '', $hash_base ) ) ) ); if ( function_exists( 'mb_strimwidth' ) ) { return mb_strimwidth( $pre_hash, 0, 100 ); } return substr( $pre_hash, 0, 100 ); } final public function maybe_save_obfx_token() { $obfx_token = isset( $_GET['obfx_token'] ) ? sanitize_text_field( $_GET['obfx_token'] ) : ''; if ( empty( $obfx_token ) ) { return ''; } if ( ! is_admin() ) { return ''; } $current_screen = get_current_screen(); if ( ! isset( $current_screen->id ) ) { return ''; } if ( $current_screen->id !== 'toplevel_page_obfx_companion' ) { return ''; } if ( ! current_user_can( 'manage_options' ) ) { return ''; } update_option( 'obfx_token', $obfx_token ); $this->get_tracking_codes( $obfx_token ); wp_safe_redirect( admin_url( 'admin.php?page=obfx_companion' ) ); exit; } final public function output_analytics_code() { $ua_code = $this->get_option( 'analytics_accounts_select' ); ?>