init_default_rules(); $this->init_hooks(); } /** * Initialize WordPress hooks */ private function init_hooks() { // Handle robots.txt generation add_action('do_robotstxt', array($this, 'generate_robotstxt'), 10, 1); // Override WordPress default robots.txt add_filter('robots_txt', array($this, 'filter_robots_txt'), 10, 2); // Handle admin form submissions add_action('admin_post_tigerstyle_save_robots_txt', array($this, 'save_settings')); // Add admin scripts add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts')); } /** * Initialize default robots.txt rules */ private function init_default_rules() { $this->default_rules = array( 'user_agent_all' => array( 'user_agent' => '*', 'disallow' => array( '/wp-admin/', '/wp-includes/', '/wp-content/plugins/', '/wp-content/themes/', '/wp-json/', '/xmlrpc.php', '/wp-*.php', '/readme.html', '/license.txt', '/?s=', '/search/', '/author/', '/feed/', '/comments/', '/trackback/', '/wp-login.php', '/wp-register.php' ), 'allow' => array( '/wp-content/uploads/', '/wp-content/themes/*/css/', '/wp-content/themes/*/js/', '/wp-content/themes/*/images/' ) ), 'user_agent_google_images' => array( 'user_agent' => 'Googlebot-Image', 'allow' => array( '/wp-content/uploads/' ) ), 'crawl_delay' => 1, 'include_sitemap' => true, 'custom_rules' => '' ); } /** * Get current settings */ private function get_settings() { $settings = get_option($this->option_name, array()); return wp_parse_args($settings, $this->default_rules); } /** * Generate robots.txt content */ public function generate_robotstxt($is_public) { if (!$is_public) { echo "User-agent: *\nDisallow: /\n"; return; } $settings = $this->get_settings(); $output = array(); // Add header comment $output[] = '# Robots.txt generated by TigerStyle Heat Plugin'; $output[] = '# ' . home_url('/robots.txt'); $output[] = '# Generated on: ' . current_time('Y-m-d H:i:s T'); $output[] = ''; // Main user agent rules if (isset($settings['user_agent_all'])) { $rules = $settings['user_agent_all']; $output[] = 'User-agent: ' . $rules['user_agent']; // Disallow rules if (!empty($rules['disallow'])) { foreach ($rules['disallow'] as $path) { if (!empty(trim($path))) { $output[] = 'Disallow: ' . trim($path); } } } // Allow rules if (!empty($rules['allow'])) { foreach ($rules['allow'] as $path) { if (!empty(trim($path))) { $output[] = 'Allow: ' . trim($path); } } } $output[] = ''; } // Google Images specific rules if (isset($settings['user_agent_google_images'])) { $rules = $settings['user_agent_google_images']; $output[] = 'User-agent: ' . $rules['user_agent']; if (!empty($rules['allow'])) { foreach ($rules['allow'] as $path) { if (!empty(trim($path))) { $output[] = 'Allow: ' . trim($path); } } } $output[] = ''; } // Crawl delay if (!empty($settings['crawl_delay']) && $settings['crawl_delay'] > 0) { $output[] = 'User-agent: *'; $output[] = 'Crawl-delay: ' . intval($settings['crawl_delay']); $output[] = ''; } // Custom rules if (!empty($settings['custom_rules'])) { $output[] = '# Custom Rules'; $output[] = trim($settings['custom_rules']); $output[] = ''; } // Sitemap references if (!empty($settings['include_sitemap'])) { $output[] = '# Sitemaps'; $output[] = 'Sitemap: ' . home_url('/sitemap.xml'); $output[] = 'Sitemap: ' . home_url('/sitemap_index.xml'); // Add WordPress default sitemaps if they exist if (function_exists('wp_sitemaps_get_server')) { $output[] = 'Sitemap: ' . home_url('/wp-sitemap.xml'); } } echo implode("\n", $output); } /** * Filter WordPress default robots.txt */ public function filter_robots_txt($output, $public) { // Clear default output and use our custom generation ob_start(); $this->generate_robotstxt($public); $custom_output = ob_get_clean(); return $custom_output; } /** * Save settings from admin form */ public function save_settings() { // Verify nonce if (!wp_verify_nonce($_POST['tigerstyle_robots_nonce'], 'tigerstyle_robots_save')) { wp_die('Security check failed'); } // Check user permissions if (!current_user_can('manage_options')) { wp_die('Insufficient permissions'); } $settings = array(); // Process main user agent rules $settings['user_agent_all'] = array( 'user_agent' => '*', 'disallow' => array_filter(array_map('trim', explode("\n", sanitize_textarea_field($_POST['disallow_rules'])))), 'allow' => array_filter(array_map('trim', explode("\n", sanitize_textarea_field($_POST['allow_rules'])))) ); // Google Images rules $settings['user_agent_google_images'] = array( 'user_agent' => 'Googlebot-Image', 'allow' => array_filter(array_map('trim', explode("\n", sanitize_textarea_field($_POST['google_images_allow'])))) ); // Crawl delay $settings['crawl_delay'] = intval($_POST['crawl_delay']); // Include sitemap $settings['include_sitemap'] = isset($_POST['include_sitemap']) ? true : false; // Custom rules $settings['custom_rules'] = sanitize_textarea_field($_POST['custom_rules']); // Save settings update_option($this->option_name, $settings); // Redirect back with success message wp_redirect(add_query_arg(array( 'page' => 'tigerstyle-heat', 'message' => 'robots_txt_updated' ), admin_url('admin.php'))); exit; } /** * Enqueue admin scripts */ public function enqueue_admin_scripts($hook) { if ($hook !== 'toplevel_page_tigerstyle-heat') { return; } wp_enqueue_script('tigerstyle-robots-admin', TIGERSTYLE_HEAT_PLUGIN_URL . 'admin/js/robots-admin.js', array('jquery'), TIGERSTYLE_HEAT_VERSION, true); } /** * Render admin page */ public function render_admin_page() { $settings = $this->get_settings(); $current_robots_url = home_url('/robots.txt'); ?>