*/ class MEC_feature_report extends MEC_base { /** * @var MEC_factory */ private $factory; /** * @var MEC_db */ private $db; /** * @var MEC_main */ private $main; private $settings; private $ml_settings; /** * Constructor method * @author Webnus */ public function __construct() { // Import MEC Factory $this->factory = $this->getFactory(); // Import MEC DB $this->db = $this->getDB(); // Import MEC Main $this->main = $this->getMain(); // MEC Settings $this->settings = $this->main->get_settings(); // MEC Multilingual Settings $this->ml_settings = $this->main->get_ml_settings(); } /** * Initialize search feature * @author Webnus */ public function init() { $this->factory->action('admin_menu', [$this, 'menu'], 11); // Close Custom Text Notification $this->factory->action('wp_ajax_report_event_dates', [$this, 'report_event_dates']); // Event Attendees $this->factory->action('wp_ajax_mec_attendees', [$this, 'attendees']); // Selective Email $this->factory->action('wp_ajax_mec_mass_email', [$this, 'mass_email']); // Mass Action $this->factory->action('wp_ajax_mec_report_mass', [$this, 'mass_actions']); } public function menu() { if(isset($this->settings['booking_status']) && $this->settings['booking_status']) { add_submenu_page('mec-intro', esc_html__('MEC - Report', 'modern-events-calendar-lite'), esc_html__('Report', 'modern-events-calendar-lite'), 'mec_report', 'MEC-report', [$this, 'report']); } } /** * Show report page * @author Webnus * @return void */ public function report() { $path = MEC::import('app.features.report.tpl', true, true); ob_start(); include $path; do_action('mec_display_report_page', $path); echo MEC_kses::full(ob_get_clean()); } /* Report Event Dates */ public function report_event_dates() { // Current User is not Permitted if(!current_user_can('mec_report')) $this->main->response(['success'=>0, 'code'=>'ADMIN_ONLY']); if(!wp_verify_nonce(sanitize_text_field($_REQUEST['nonce']), 'mec_settings_nonce')) exit(); $event_id = sanitize_text_field($_POST['event_id']); $booking_options = get_post_meta($event_id, 'mec_booking', true); $bookings_all_occurrences = $booking_options['bookings_all_occurrences'] ?? 0; if($event_id != 'none') { $dates = $this->db->select("SELECT `tstart`, `tend` FROM `#__mec_dates` WHERE `post_id`='".$event_id."' LIMIT 100"); $occurrence = count($dates) ? reset($dates)->tstart : ''; $date_format = isset($this->ml_settings['booking_date_format1']) && trim($this->ml_settings['booking_date_format1']) ? $this->ml_settings['booking_date_format1'] : 'Y-m-d'; if(get_post_meta($event_id, 'mec_repeat_type', true) === 'custom_days') $date_format .= ' '.get_option('time_format'); echo ''; } else { echo ''; } wp_die(); } public function attendees() { $id = isset($_POST['id']) ? sanitize_text_field($_POST['id']) : 0; $occurrence = isset($_POST['occurrence']) ? sanitize_text_field($_POST['occurrence']) : NULL; $occurrence = explode(':', $occurrence)[0]; if($occurrence == 'all') $occurrence = strtotime('+100 years'); elseif($occurrence == 'none') $occurrence = NULL; $attendees = $this->main->get_event_attendees($id, $occurrence); $html = ''; if(count($attendees)) { $html .= $this->main->get_attendees_table($attendees, $id, $occurrence); $email_button = '

'.esc_html__('If you want to send an email, first select your attendees and then click in the button below, please.', 'modern-events-calendar-lite').'

'; // Certificate if($occurrence && isset($this->settings['certificate_status']) && $this->settings['certificate_status']) { $certificates = get_posts([ 'post_type' => $this->main->get_certificate_post_type(), 'status' => 'publish', 'numberposts' => -1, 'orderby' => 'post_title', 'order' => 'ASC' ]); $certificate_options = ''; foreach($certificates as $certificate) { $certificate_options .= ''; } $email_button .= '

'.esc_html__('Certificate', 'modern-events-calendar-lite').'

'; } } else { $html .= '

'.esc_html__("No Attendees Found!", 'modern-events-calendar-lite').'

'; $email_button = ''; } echo json_encode(['html' => $html, 'email_button' => $email_button]); exit; } public function mass_email() { if(!wp_verify_nonce(sanitize_text_field($_REQUEST['nonce']), 'mec_settings_nonce')) exit(); // Current User is not Permitted if(!current_user_can('mec_report')) $this->main->response(array('success'=>0, 'code'=>'NO_ACCESS')); $mail_recipients_info = isset($_POST['mail_recipients_info']) ? trim(sanitize_text_field($_POST['mail_recipients_info']), ', ') : ''; $mail_subject = isset($_POST['mail_subject']) ? sanitize_text_field($_POST['mail_subject']) : ''; $mail_content = isset($_POST['mail_content']) ? MEC_kses::page($_POST['mail_content']) : ''; $mail_copy = isset($_POST['mail_copy']) ? sanitize_text_field($_POST['mail_copy']) : 0; $render_recipients = array_unique(explode(',', $mail_recipients_info)); $headers = array('Content-Type: text/html; charset=UTF-8'); // Changing some sender email info. $notifications = $this->getNotifications(); $notifications->mec_sender_email_notification_filter(); // Send to Admin if($mail_copy) $render_recipients[] = 'Admin:.:'.get_option('admin_email'); // Set Email Type to HTML add_filter('wp_mail_content_type', array($this->main, 'html_email_type')); foreach($render_recipients as $recipient) { $render_recipient = explode(':.:', $recipient); $to = isset($render_recipient[1]) ? trim($render_recipient[1]) : ''; if(!trim($to)) continue; $message = $mail_content; $message = str_replace('%%name%%', (isset($render_recipient[0]) ? trim($render_recipient[0]) : ''), $message); $mail_arg = array( 'to' => $to, 'subject' => $mail_subject, 'message' => $message, 'headers' => $headers, 'attachments' => array(), ); $mail_arg = apply_filters('mec_before_send_mass_email', $mail_arg, 'mass_email'); // Send the mail wp_mail($mail_arg['to'], html_entity_decode(stripslashes($mail_arg['subject']), ENT_HTML5), wpautop(stripslashes($mail_arg['message'])), $mail_arg['headers'], $mail_arg['attachments']); } // Remove the HTML Email filter remove_filter('wp_mail_content_type', array($this->main, 'html_email_type')); wp_die(true); } public function mass_actions() { // Invalid Request if(!wp_verify_nonce(sanitize_text_field($_REQUEST['_wpnonce'] ?? ''), 'mec_report_mass')) $this->main->response(['success'=>0, 'code'=>'INVALID_NONCE']); // Current User is not Permitted if(!current_user_can('mec_report')) $this->main->response(['success'=>0, 'code'=>'NO_ACCESS']); $task = isset($_POST['task']) ? sanitize_text_field($_POST['task']) : 'suggest'; $events = isset($_POST['events']) && is_array($_POST['events']) ? $_POST['events'] : []; // Invalid Events if(!count($events)) $this->main->response(['success'=>0, 'code'=>'INVALID_EVENTS']); // Suggest New Event if($task === 'suggest') { // New Event to Suggest $new_event = isset($_POST['new_event']) ? sanitize_text_field($_POST['new_event']) : ''; // Invalid Event if(!$new_event) $this->main->response(['success'=>0, 'code'=>'INVALID_EVENT']); // Notifications Library $notifications = $this->getNotifications(); $attendees_count = 0; $sent = []; foreach($events as $id) { $attendees = $this->main->get_event_attendees($id); foreach($attendees as $attendee) { $attendees_count++; $email = $attendee['email'] ?? ''; if(!$email || in_array($email, $sent)) continue; // Do not send multiple emails to same email $sent[] = $email; // Suggest the Event $notifications->suggest_event([ 'email' => $email, 'name' => $attendee['name'] ?? '', ], $new_event, $attendee['book_id'] ?? ''); } } $this->main->response(['success'=>1, 'code'=>'EMAILS_SENT', 'message' => sprintf(esc_html__('%s unique emails are sent successfully to %s attendees.', 'modern-events-calendar-lite'), count($sent), $attendees_count)]); } wp_die(true); } }