create_tables(); $default_options = array( 'enabled' => true, 'auto_redirect_enabled' => true, 'redirect_delay' => 5, 'open_in_new_tab' => true, 'url_format' => 'query', 'auto_whitelist' => array( 'same_root' => true, 'search_engines' => true ), 'whitelist_domains' => "google.com\nbaidu.com\nbing.com\nyoutube.com\nfacebook.com\ntwitter.com", 'intercept_comments' => true, 'intercept_widgets' => true, 'exclude_css_class' => 'no-redirect', 'show_external_icon' => true, 'template' => 'default', 'color_scheme' => 'blue', 'page_title' => 'External Link Warning', 'page_subtitle' => '', 'url_label' => 'You are about to visit:', 'warning_text' => 'You are about to leave this site and visit an external website. We are not responsible for the content of external websites.', 'show_warning_message' => true, 'show_logo' => false, 'show_url_full' => false, 'show_security_info' => true, 'show_security_tips' => false, 'show_back_button' => true, 'custom_css' => '', 'button_text_continue' => 'Continue', 'button_text_back' => 'Back', 'button_style' => 'rounded', 'countdown_text' => 'Auto redirect in {seconds} seconds', 'show_progress_bar' => false, 'admin_exempt' => true, 'cookie_duration' => 30, 'stats_retention' => 90 ); $existing_options = get_option('wpnav_links_options', array()); $merged_options = array_merge($default_options, $existing_options); update_option('wpnav_links_options', $merged_options); if (!wp_next_scheduled('wpnav_cleanup_old_data')) { wp_schedule_event(time(), 'daily', 'wpnav_cleanup_old_data'); } flush_rewrite_rules(); add_option('wpnav_links_activation_redirect', true); } register_activation_hook(__FILE__, 'wpnav_activate_plugin'); function wpnav_deactivate_plugin() { wp_clear_scheduled_hook('wpnav_cleanup_old_data'); flush_rewrite_rules(); } register_deactivation_hook(__FILE__, 'wpnav_deactivate_plugin'); function wpnav_uninstall_plugin() { delete_option('wpnav_links_options'); delete_option('wpnav_links_db_version'); delete_option('wpnav_links_activation_redirect'); global $wpdb; $table_name = $wpdb->prefix . WPNAV_LINKS_TABLE; $wpdb->query("DROP TABLE IF EXISTS $table_name"); wp_clear_scheduled_hook('wpnav_cleanup_old_data'); } register_uninstall_hook(__FILE__, 'wpnav_uninstall_plugin'); add_action('wpnav_cleanup_old_data', 'wpnav_clean_old_statistics'); function wpnav_clean_old_statistics() { $options = get_option('wpnav_links_options'); $retention_days = isset($options['stats_retention']) ? intval($options['stats_retention']) : 90; $plugin = new WPNAV_Links(); $deleted_count = $plugin->cleanup_old_data($retention_days); if (defined('WP_DEBUG') && WP_DEBUG) { error_log("WPNav Links: Cleaned up {$deleted_count} old records"); } } function wpnav_run_plugin() { $plugin = new WPNAV_Links(); $plugin->init(); } add_action('plugins_loaded', 'wpnav_run_plugin'); add_action('admin_init', 'wpnav_activation_redirect'); function wpnav_activation_redirect() { if (get_option('wpnav_links_activation_redirect', false)) { delete_option('wpnav_links_activation_redirect'); if (!isset($_GET['activate-multi'])) { wp_redirect(admin_url('tools.php?page=wpnav-links&tab=basic_settings')); exit; } } } add_action('wp_dashboard_setup', 'wpnav_add_dashboard_widget'); function wpnav_add_dashboard_widget() { if (current_user_can('manage_options')) { wp_add_dashboard_widget( 'wpnav_links_stats', __('External Links Monitor', 'wpnav-links'), 'wpnav_dashboard_widget_content', null, null, 'normal', 'high' ); } } function wpnav_dashboard_widget_content() { $plugin = new WPNAV_Links(); $options = get_option('wpnav_links_options', array()); $total_redirects = $plugin->get_total_count(); $today_redirects = $plugin->get_total_count(date('Y-m-d'), date('Y-m-d')); $recent_redirects = $plugin->get_total_count(date('Y-m-d', strtotime('-7 days')), date('Y-m-d')); $last_week_redirects = $plugin->get_total_count(date('Y-m-d', strtotime('-14 days')), date('Y-m-d', strtotime('-7 days'))); $top_urls = $plugin->get_top_urls(3); $trend = 0; if ($last_week_redirects > 0) { $trend = (($recent_redirects - $last_week_redirects) / $last_week_redirects) * 100; } elseif ($recent_redirects > 0) { $trend = 100; } $plugin_enabled = !empty($options['enabled']); $auto_redirect = !empty($options['auto_redirect_enabled']); $whitelist_count = 0; if (!empty($options['whitelist_domains'])) { $domains = explode("\n", $options['whitelist_domains']); $whitelist_count = count(array_filter(array_map('trim', $domains))); } echo '
'; echo ''; } add_filter('plugin_row_meta', 'wpnav_plugin_row_meta', 10, 2); function wpnav_plugin_row_meta($links, $file) { if (plugin_basename(__FILE__) === $file) { $row_meta = array( 'support' => '' . esc_html__('Support', 'wpnav-links') . '', 'document' => '' . esc_html__('Documentation', 'wpnav-links') . '', ); return array_merge($links, $row_meta); } return $links; } add_action('init', 'wpnav_check_database_version'); function wpnav_check_database_version() { $installed_version = get_option('wpnav_links_db_version'); if ($installed_version !== WPNAV_LINKS_DB_VERSION) { $plugin = new WPNAV_Links(); $plugin->create_tables(); update_option('wpnav_links_db_version', WPNAV_LINKS_DB_VERSION); } } add_action('wp_enqueue_scripts', 'wpnav_enqueue_frontend_styles'); function wpnav_enqueue_frontend_styles() { $options = get_option('wpnav_links_options'); if (!isset($options['enabled']) || !$options['enabled']) { return; } if (!is_admin() && !empty($options['show_external_icon'])) { wp_enqueue_style( 'wpnav-external-indicator', WPNAV_LINKS_PLUGIN_URL . 'assets/css/external-indicator.css', array(), WPNAV_LINKS_VERSION ); } } if (!wp_next_scheduled('wpnav_daily_maintenance')) { wp_schedule_event(time(), 'daily', 'wpnav_daily_maintenance'); } add_action('wpnav_daily_maintenance', 'wpnav_daily_maintenance_tasks'); function wpnav_daily_maintenance_tasks() { wp_cache_flush(); global $wpdb; $table_name = $wpdb->prefix . WPNAV_LINKS_TABLE; $wpdb->query("OPTIMIZE TABLE $table_name"); } require_once plugin_dir_path(__FILE__) . 'lib/plugin-update-checker/plugin-update-checker.php'; use YahnisElsts\PluginUpdateChecker\v5p3\PucFactory; $WpNavLinksUpdateChecker = PucFactory::buildUpdateChecker( 'https://updates.weixiaoduo.com/wpnav-links.json', __FILE__, 'wpnav-links' );