Created
February 11, 2026 12:30
-
-
Save ozgursar/19159208c4f4dca3d8b7714f5ca54ed9 to your computer and use it in GitHub Desktop.
WordPress Email Logger (works for single site and multisite)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| /** | |
| * Plugin Name: Email Logger | |
| * Description: Logs all emails sent from WordPress (works for single site and multisite) | |
| * Network: true | |
| */ | |
| add_filter('wp_mail', 'universal_log_wp_mail', 999); | |
| function universal_log_wp_mail($args) { | |
| $is_multisite = is_multisite(); | |
| $option_key = $is_multisite ? 'network_emails_log' : 'emails_log'; | |
| // Get existing emails | |
| $emails = $is_multisite ? get_site_option($option_key, array()) : get_option($option_key, array()); | |
| $email_data = array( | |
| 'time' => current_time('mysql'), | |
| 'to' => $args['to'], | |
| 'subject' => $args['subject'], | |
| 'message' => $args['message'], | |
| 'headers' => $args['headers'] ?? '', | |
| ); | |
| // Add site_id for multisite | |
| if ($is_multisite) { | |
| $email_data['site_id'] = get_current_blog_id(); | |
| } | |
| // Keep last 50 emails | |
| array_unshift($emails, $email_data); | |
| $emails = array_slice($emails, 0, 50); | |
| // Update option | |
| if ($is_multisite) { | |
| update_site_option($option_key, $emails); | |
| } else { | |
| update_option($option_key, $emails); | |
| } | |
| return $args; | |
| } | |
| // Add admin menu for both single site and multisite | |
| if (is_multisite()) { | |
| add_action('network_admin_menu', 'universal_email_log_menu'); | |
| } else { | |
| add_action('admin_menu', 'universal_email_log_menu'); | |
| } | |
| function universal_email_log_menu() { | |
| $is_multisite = is_multisite(); | |
| $capability = $is_multisite ? 'manage_network' : 'manage_options'; | |
| add_menu_page( | |
| 'Email Log', | |
| 'Email Log', | |
| $capability, | |
| 'email-log', | |
| 'universal_email_log_page', | |
| 'dashicons-email' | |
| ); | |
| } | |
| function universal_email_log_page() { | |
| $is_multisite = is_multisite(); | |
| $option_key = $is_multisite ? 'network_emails_log' : 'emails_log'; | |
| $emails = $is_multisite ? get_site_option($option_key, array()) : get_option($option_key, array()); | |
| echo '<div class="wrap">'; | |
| echo '<h1>' . ($is_multisite ? 'Network ' : '') . 'Email Log</h1>'; | |
| if (isset($_POST['clear_log'])) { | |
| check_admin_referer('clear_email_log'); | |
| if ($is_multisite) { | |
| delete_site_option($option_key); | |
| } else { | |
| delete_option($option_key); | |
| } | |
| echo '<div class="notice notice-success"><p>Email log cleared!</p></div>'; | |
| $emails = array(); | |
| } | |
| echo '<form method="post" style="margin-bottom: 20px;">'; | |
| wp_nonce_field('clear_email_log'); | |
| echo '<input type="submit" name="clear_log" class="button" value="Clear Log">'; | |
| echo '</form>'; | |
| if (empty($emails)) { | |
| echo '<p>No emails logged yet.</p>'; | |
| } else { | |
| foreach ($emails as $email) { | |
| echo '<div style="border: 1px solid #ccc; padding: 15px; margin-bottom: 20px; background: #f9f9f9;">'; | |
| echo '<p><strong>Time:</strong> ' . esc_html($email['time']) . '</p>'; | |
| // Show site ID only for multisite | |
| if ($is_multisite && isset($email['site_id'])) { | |
| echo '<p><strong>Site ID:</strong> ' . esc_html($email['site_id']) . '</p>'; | |
| } | |
| echo '<p><strong>To:</strong> ' . esc_html(is_array($email['to']) ? implode(', ', $email['to']) : $email['to']) . '</p>'; | |
| echo '<p><strong>Subject:</strong> ' . esc_html($email['subject']) . '</p>'; | |
| echo '<p><strong>Message:</strong></p>'; | |
| echo '<pre style="background: white; padding: 10px; overflow-x: auto;">' . esc_html($email['message']) . '</pre>'; | |
| echo '</div>'; | |
| } | |
| } | |
| echo '</div>'; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment