Server IP : 172.67.216.182 / Your IP : 172.70.208.118 Web Server : Apache System : Linux krdc-ubuntu-s-2vcpu-4gb-amd-blr1-01.localdomain 5.15.0-142-generic #152-Ubuntu SMP Mon May 19 10:54:31 UTC 2025 x86_64 User : www ( 1000) PHP Version : 7.4.33 Disable Function : passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /www/wwwroot/coircraft.com/wp-content/plugins/wp-mail-logging/src/inc/Admin/ |
Upload File : |
<?php namespace No3x\WPML\Admin; use No3x\WPML\Model\WPML_Mail as Mail; use No3x\WPML\WPML_Email_Log_List; use No3x\WPML\WPML_Init; use No3x\WPML\WPML_ProductEducation; use No3x\WPML\WPML_Utils; class EmailLogsTab { /** * Top product education banner ID. * * @since 1.11.0 * * @var string */ const BANNER_TOP_ID = 'email-logs-top'; /** * Bottom product education banner ID. * * @since 1.11.0 * * @var string */ const BANNER_BOTTOM_ID = 'email-logs-bottom'; /** * Nonce used for requesting single email content preview. * * @since 1.11.0 * * @var string */ const SINGLE_EMAIL_CONTENT_PREVIEW_MODE_NONCE = 'wp-mail-logging-single-email-preview'; /** * Only instance of this object. * * @since 1.11.0 * * @var EmailLogsTab */ private static $instance = null; /** * Array containing the current logs displayed with errors. * * @since 1.11.0 * * @var null|array */ private $current_logs_with_errors = null; /** * Email Log List object. * * @since 1.11.0 * * @var WPML_Email_Log_List */ private $emailLogList; /** * Get the only instance of this object. * * @since 1.11.0 * * @return EmailLogsTab */ public static function get_instance() { if ( is_null( self::$instance ) ) { self::$instance = new self; } return self::$instance; } /** * Constructor * * @since 1.11.0 */ private function __construct() { } /** * Hooks that are fired earlier. * * @since 1.11.0 * * @return void */ public function hooks() { add_action( 'admin_init', [ $this, 'process_email_content_preview' ] ); } /** * Render an Email log HTML content. * * This is used to preview an HTML content in the Single Log Modal. * * @since 1.11.0 * * @return void */ public function process_email_content_preview() { if ( empty( $_GET['page'] ) || $_GET['page'] !== WPML_Utils::ADMIN_PAGE_SLUG || empty( $_GET['email_log_id'] ) || empty( $_GET[ self::SINGLE_EMAIL_CONTENT_PREVIEW_MODE_NONCE ] ) || empty( $_GET['mode'] ) || $_GET['mode'] !== 'iframe_preview' ) { return; } if ( ! wp_verify_nonce( sanitize_key( $_GET[ self::SINGLE_EMAIL_CONTENT_PREVIEW_MODE_NONCE ] ), self::SINGLE_EMAIL_CONTENT_PREVIEW_MODE_NONCE ) ) { return; } $allowed_capability = WPML_Init::getInstance()->getService( 'plugin' )->getSetting( 'can-see-submission-data', 'manage_options' ); if ( ! current_user_can( $allowed_capability ) ) { return; } // Get the mail log. $mail = Mail::find_one( absint( $_GET['email_log_id'] ) ); if ( ! $mail ) { return; } echo $this->get_html_preview_message( $mail->get_message() ); exit; } /** * Get the message to be rendered in the preview. * * @since 1.11.1 * * @param string $message Email log message. * * @return string */ private function get_html_preview_message( $message ) { // Strip <xml> and comment tags. $message = preg_replace( '/<xml\b[^>]*>(.*?)<\/xml>/is', '', $message ); $message = preg_replace( '/<!--(.*?)-->/', '', $message ); $allowed_html = wp_kses_allowed_html( 'post' ); $allowed_html['style'][''] = true; return wp_kses( $message, $allowed_html ); } /** * Only add hooks here that are invoked after `current_screen` action hook. * * @since 1.11.0 * * @return void */ public function screen_hooks() { add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); add_action( 'wp_mail_logging_email_logs_tab_display_before', [ $this, 'product_education_email_failure' ] ); add_action( 'wp_mail_logging_email_logs_tab_display_after', [ $this, 'product_education_wp_mail_smtp' ] ); add_filter( 'admin_body_class', [ $this, 'add_admin_body_class' ] ); add_action( 'wp_mail_logging_admin_tab_content', [ $this, 'display_tab_content' ] ); add_filter( 'wp_mail_logging_jquery_confirm_localized_strings', [ $this, 'jquery_confirm_localized_string' ] ); } /** * Enqueue scripts in Email Logs tab. * * @since 1.11.0 * * @return void * * @throws \Exception */ public function enqueue_scripts() { $assets_url = WPML_Init::getInstance()->getService( 'plugin' )->get_assets_url(); $plugin_meta = WPML_Init::getInstance()->getService( 'plugin-meta' ); if ( empty( $plugin_meta['version'] ) ) { return; } $min = ''; if ( ! defined( 'SCRIPT_DEBUG' ) || ! SCRIPT_DEBUG ) { $min = '.min'; } wp_enqueue_script( 'wp-mail-logging-admin-logs', $assets_url . "/js/wp-mail-logging-admin-logs{$min}.js", [ 'jquery' ], $plugin_meta['version'] ); /** * Filters the strings to be localized and used in JS. * * @param string $data Data to be localized. * * @since 1.11.0 */ $filtered_localized_strings = apply_filters( 'wp_mail_logging_admin_logs_localize_strings', [ 'ajaxurl' => admin_url( 'admin-ajax.php' ), ] ); wp_localize_script( 'wp-mail-logging-admin-logs', 'wp_mail_logging_admin_logs', $filtered_localized_strings ); // Enqueue Lity. wp_enqueue_script( 'wp-mail-logging-admin-lity', $plugin_meta['uri'] . "lib/lity/lity.min.js", [], '2.4.1', true ); wp_enqueue_style( 'wp-mail-logging-admin-lity', $plugin_meta['uri'] . "lib/lity/lity.min.css", [], '2.4.1' ); } /** * Display product education for email failures. * * Only display this product education if the current page has email logs with errors. * * @since 1.11.0 * * @return void */ public function product_education_email_failure() { if ( empty( $this->get_current_logs_with_errors() ) ) { return; } /** @var WPML_ProductEducation $productEducation */ $productEducation = WPML_Init::getInstance()->getService( 'productEducation' ); if ( $productEducation->is_banner_dismissed( self::BANNER_TOP_ID ) ) { return; } $content = '<div>'; $content .= '<p>' . esc_html__( "To solve email delivery issues, install WP Mail SMTP (free) - trusted by over 3,000,00 sites!", 'wp-mail-logging' ) . '</p>'; $content .= '<p>' . esc_html__( "Use the one-click install and setup wizard to fix your emails in minutes.", 'wp-mail-logging' ) . '</p>'; $content .= '</div>'; WPML_ProductEducation::create_banner( self::BANNER_TOP_ID, esc_html__( 'Heads up! WP Mail Logging has detected a problem sending emails.', 'wp-mail-logging' ), $content, [ 'url' => SMTPTab::get_url(), 'label' => esc_html__( 'Install WP Mail SMTP', 'wp-mail-logging' ), ] ); } /** * Returns an array containing the current logs in the page with errors. * * @since 1.11.0 * * @return array */ private function get_current_logs_with_errors() { if ( ! is_null( $this->current_logs_with_errors ) ) { return $this->current_logs_with_errors; } if ( ! $this->emailLogList->has_items() ) { $this->current_logs_with_errors = []; return []; } $this->current_logs_with_errors = array_filter( $this->emailLogList->items, function( $log ) { return ! empty( $log['error'] ); } ); return $this->current_logs_with_errors; } /** * Display product education about WP Mail SMTP if there's no logs with errors in the page. * * @since 1.11.0 * * @return void */ public function product_education_wp_mail_smtp() { /** @var WPML_ProductEducation $productEducation */ $productEducation = WPML_Init::getInstance()->getService( 'productEducation' ); if ( $productEducation->is_banner_dismissed( self::BANNER_BOTTOM_ID ) ) { return; } if ( ! empty( $this->get_current_logs_with_errors() ) && ! $productEducation->is_banner_dismissed( self::BANNER_TOP_ID ) ) { return; } $features = [ [ 'filename' => 'archive', 'label' => __( 'Email Logs', 'wp-mail-logging' ), 'list' => [ __( 'See delivery status', 'wp-mail-logging' ), __( 'Resend emails', 'wp-mail-logging' ), __( 'View original email content', 'wp-mail-logging' ), ], ], [ 'filename' => 'single', 'label' => __( 'Individual Log', 'wp-mail-logging' ), 'list' => [ __( 'Review technical details', 'wp-mail-logging' ), __( 'Track open and click data', 'wp-mail-logging' ), __( 'Download sent attachments', 'wp-mail-logging' ), ], ], [ 'filename' => 'reports', 'label' => __( 'Email Reports', 'wp-mail-logging' ), 'list' => [ __( 'Generate deliverability charts', 'wp-mail-logging' ), __( 'Review open & click statistics', 'wp-mail-logging' ), __( 'Get weekly email summary', 'wp-mail-logging' ), ], ], ]; ob_start(); ?> <p> <?php echo wp_kses( sprintf( /* translators: 1: URL to WP Mail SMTP pricing page 2: URL to WP Forms pricing page */ __( 'Want more from your email logs? <strong><a target="_blank" href="%1$s">WP Mail SMTP Pro</a></strong> offers advanced email logging, failed email alerts, backup connections, email reports, email tracking, and much more!', 'wp-mail-logging' ), esc_url( WPML_Utils::get_utm_url( 'https://wpmailsmtp.com/', 'general' ) ) ), [ 'a' => [ 'target' => [], 'href' => [], ], 'strong' => [], ] ) ?> </p> <p> <?php esc_html_e( "We know you'll love the powerful features in WP Mail SMTP. It's used by over 3,000,000 websites.", 'wp-mail-logging' ); ?> </p> <div class="wp-mail-logging-product-education-images-row"> <?php $assets_url = WPML_Init::getInstance()->getService( 'plugin' )->get_assets_url(); foreach ( $features as $feature ) { ?> <div class="wp-mail-logging-product-education-images-row-image"> <a href="<?php echo esc_url( $assets_url . "/images/prod-edu/{$feature['filename']}.png" ); ?>" data-lity data-lity-desc="<?php echo esc_attr( $feature['label'] ); ?>"> <img src="<?php echo esc_url( $assets_url . "/images/prod-edu/{$feature['filename']}-thumbnail.png" ); ?>" alt="<?php esc_attr( $feature['label'] ); ?>"> </a> <span><?php echo esc_html( $feature['label'] ) ?></span> <ul> <?php foreach ( $feature['list'] as $list ) { printf( '<li>%s</li>', esc_html( $list ) ); } ?> </ul> </div> <?php } ?> </div> <?php $content = ob_get_clean(); WPML_ProductEducation::create_banner( self::BANNER_BOTTOM_ID, __( 'Take Your Email Logs to the Next level', 'wp-mail-logging' ), $content, [ 'url' => WPML_Utils::get_utm_url( 'https://wpmailsmtp.com/pricing/', 'Get WP Mail SMTP Pro' ), 'label' => __( 'Get WP Mail SMTP Pro', 'wp-mail-logging' ), 'target' => '_blank', ] ); } /** * Display the Email Logs tab content. * * @since 1.11.0 * * @return void */ public function display_tab_content() { // Admin notices display after the first heading tag. echo '<h1 class="wp-mail-logging-hide">' . esc_html__( 'Email Logs', 'wp-mail-logging' ) . '</h1>'; $this->emailLogList = WPML_Init::getInstance()->getService('emailLogList'); $search = ( isset( $_REQUEST['s'] ) ) ? $_REQUEST['s'] : false; $this->emailLogList->prepare_items( $search ); /** * Fires before displaying the email logs content. * * @since 1.11.0 * * @param WPML_Email_Log_List $emailLogList Email Log List object. */ do_action( 'wp_mail_logging_email_logs_tab_display_before', $this->emailLogList ); $this->emailLogList->display_notices(); $this->single_log_modal(); $this->display_table(); /** * Fires after displaying the email logs content. * * @since 1.11.0 * * @param WPML_Email_Log_List $emailLogList Email Log List object. */ do_action( 'wp_mail_logging_email_logs_tab_display_after', $this->emailLogList ); } /** * Modal template for showing single log details. * * @since 1.11.0 * * @return void */ private function single_log_modal() { global $wp_version; ?> <div id="wp-mail-logging-modal-wrap"> <div id="wp-mail-logging-modal-backdrop"></div> <div id="wp-mail-logging-modal-content-wrap"> <div id="wp-mail-logging-modal-content"> <div id="wp-mail-logging-modal-content-header"> <div id="wp-mail-logging-modal-content-header-title"> <?php _e( 'Message', 'wp-mail-logging' ); ?> </div> <a id="wp-mail-logging-modal-content-header-close" class="wp-mail-logging-modal-close" href="#" title="Close"> <?php if ( $wp_version >= 3.8 ): ?> <div class="dashicons dashicons-no"></div> <?php else: ?> <span class="wp-mail-logging-modal-content-header-compat-close">X</span> <?php endif; ?> </a> </div> <div id="wp-mail-logging-modal-content-body"> <div id="wp-mail-logging-modal-content-header-format-switch"> <ul> <?php foreach( WPML_Init::getInstance()->getService('supported-mail-renderer-formats') as $key => $format ) { $active_class = WPML_Init::getInstance()->getService( 'plugin' )->getSetting( 'preferred-mail-format' ) === $format ? 'wp-mail-logging-active-format' : ''; ?> <li><a id="wp-mail-logging-modal-format-<?php echo esc_attr( $format ); ?>" class="wp-mail-logging-modal-format <?php echo esc_attr( $active_class ); ?>" href="#" data-format="<?php echo esc_attr( $format ); ?>"><?php echo esc_html( $format ); ?></a></li> <?php } ?> </ul> </div> <div id="wp-mail-logging-modal-content-body-content"></div> </div> </div> </div> </div> <?php } /** * Display the email logs table. * * @since 1.11.0 * * @return void */ private function display_table() { ?> <form id="email-list" method="get"> <input type="hidden" name="page" value="<?php echo esc_attr( $_REQUEST['page'] ); ?>" /> <?php wp_nonce_field( WPML_Email_Log_List::NONCE_LIST_TABLE, WPML_Email_Log_List::NONCE_LIST_TABLE . '_nonce' ); $this->emailLogList->search_box( __( 'Search', 'wp-mail-logging' ), 's' ); $this->emailLogList->views(); $this->emailLogList->display(); ?> </form> <?php } /** * Add admin body class for WP Mail Logging logs page. * * @since 1.11.0 * @deprecated 1.12.0 We are now adding this class in all the WP Mail Logging pages. * * @param string $classes Space-separated list of CSS classes. * * @return string */ public function add_admin_body_class( $classes ) { return $classes; } /** * The localised strings for the jQuery confirm dialog. * * @since 1.12.0 * * @param array $strings Localized strings. * * @return mixed */ public function jquery_confirm_localized_string( $strings ) { $strings['delete_log_confirm_msg'] = esc_html__( 'Are you sure you want to delete this log?', 'wp-mail-logging' ); return $strings; } }