HEX
Server: LiteSpeed
System: Linux server902.web-hosting.com 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User: deshuvsd (2181)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: /home/deshuvsd/www/wp-content/plugins/suremails/inc/controller/weekly-summary.php
<?php
/**
 * WeeklySummary Class
 *
 * Sends weekly email summary based on stats collected via SureMails logs.
 *
 * @package SureMails\Inc\Controller
 */

namespace SureMails\Inc\Controller;

use SureMails\Inc\DB\EmailLog;
use SureMails\Inc\Settings;
use SureMails\Inc\Traits\Instance;
use SureMails\Inc\Traits\SendEmail;
use SureMails\Inc\Utils\Utils;

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class WeeklySummary
 */
class WeeklySummary {

	use Instance;
	use SendEmail;

	/**
	 * Miscellaneous plugin settings.
	 *
	 * @var array|null
	 */
	private $settings = null;

	/**
	 * Constructor.
	 *
	 * Initializes settings.
	 */
	public function __construct() {
		$this->settings = Settings::instance()->get_misc_settings();
	}

	/**
	 * Called via daily cron. Sends summary only on configured day.
	 *
	 * @return void
	 */
	public function maybe_send_summary(): void {
		$active            = $this->settings['email_summary_active'] ?? 'yes';
		$day               = $this->settings['email_summary_day'] ?? 'monday';
		$today             = strtolower( gmdate( 'l' ) );
		$connections_count = count( Settings::instance()->get_raw_settings()['connections'] ?? [] );

		if ( 'no' === $active || $today !== $day || $connections_count < 1 ) {
			return;
		}

		$this->send_summary_email();
		$index = (int) ( $this->settings['email_summary_index'] ?? 1 ) + 1;

		if ( $index > 12 ) {
			$index = 1;
		}
		Settings::instance()->update_misc_settings( 'email_summary_index', $index );
	}

	/**
	 * Handles logic to compile and send the summary email.
	 *
	 * @return void
	 */
	private function send_summary_email(): void {
		$email = $this->get_email_content();
		if ( empty( $email ) || empty( $email['to'] ) || empty( $email['body'] ) ) {
			return;
		}
		$this->send( $email['to'], $email['subject'], $email['body'], $this->get_html_headers(), [] );
	}

	/**
	 * Builds the subject, body, and recipient for the summary email.
	 *
	 * @return array
	 */
	private function get_email_content(): array {
		$stats = $this->get_statistics();
		$to    = get_option( 'admin_email' );

		$website_name = get_bloginfo( 'name' );
		if ( empty( $website_name ) ) {
			$website_name = __( 'Your Website', 'suremails' );
		}

		// Filter to control whether site name should be included in subject.
		$include_site_name_in_subject = apply_filters( 'suremails_weekly_summary_include_site_name_in_subject', false );

		if ( $include_site_name_in_subject ) {
			$subject = sprintf(
				/* translators: 1: Website name, 2: From date, 3: To date */
				esc_html__( 'Email Summary of last week - %1$s - %2$s to %3$s', 'suremails' ),
				esc_html( $website_name ),
				esc_html( date_i18n( 'F j, Y', strtotime( '-7 days' ) ) ),
				esc_html( date_i18n( 'F j, Y', strtotime( '-1 day' ) ) )
			);
		} else {
			$subject = sprintf(
				/* translators: 1: From date, 2: To date */
				esc_html__( 'Email Summary of last week - %1$s to %2$s', 'suremails' ),
				esc_html( date_i18n( 'F j, Y', strtotime( '-7 days' ) ) ),
				esc_html( date_i18n( 'F j, Y', strtotime( '-1 day' ) ) )
			);
		}

		$body = $this->build_email_header()
			. $this->build_email_body( $stats )
			. $this->build_email_footer();

		return [
			'to'      => $to,
			'subject' => $subject,
			'body'    => $body,
		];
	}

	/**
	 * Build email header HTML.
	 *
	 * @return string
	 */
	private function build_email_header(): string {
		ob_start();
		?>
		<!DOCTYPE html>
		<html lang="en">
		<head>
			<meta charset="UTF-8">
			<meta name="viewport" content="width=device-width, initial-scale=1.0">
			<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
			<meta http-equiv="X-UA-Compatible" content="IE=edge">
			<title><?php esc_html_e( 'Weekly Summary', 'suremails' ); ?></title>
			<link href="https://fonts.googleapis.com/css2?family=Figtree:wght@400;500;600&display=swap" rel="stylesheet">
		</head>
		<body style="font-family:Figtree,Arial,sans-serif;background-color:#F1F5F9;margin:0;padding:32px;">
			<div style="max-width:640px;margin:0 auto;">
				<div style="margin-bottom:24px;text-align:left;">
					<img src="<?php echo esc_url( 'https://suremails.com/wp-content/uploads/2025/10/suremail-logo-og-scaled.png' ); ?>"
						alt="<?php esc_attr_e( 'SureMail Logo', 'suremails' ); ?>" width="162" height="32"
						style="display:inline-block;">
				</div>
				<div style="background-color:#FFFFFF;padding-bottom:40px;">
					<?php
					$content = ob_get_clean();
					return $content !== false ? $content : '';
	}

	/**
	 * Generate logs URL with date range for the past 7 days.
	 *
	 * @return string
	 */
	private function get_logs_url(): string {
		$from_date = gmdate( 'Y-m-d', strtotime( '-7 days' ) );
		$to_date   = gmdate( 'Y-m-d', strtotime( '-1 day' ) );

		return Utils::get_admin_url( "/logs?from={$from_date}&to={$to_date}" );
	}

	/**
	 * Build email body with statistics.
	 *
	 * @param array $stats Email statistics.
	 * @return string
	 */
	private function build_email_body( array $stats ): string {
		$logs_url = $this->get_logs_url();

		ob_start();
		?>
					<div style="padding:24px;">
						<p style="font-size:18px;font-weight:600;color:#111827;margin:0 0 8px;">
							<?php esc_html_e( 'Hey There,', 'suremails' ); ?>
						</p>
						<p style="font-size:14px;color:#4B5563;margin:0 0 16px;">
							<?php
							$site_url  = home_url();
							$site_name = get_bloginfo( 'name' );

							if ( ! empty( $site_name ) ) {
								$link_text = $site_name;
							} else {
								$link_text = str_replace( [ 'https://', 'http://' ], '', $site_url );
							}

							printf(
								/* translators: %s: Website name or URL link */
								esc_html__( 'Here is your SureMail report for the last 7 days of %s', 'suremails' ),
								'<a href="' . esc_url( $site_url ) . '" style="color:#2563EB;text-decoration:none;font-weight:400;" target="_blank" rel="noopener noreferrer"><strong>' . esc_html( $link_text ) . '</strong></a>'
							);
							?>
						</p>

						<?php echo wp_kses_post( $this->build_statistics_table( $stats ) ); ?>

						<a href="<?php echo esc_url( $logs_url ); ?>"
							style="display:inline-block;background-color:#2563EB;color:#FFFFFF;padding:8px 12px;border-radius:4px;text-decoration:none;font-size:12px;font-weight:600;margin-top:16px;">
							<?php esc_html_e( 'View Email Logs', 'suremails' ); ?>
						</a>
					</div>
					<?php
					$content = ob_get_clean();
					return $content !== false ? $content : '';
	}

	/**
	 * Build statistics table HTML.
	 *
	 * @param array $stats Email statistics.
	 * @return string
	 */
	private function build_statistics_table( array $stats ): string {
		$stats_labels = [
			'sent'    => esc_html__( 'Emails Sent Successfully', 'suremails' ),
			'failed'  => esc_html__( 'Emails Failed to Send', 'suremails' ),
			'blocked' => esc_html__( 'Emails Blocked by Reputation Shield', 'suremails' ),
		];

		ob_start();
		?>
					<table
						style="border:1px solid #E5E7EB;border-radius:8px;box-shadow:0 1px 1px rgba(0,0,0,0.05);margin-top:16px;width:100%;border-collapse:separate;border-spacing:0;">
						<thead>
							<tr style="background-color:#F9FAFB;">
								<th
									style="padding:8px 12px;font-size:14px;font-weight:500;color:#111827;text-align:left;border-top-left-radius:8px;">
									<?php esc_html_e( 'Emails', 'suremails' ); ?>
								</th>
								<th
									style="padding:8px 12px;font-size:14px;font-weight:500;color:#111827;text-align:right;width:146px;border-top-right-radius:8px;">
									<?php esc_html_e( 'Last Week', 'suremails' ); ?>
								</th>
							</tr>
						</thead>
						<tbody>
							<?php
							$row_index   = 0;
							$stats_count = count( $stats_labels );

							foreach ( $stats_labels as $key => $label ) {
								$bg_color            = $row_index % 2 === 0 ? '#FFFFFF' : '#F9FAFB';
								$is_last             = $row_index === $stats_count - 1;
								$border_top          = $row_index > 0 ? '0.5px solid #E5E7EB' : 'none';
								$border_radius_left  = $is_last ? 'border-bottom-left-radius:8px;' : '';
								$border_radius_right = $is_last ? 'border-bottom-right-radius:8px;' : '';
								?>
								<tr style="background-color:<?php echo esc_attr( $bg_color ); ?>;">
									<td
										style="padding:12px;font-size:14px;color:#4B5563;border-top:<?php echo esc_attr( $border_top ); ?>;<?php echo esc_attr( $border_radius_left ); ?>">
										<?php echo esc_html( $label ); ?>
									</td>
									<td
										style="padding:12px;font-size:14px;color:#4B5563;text-align:right;width:146px;border-top:<?php echo esc_attr( $border_top ); ?>;<?php echo esc_attr( $border_radius_right ); ?>">
										<?php echo esc_html( $stats[ $key ] ?? 0 ); ?>
									</td>
								</tr>
								<?php
								$row_index++;
							}
							?>
						</tbody>
					</table>
					<?php
					$content = ob_get_clean();
					return $content !== false ? $content : '';
	}

	/**
	 * Build email footer HTML.
	 *
	 * @return string
	 */
	private function build_email_footer(): string {
		$all_products = [
			'astra'            => [
				'url'           => 'https://wpastra.com?utm_medium=suremails-email-summary',
				'title'         => esc_html__( 'Build Faster with Astra', 'suremails' ),
				'description'   => esc_html__( 'Fast, lightweight & customizable WordPress theme for website builders.', 'suremails' ),
				'image'         => 'https://suremails.com/wp-content/uploads/2025/10/astra.png',
				'explore_title' => 'Astra',
			],
			'surecart'         => [
				'url'           => 'https://surecart.com?utm_medium=suremails-email-summary',
				'title'         => esc_html__( 'Boost Sales with SureCart', 'suremails' ),
				'description'   => esc_html__( 'Powerful WordPress e-commerce plugin for selling digital and physical products.', 'suremails' ),
				'image'         => 'https://suremails.com/wp-content/uploads/2025/10/surecart.png',
				'explore_title' => 'SureCart',
			],
			'sureforms'        => [
				'url'           => 'https://sureforms.com?utm_medium=suremails-email-summary',
				'title'         => esc_html__( 'Grow Your List with SureForms', 'suremails' ),
				'description'   => esc_html__( 'Creating beautiful, functional forms has never been easier with this AI form builder.', 'suremails' ),
				'image'         => 'https://suremails.com/wp-content/uploads/2025/10/sureforms.png',
				'explore_title' => 'SureForms',
			],
			'prestoplayer'     => [
				'url'           => 'https://prestoplayer.com/?utm_medium=suremails-email-summary',
				'title'         => esc_html__( 'Engage Viewers with Presto Player', 'suremails' ),
				'description'   => esc_html__( 'The best video player plugin for WordPress with modern video experience.', 'suremails' ),
				'image'         => 'https://suremails.com/wp-content/uploads/2025/10/prestoplayer.png',
				'explore_title' => 'Presto Player',
			],
			'suredash'         => [
				'url'           => 'https://suredash.com?utm_medium=suremails-email-summary',
				'title'         => esc_html__( 'Impress Clients with SureDash', 'suremails' ),
				'description'   => esc_html__( 'All-in-one solution to connect, engage, grow, and scale your community.', 'suremails' ),
				'image'         => 'https://suremails.com/wp-content/uploads/2025/10/suredash.png',
				'explore_title' => 'SureDash',
			],
			'cartflows'        => [
				'url'           => 'https://cartflows.com?utm_medium=suremails-email-summary',
				'title'         => esc_html__( 'Increase Conversions with CartFlows', 'suremails' ),
				'description'   => esc_html__( 'One click sales funnel builder for WordPress with conversion optimized templates.', 'suremails' ),
				'image'         => 'https://suremails.com/wp-content/uploads/2025/10/cartflows.png',
				'explore_title' => 'CartFlows',
			],
			'suremembers'      => [
				'url'           => 'https://suremembers.com?utm_medium=suremails-email-summary',
				'title'         => esc_html__( 'Monetize Content with SureMembers', 'suremails' ),
				'description'   => esc_html__( 'Top-rated WordPress membership plugin for managing member access and content.', 'suremails' ),
				'image'         => 'https://suremails.com/wp-content/uploads/2025/10/suremembers.png',
				'explore_title' => 'SureMembers',
			],
			'startertemplates' => [
				'url'           => 'https://startertemplates.com/?utm_medium=suremails-email-summary',
				'title'         => esc_html__( 'Launch Sites with Starter Templates', 'suremails' ),
				'description'   => esc_html__( 'Build beautiful websites in minutes with 600+ AI-powered templates for Elementor and Gutenberg.', 'suremails' ),
				'image'         => 'https://suremails.com/wp-content/uploads/2025/10/startertemplates.png',
				'explore_title' => 'Starter Templates',
			],
			'zipwp'            => [
				'url'           => 'https://zipwp.com?utm_medium=suremails-email-summary',
				'title'         => esc_html__( 'Create Sites Instantly with ZipWP', 'suremails' ),
				'description'   => esc_html__( 'Plan, build, and host stunning WordPress websites instantly. No setup. No mess.', 'suremails' ),
				'image'         => 'https://suremails.com/wp-content/uploads/2025/10/zipwp.png',
				'explore_title' => 'ZipWP',
			],
			'ottokit'          => [
				'url'           => 'https://ottokit.com?utm_medium=suremails-email-summary',
				'title'         => esc_html__( 'Work Smarter with OttoKit', 'suremails' ),
				'description'   => esc_html__( 'No-code AI automation tool for creating automated workflows without technical skills.', 'suremails' ),
				'image'         => 'https://suremails.com/wp-content/uploads/2025/10/ottokit.png',
				'explore_title' => 'OttoKit',
			],
			'surefeedback'     => [
				'url'           => 'https://surefeedback.com?utm_medium=suremails-email-summary',
				'title'         => esc_html__( 'Collaborate Better with SureFeedback', 'suremails' ),
				'description'   => esc_html__( 'Get design feedback and client approval using WordPress with visual collaboration.', 'suremails' ),
				'image'         => 'https://suremails.com/wp-content/uploads/2025/10/surefeedback.png',
				'explore_title' => 'SureFeedback',
			],
			'surerank'         => [
				'url'           => 'https://surerank.com?utm_medium=suremails-email-summary',
				'title'         => esc_html__( 'Rank Higher with SureRank', 'suremails' ),
				'description'   => esc_html__( 'Modern SEO without the bloat - simple, lightweight SEO assistant for better rankings.', 'suremails' ),
				'image'         => 'https://suremails.com/wp-content/uploads/2025/10/surerank-icon.png',
				'explore_title' => 'SureRank',
			],
		];

		$index        = isset( $this->settings['email_summary_index'] ) ? (int) $this->settings['email_summary_index'] : 1;
		$idx          = max( 1, $index );
		$product_keys = array_keys( $all_products );
		$pick_index   = ( $idx - 1 ) % count( $product_keys );
		$product_slug = $product_keys[ $pick_index ];
		$product_data = $all_products[ $product_slug ];

		ob_start();
		?>
					<hr style="margin:24px 24px 16px;border:none;border-top:1px solid #E5E7EB;">
					<div style="padding:0 24px 24px;">
						<table role="presentation" cellpadding="0" cellspacing="0"
							style="width:100%;margin:0;background-color:#FFFFFF;border:0.5px solid #E5E7EB;border-radius:8px;border-collapse:separate;">
							<tr>
								<td style="padding:16px;">
									<table role="presentation" cellpadding="0" cellspacing="0" style="width:100%;">
										<!-- Logo Row -->
										<tr>
											<td style="text-align:left;padding-bottom:4px;">
												<img src="<?php echo esc_url( $product_data['image'] ); ?>"
													alt="
													<?php
													echo esc_attr(
														// translators: %s: Product name.
														sprintf( esc_attr__( '%s logo', 'suremails' ), ucfirst( $product_slug ) )
													);
													?>
														"
													width="20" height="20" style="display:block;">
											</td>
										</tr>
										<!-- Content Row -->
										<tr>
											<td style="text-align:left;">
												<h3
													style="font-size:14px;line-height:20px;font-weight:600;color:#111827;margin:0 0 2px 0;font-family:Figtree,Arial,sans-serif;">
													<?php echo esc_html( $product_data['title'] ); ?>
												</h3>
												<p
													style="font-size:12px;line-height:16px;font-weight:400;color:#6B7280;margin:0 0 4px 0;font-family:Figtree,Arial,sans-serif;">
													<?php echo esc_html( $product_data['description'] ); ?>
												</p>
												<a href="<?php echo esc_url( $product_data['url'] ); ?>"
													style="font-size:12px;line-height:16px;font-weight:600;color:#2563EB;text-decoration:none;font-family:Figtree,Arial,sans-serif;display:inline-block;"
													target="_blank" rel="noopener noreferrer">
													<?php
													/* translators: %s: Product name */
													printf( esc_html__( 'Explore %s →', 'suremails' ), esc_html( $product_data['explore_title'] ) );
													?>
												</a>
											</td>
										</tr>
									</table>
								</td>
							</tr>
						</table>
					</div>
					<hr style="margin:0 24px 24px;border:none;border-top:1px solid #E5E7EB;">
					<div>
						<p
							style="font-size:12px;color:#9CA3AF;text-align:center;margin:16px 0;font-family:Figtree,Arial,sans-serif;">
							<a href="<?php echo esc_url( Utils::get_admin_url( '/settings' ) ); ?>"
								style="color:#9CA3AF;text-decoration:none;">
								<?php esc_html_e( 'Manage Email Summaries from your website settings', 'suremails' ); ?>
							</a>
						</p>
						<hr style="border:none;border-top:1px solid #E5E7EB;margin:0 24px;">
						<div style="text-align:center;margin-top:16px;">
							<a href="<?php echo esc_url( 'https://suremails.com' ); ?>" target="_blank" rel="noopener noreferrer">
								<img src="<?php echo esc_url( 'https://suremails.com/wp-content/uploads/2025/10/suremail-logo-og-scaled.png' ); ?>"
									alt="<?php esc_attr_e( 'SureMail Logo', 'suremails' ); ?>" height="20"
									style="display:block;margin:0 auto;">
							</a>
						</div>
					</div>
				</div>
			</div>
		</body>

		</html>
		<?php
		$content = ob_get_clean();
		return $content !== false ? $content : '';
	}

	/**
	 * Get email statistics for the past 7 days.
	 *
	 * @return array
	 */
	private function get_statistics(): array {
		$email_log  = EmailLog::instance();
		$start_date = gmdate( 'Y-m-d H:i:s', strtotime( '-7 days' ) );
		$end_date   = gmdate( 'Y-m-d H:i:s', strtotime( '-1 day 23:59:59' ) );

		$results = $email_log->get(
			[
				'select'   => 'status, COUNT(*) as count',
				'where'    => [
					'updated_at >=' => $start_date,
					'updated_at <=' => $end_date,
				],
				'group_by' => 'status',
			]
		);

		$counts = [
			'sent'    => 0,
			'failed'  => 0,
			'blocked' => 0,
		];

		if ( is_array( $results ) && ! empty( $results ) ) {
			foreach ( $results as $row ) {
				$status = $row['status'];
				$count  = (int) $row['count'];
				if ( isset( $counts[ $status ] ) ) {
					$counts[ $status ] = $count;
				}
			}
		}

		return $counts;
	}
}