settings menu add_action('admin_menu', array($this, 'add_to_settings_menu')); // Show warning if debug mode is on add_action('admin_notices', array($this, 'show_admin_notice')); // Check for database upgrades add_action('plugins_loaded', array($this, 'perform_upgrade')); add_action('plugins_loaded', array($this, 'load_text_domain')); } public static function load_text_domain() { load_plugin_textdomain('ank-simplified-ga', false, dirname(plugin_basename(ASGA_BASE_FILE)) . '/languages/'); } /* * Save default settings upon plugin activation */ public function do_upon_plugin_activation() { // If db options not exists then update with defaults // Note: Always check against false if (get_option(ASGA_OPTION_NAME, false) === false) { update_option(ASGA_OPTION_NAME, $this->get_default_options()); } } /** * Register plugin settings, using WP settings API */ public function register_plugin_settings() { register_setting(self::PLUGIN_OPTION_GROUP, ASGA_OPTION_NAME, array($this, 'validate_form_post')); } /** * Adds a 'Settings' link for this plugin on plugin listing page * @param $links * @return array Links array */ public function add_plugin_actions_links($links) { if (current_user_can('manage_options')) { $url = add_query_arg('page', self::PLUGIN_SLUG, 'options-general.php'); array_unshift( $links, sprintf('%s', $url, __('Settings', 'ank-simplified-ga')) ); } return $links; } /** * Adds link to Plugin Option page and do related stuff */ public function add_to_settings_menu() { $page_hook_suffix = add_submenu_page( 'options-general.php', 'Google Analytics Simplified ', //page title 'Google Analytics', //menu name 'manage_options', self::PLUGIN_SLUG, array($this, 'load_options_page')); // Add help stuff via tab add_action("load-$page_hook_suffix", array($this, 'add_help_menu_tab')); // We can load additional css/js to our option page here add_action('admin_print_scripts-' . $page_hook_suffix, array($this, 'add_admin_assets')); } /** * Return default options for this plugin * @return array */ private function get_default_options() { $defaults = array( 'plugin_ver' => ASGA_PLUGIN_VER, 'ga_id' => '', 'js_location' => 1, 'js_priority' => 20, 'log_404' => 0, 'ua_enabled' => 1, 'displayfeatures' => 0, 'ga_ela' => 0, 'anonymise_ip' => 0, 'ga_domain' => '', 'sample_rate' => 100, 'debug_mode' => 0, 'force_ssl' => 1, 'custom_trackers' => '', 'allow_linker' => 0, 'allow_anchor' => 0, 'tag_rss_links' => 1, 'track_mail_links' => 0, 'track_outbound_links' => 0, 'track_outbound_link_type' => 1, 'track_download_links' => 0, 'track_download_ext' => 'doc*,xls*,ppt*,pdf,zip,rar,exe,mp3', 'track_non_interactive' => 1 ); // Ignored some roles by default $ignored_roles = array('networkAdmin', 'administrator', 'editor'); // Store roles to db foreach ($this->get_all_roles() as $role) { if (in_array($role['id'], $ignored_roles)) { $defaults['ignore_role_' . $role['id']] = 1; } else { $defaults['ignore_role_' . $role['id']] = 0; } } return $defaults; } /** * Callback Function to handle and validate the form data * * @param array $in - POST array * @returns array - Validated array */ public function validate_form_post($in) { $out = array(); $errors = array(); //Always store plugin version to db $out['plugin_ver'] = ASGA_PLUGIN_VER; // Get the actual tracking ID if (!preg_match('|^UA-\d{4,}-\d+$|', (string)$in['ga_id'])) { $out['ga_id'] = ''; // Warn user that the entered id is not valid $errors[] = __('Your GA tracking ID seems invalid. Please validate.', 'ank-simplified-ga'); } else { $out['ga_id'] = sanitize_text_field($in['ga_id']); } $radio_items = array('js_location'); foreach ($radio_items as $item) { $out[$item] = absint($in[$item]); } $out['js_priority'] = (trim($in['js_priority']) == '') ? 20 : absint($in['js_priority']); $out['ga_domain'] = sanitize_text_field(($in['ga_domain'])); // http://stackoverflow.com/questions/9549866/php-regex-to-remove-http-from-string $out['ga_domain'] = preg_replace('#^https?://#', '', $out['ga_domain']); $out['sample_rate'] = floatval(($in['sample_rate'])); // Sample rate should be between 1 to 100 if ($out['sample_rate'] <= 0 || $out['sample_rate'] > 100) { $out['sample_rate'] = 100; $errors[] = __('Sample rate should be between 1 to 100.', 'ank-simplified-ga'); } $out['custom_trackers'] = trim($in['custom_trackers']); $checkbox_items = array('ua_enabled', 'anonymise_ip', 'displayfeatures', 'ga_ela', 'log_404', 'debug_mode', 'force_ssl', 'allow_linker', 'allow_anchor', 'tag_rss_links', 'track_mail_links', 'track_outbound_links', 'track_download_links', 'track_outbound_link_type', 'track_non_interactive'); // Add rolls to checkbox_items array foreach ($this->get_all_roles() as $role) { $checkbox_items[] = 'ignore_role_' . $role['id']; } foreach ($checkbox_items as $item) { if (isset($in[$item]) && '1' == $in[$item]) { $out[$item] = 1; } else { $out[$item] = 0; } } // Extensions to be tracked as downloads $out['track_download_ext'] = sanitize_text_field($in['track_download_ext']); // Show all form errors in a single notice if (!empty($errors)) { add_settings_error('ank-simplified-ga', 'ank-simplified-ga', implode('
', $errors)); } return $out; } /** * Function will print our option page form */ public function load_options_page() { if (!current_user_can('manage_options')) { wp_die(__('You don\'t have sufficient permissions to access this page.', 'ank-simplified-ga')); } $this->load_view('settings-page.php'); } /** * Return all roles plus superAdmin if multi-site is enabled * @return array */ private function get_all_roles() { global $wp_roles; $return_roles = array(); if (!isset($wp_roles)) $wp_roles = new \WP_Roles(); $role_list = $wp_roles->roles; /** * Filter: 'editable_roles' - Allows filtering of the roles shown within the plugin (and elsewhere in WP as it's a WP filter) * * @api array $role_list */ $editable_roles = apply_filters('editable_roles', $role_list); foreach ($editable_roles as $id => $role) { $return_roles[] = array( 'id' => $id, 'name' => translate_user_role($role['name']), ); } // Append a custom role if multi-site is enabled if (is_multisite()) { $return_roles[] = array( 'id' => 'networkAdmin', 'name' => __('Network Administrator', 'ank-simplified-ga') ); } return $return_roles; } /** * Show a warning notice if debug mode is on */ public function show_admin_notice() { // Show only for this plugin option page if (strpos(get_current_screen()->id, self::PLUGIN_SLUG) === false) return; $options = $this->get_safe_options(); // If debug mode is off return early if ($options['debug_mode'] == 0) return; $this->load_view('admin-notice.php', array()); } /** * Get fail safe options * @return array */ private function get_safe_options() { // Get fresh options from db $db_options = get_option(ASGA_OPTION_NAME); // Be fail safe, if not array then array_merge may fail if (!is_array($db_options)) { $db_options = array(); } // If options not exists in db then init with defaults , also always append default options to existing options $db_options = empty($db_options) ? $this->get_default_options() : array_merge($this->get_default_options(), $db_options); return $db_options; } /** * Upgrade plugin database options */ public function perform_upgrade() { // Get fresh options from db $db_options = get_option(ASGA_OPTION_NAME); // Check if we need to proceed , if no return early if ($this->should_proceed_to_upgrade($db_options) === false) return; // Get default options $default_options = $this->get_default_options(); // Merge with db options , preserve old $new_options = (empty($db_options)) ? $default_options : array_merge($default_options, $db_options); // Update plugin version $new_options['plugin_ver'] = ASGA_PLUGIN_VER; // Write options back to db update_option(ASGA_OPTION_NAME, $new_options); } /** * Check if we need to upgrade database options or not * @param $db_options * @return bool */ private function should_proceed_to_upgrade($db_options) { if (empty($db_options) || !is_array($db_options)) return true; if (!isset($db_options['plugin_ver'])) return true; return version_compare($db_options['plugin_ver'], ASGA_PLUGIN_VER, '<'); } /** * Print option page javascript,css */ public function add_admin_assets() { $is_min = (defined('WP_DEBUG') && WP_DEBUG == true) ? '' : '.min'; wp_enqueue_style('asga-admin', plugins_url('/assets/option-page' . $is_min . '.css', ASGA_BASE_FILE), array(), ASGA_PLUGIN_VER); wp_enqueue_script('asga-admin', plugins_url("/assets/option-page" . $is_min . ".js", ASGA_BASE_FILE), array('jquery'), ASGA_PLUGIN_VER, false); } /** * Load view and show it to front-end * @param $file string File name * @param $options array Array to be passed to view, not an unused variable * @throws \Exception */ private function load_view($file, $options = array()) { $file_path = plugin_dir_path(ASGA_BASE_FILE) . 'views/' . $file; if (is_readable($file_path)) { require $file_path; } else { throw new \Exception('Unable to load template file - ' . esc_html($file_path)); } } /** * Function will add help tab to our option page * @require wp v3.3+ */ public function add_help_menu_tab() { // Get current screen object $curr_screen = get_current_screen(); $curr_screen->add_help_tab( array( 'id' => 'asga-overview', 'title' => 'Basic', 'content' => '

Do you have a Google Analytics Account ?
' . 'In order to use this plugin you need to have a Google Analytics Account. Create an account here. It is FREE.
' . 'How do i find my Google Analytics ID ?
' . 'Please check out this link
' . 'How do i view my stats ?
' . 'Login to Google Analytics Account with your G-Mail ID to view stats.' . '

' ) ); $curr_screen->add_help_tab( array( 'id' => 'asga-troubleshoot', 'title' => 'Troubleshoot', 'content' => '

Things to remember
' . '

' . '

' ) ); $curr_screen->add_help_tab( array( 'id' => 'asga-more-info', 'title' => 'More', 'content' => '

Need more information ?
' . 'A brief FAQ is available to solve your common issues, ' . 'click here to read more.
' . 'Support is only available on WordPress Forums, click here to ask anything about this plugin.
' . 'You can also browse the source code of this plugin on GitHub. ' . '

' ) ); //Add a help sidebar with links $curr_screen->set_help_sidebar( '

Quick Links

' . '

Plugin FAQ

' . '

Plugin Home

' ); } }