<?php /* * SITESEO * https://siteseo.io * (c) SITSEO Team */ namespace SiteSEOPro; if(!defined('ABSPATH')){ die('HACKING ATTEMPT!'); } class RedirectManager{ static function handle_404_request(){ global $siteseo, $wpdb; // Toggle if(empty($siteseo->pro['toggle_state_redirect_monitoring'])){ return; } // Disable if(!empty($siteseo->pro['guess_redirect'])){ remove_filter('template_redirect', 'redirect_guess_404_permalink'); } if(!is_404() || empty($siteseo->pro['enable_404_log'])){ return; } $log_limit = !empty($siteseo->pro['log_limits']) ? $siteseo->pro['log_limits'] : ''; $redirect_to = !empty($siteseo->pro['redirect_type']) ? $siteseo->pro['redirect_type'] : ''; $custom_url = !empty($siteseo->pro['custom_redirect_url']) ? $siteseo->pro['custom_redirect_url'] : ''; $status_code = !empty($siteseo->pro['status_code']) ? $siteseo->pro['status_code'] : ''; $disable_ip_logging = !empty($siteseo->pro['disable_ip_logging']) ? $siteseo->pro['disable_ip_logging'] : ''; $redirect_url = $redirect_to === 'homepage' ? home_url() : $custom_url; $current_url = sanitize_url($_SERVER['REQUEST_URI']); // TODO:: Need to make it more robust to make sure we always get an IP. $current_request_ip = $_SERVER['REMOTE_ADDR']; $current_request_ip = filter_var($current_request_ip, FILTER_VALIDATE_IP); if($current_request_ip){ switch($disable_ip_logging){ case 'no_ip_logging': $current_request_ip = null; break; case 'anonymize_the_last_part': // TODO:: Handle IPv6 $ip_parts = explode('.', $current_request_ip); $ip_parts[count($ip_parts) - 1] = 'xxx'; $current_request_ip = implode('.', $ip_parts); break; } } else { $current_request_ip = null; } if(!empty($siteseo->pro['enable_404_log'])){ \SiteSEOPro\Settings\Util::maybe_create_404_table(); $existing_record = $wpdb->get_row($wpdb->prepare("SELECT id, hit_count FROM `".$wpdb->prefix."siteseo_redirect_logs` WHERE url = %s", $current_url)); if($existing_record){ // hit count increase $wpdb->update($wpdb->prefix.'siteseo_redirect_logs', ['hit_count' => intval($existing_record->hit_count + 1)], ['id' => $existing_record->id], ['%d'], ['%d']); } else{ $current_records = $wpdb->get_var("SELECT COUNT(*) FROM `".$wpdb->prefix."siteseo_redirect_logs`"); if($current_records >= $log_limit){ $wpdb->query("DELETE FROM `".$wpdb->prefix."siteseo_redirect_logs` ORDER BY `timestamp` ASC LIMIT 1"); } $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? sanitize_text_field($_SERVER['HTTP_USER_AGENT']) : ''; $referer = isset($_SERVER['HTTP_REFERER']) ? sanitize_url($_SERVER['HTTP_REFERER']) : ''; $wpdb->insert($wpdb->prefix .'siteseo_redirect_logs', ['url' => $current_url, 'ip_address' => $current_request_ip, 'user_agent' => $user_agent, 'referer' => $referer, 'hit_count' => 1,'timestamp' => current_time('mysql')], ['%s', '%s', '%s', '%s', '%d', '%s']); } } // redirect here if(!empty($redirect_url)){ wp_redirect($redirect_url, intval($status_code)); exit; } } static function setup_log_scheduled(){ global $siteseo; if(empty($siteseo->pro['email_notify'])){ return; } if(!wp_next_scheduled('siteseo_send_404_report_email')){ wp_schedule_event(time(), 'weekly', 'siteseo_send_404_report_email'); } } static function send_weekly_report(){ global $siteseo, $wpdb; if(empty($siteseo->pro['email_notify'])){ return; } $site_name = get_bloginfo('name'); $site_url = get_bloginfo('url'); $admin_email = get_option('admin_email'); $user_email = !empty($siteseo->pro['send_email_to']) ? $siteseo->pro['send_email_to'] : $admin_email; $admin_user = get_user_by('email', $admin_email); $admin_name = $admin_user ? $admin_user->display_name : 'Administrator'; if(empty($user_email)){ return; } $top_errors = $wpdb->get_results("SELECT url, hit_count, COUNT(*) as count FROM `{$wpdb->prefix}siteseo_redirect_logs` GROUP BY url ORDER BY hit_count DESC LIMIT 10"); $latest_errors = $wpdb->get_results("SELECT * FROM `{$wpdb->prefix}siteseo_redirect_logs` ORDER BY `timestamp` DESC LIMIT 10"); $subject = sprintf('404 Error Report for %s - Week of %s', $site_name, date('F j, Y')); $content = sprintf( '<!DOCTYPE html> <html> <body> <div style="font-family: Arial, sans-serif; line-height: 1.6;"> <p>Hello %s,</p> <p>Here\'s your weekly 404 error report for %s. We\'ve identified several broken links that may need your attention.</p> <div style="margin: 25px 0;"> <h2>Weekly 404 Error Report for %s</h2> <p>Below are the most frequent and recent 404 errors detected on your site:</p> </div> <h3>Top 404 Errors</h3> <table style="border-collapse: collapse; width: 100%%;"> <tr style="background-color: #f2f2f2;"> <th style="border:1px solid #ddd; padding:8px; text-align:left;">URL</th> <th style="border:1px solid #ddd; padding:8px; text-align:center; width:200px;">Hit Count</th> </tr>', esc_html($admin_name), esc_html($site_name), esc_html($site_name) ); foreach($top_errors as $error){ $content .= sprintf( '<tr> <td style="border:1px solid #ddd; padding:8px; text-align:left"><a href="%s">%s</a></td> <td style="border:1px solid #ddd; padding:8px; text-align:center;">%d</td> </tr>', esc_url($site_url . $error->url), esc_html($error->url), intval($error->hit_count) ); } $content .= '</table> <h3>Latest 404 Errors</h3> <table style="border-collapse: collapse; width: 100%;"> <tr style="background-color: #f2f2f2;"> <th style="border:1px solid #ddd; padding:8px; text-align:left;">URL</th> <th style="border:1px solid #ddd; padding:8px; text-align:center; width:200px;">Timestamp</th> </tr>'; foreach($latest_errors as $error){ $content .= sprintf( '<tr> <td style="border:1px solid #ddd; padding:8px; text-align:left;"><a href="%s">%s</a></td> <td style="border:1px solid #ddd; padding:8px; text-align:center;">%s</td> </tr>', esc_url($site_url . $error->url), esc_html($error->url), esc_html(date('F j, Y g:i a', strtotime($error->timestamp))) ); } $content .= '</table> <div style="margin-top:30px; padding-top:20px; border-top: 1px solid #ddd;"> <p style="margin-top:20px; font-size:12px; color:#666;"> This report was automatically generated on '.date('F j, Y').' </p> <p style="font-size:14px; color:#444; margin-top:15px;"> Powered by <a href="https://siteseo.io" target="_blank" style="color:#163d89;text-decoration:none;"><strong>SiteSEO</strong></a> </p> </div> </body> </html>'; // Html $headers = array( 'Content-Type: text/html; charset=UTF-8', 'From: SiteSEO <'.get_option('admin_email').'>' ); // Send email return wp_mail($user_email, $subject, $content, $headers); } }