Skip to content

Instantly share code, notes, and snippets.

@ozgursar
Created February 11, 2026 12:30
Show Gist options
  • Select an option

  • Save ozgursar/19159208c4f4dca3d8b7714f5ca54ed9 to your computer and use it in GitHub Desktop.

Select an option

Save ozgursar/19159208c4f4dca3d8b7714f5ca54ed9 to your computer and use it in GitHub Desktop.
WordPress Email Logger (works for single site and multisite)
<?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