<?php
/**
* Email Summaries main class.
*
* @since 8.19.0
*/
class MonsterInsights_Email_Summaries {
/**
* Email template to use for this class.
*
* @since 8.19.0
*
* @var string
*/
private $email_template = 'summaries';
/**
* Test email template
*
* @since 8.19.0
*
* @var string
*/
private $test_email_template = 'summaries-test';
/**
* Email options
*
* @since 8.19.0
*
* @var string
*/
private $email_options;
/**
* Constructor.
*
* @since 8.19.0
*/
public function __construct() {
$options = array();
$email_summaries = monsterinsights_get_option( 'email_summaries', 'on' );
$options['email_summaries'] = $email_summaries;
$options['summaries_html_template'] = monsterinsights_get_option( 'summaries_html_template', 'yes' );
$options['summaries_carbon_copy'] = 'no';
$options['summaries_email_addresses'] = array(get_option('admin_email'));
$options['summaries_header_image'] = false;
$this->email_options = $options;
$this->hooks();
// Remove weekly cron job.
wp_clear_scheduled_hook( 'monsterinsights_email_summaries_weekly' );
// Schedule or clear Monthly cron job.
if ( ! empty( $email_summaries ) && 'on' !== $email_summaries && wp_next_scheduled( 'monsterinsights_email_summaries_cron' ) ) {
wp_clear_scheduled_hook( 'monsterinsights_email_summaries_cron' );
}
if ( ! empty( $email_summaries ) && 'on' === $email_summaries && ! wp_next_scheduled( 'monsterinsights_email_summaries_cron' ) ) {
wp_schedule_event( $this->get_first_cron_date(), 'monsterinsights_email_summaries_monthly', 'monsterinsights_email_summaries_cron' );
}
}
/**
* Email Summaries hooks.
*
* @since 8.19.0
*/
public function hooks() {
add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) );
if ( ! empty( $this->email_options['email_summaries'] ) && 'on' === $this->email_options['email_summaries'] ) {
add_action( 'init', array( $this, 'preview' ) );
add_filter( 'monsterinsights_email_template_paths', array( $this, 'add_email_template_path' ) );
add_filter( 'monsterinsights_emails_templates_set_initial_args', array( $this, 'set_template_args' ) );
add_filter( 'cron_schedules', array( $this, 'add_monthly_cron_schedule' ) );
add_action( 'monsterinsights_email_summaries_cron', array( $this, 'cron' ) );
add_action( 'wp_ajax_monsterinsights_send_test_email', array( $this, 'send_test_email' ) );
add_action( 'monsterinsights_after_update_settings', array(
$this,
'reset_email_summaries_options'
), 10, 2 );
}
}
/**
* Load required scripts for email summaries features
*
* @return void
* @since 8.19.0
*
*/
public function admin_scripts() {
if ( monsterinsights_is_settings_page() ) {
// This will load the required dependencies for the WordPress media uploader
wp_enqueue_media();
}
}
/**
* Check if Email Summaries are enabled in settings.
*
* @return bool
* @since 8.19.0
*
*/
protected function is_enabled() {
if ( ! isset( $this->is_enabled ) ) {
$this->is_enabled = false;
if ( ! $this->is_preview() ) {
$info_block = new MonsterInsights_Summaries_InfoBlocks();
$info_block = $info_block->fetch_data();
$email_addresses = $this->get_email_addresses();
if ( ! empty( $info_block ) ) {
if ( 'on' === $this->email_options['email_summaries'] && ! empty( $email_addresses ) && true === $info_block['status'] ) {
$this->is_enabled = true;
}
}
}
}
return apply_filters( 'monsterinsights_emails_summaries_is_enabled', $this->is_enabled );
}
/**
* Preview Email Summary.
*
* @since 8.19.0
*/
public function preview() {
if ( ! current_user_can( 'monsterinsights_save_settings' ) ) {
return;
}
if ( ! $this->is_preview() ) {
return;
}
// initiate email class.
$emails = new MonsterInsights_WP_Emails( $this->email_template );
// check if html template option is enabled
if ( ! $this->is_enabled_html_template() ) {
$emails->__set( 'html', false );
}
$content = $emails->build_email();
if ( ! $this->is_enabled_html_template() ) {
$content = wpautop( $content );
}
echo $content; // phpcs:ignore
exit;
}
/**
* Check whether it's in preview mode
*
* @return boolean
* @since 8.19.0
*
*/
public function is_preview() {
if ( isset( $_GET['monsterinsights_email_preview'], $_GET['monsterinsights_email_template'] ) && 'summary' === $_GET['monsterinsights_email_template'] ) { // phpcs:ignore
return true;
}
return false;
}
/**
* Get the email header image.
*
* @return string The email from address.
* @since 8.19.0
*
*/
public function get_header_image() {
// set default header image
$img = array(
'url' => plugins_url( "lite/assets/img/emails/summaries/logo-MonsterInsights.png", MONSTERINSIGHTS_PLUGIN_FILE ),
'2x' => plugins_url( "lite/assets/img/emails/summaries/logo-MonsterInsights@2x.png", MONSTERINSIGHTS_PLUGIN_FILE ),
);
if ( ! empty( $this->email_options['summaries_header_image'] ) ) {
$img['url'] = $this->email_options['summaries_header_image'];
$img['2x'] = '';
}
return apply_filters( 'monsterinsights_email_header_image', $img );
}
/**
* Get next cron occurrence date.
*
* @return int
* @since 8.19.0
*
*/
protected function get_first_cron_date() {
$schedule = array();
$schedule['day'] = wp_rand( 0, 1 );
$schedule['hour'] = wp_rand( 0, 23 );
$schedule['minute'] = wp_rand( 0, 59 );
$schedule['second'] = wp_rand( 0, 59 );
$schedule['offset'] = ( $schedule['day'] * DAY_IN_SECONDS ) +
( $schedule['hour'] * HOUR_IN_SECONDS ) +
( $schedule['minute'] * MINUTE_IN_SECONDS ) +
$schedule['second'];
$date = strtotime( 'next saturday' ) + $schedule['offset'];
return $date;
}
/**
* Add summaries email template path
*
* @param array $schedules WP cron schedules.
*
* @return array
* @since 8.19.0
*
*/
public function add_email_template_path( $file_paths ) {
$file_paths['1000'] = MONSTERINSIGHTS_PLUGIN_DIR . 'lite/includes/emails/templates';
return $file_paths;
}
/**
* Add custom Email Summaries cron schedule.
*
* @param array $schedules WP cron schedules.
*
* @return array
* @since 8.19.0
*
*/
public function add_monthly_cron_schedule( $schedules ) {
$schedules['monsterinsights_email_summaries_monthly'] = array(
'interval' => MONTH_IN_SECONDS,
'display' => esc_html__( 'Monthly MonsterInsights Email Summaries', 'google-analytics-for-wordpress' ),
);
return $schedules;
}
/**
* Get email subject
*
* @since 8.19.0
*/
public function get_email_subject() {
$site_url = get_site_url();
$site_url_parsed = parse_url( $site_url );// Can't use wp_parse_url as that was added in WP 4.4 and we still support 3.8.
$site_url = isset( $site_url_parsed['host'] ) ? $site_url_parsed['host'] : $site_url;
// Translators: The domain of the site is appended to the subject.
$subject = sprintf( __( 'MonsterInsights Summary - %s', 'google-analytics-for-wordpress' ), $site_url );
return apply_filters( 'monsterinsights_emails_summaries_cron_subject', $subject );
}
/**
* Get email addresses to send
*
* @since 8.19.0
*/
public function get_email_addresses() {
$emails = $this->email_options['summaries_email_addresses'];
return apply_filters( 'monsterinsights_email_addresses_to_send', $emails );
}
/**
* check if carbon copy option is enabled
*
* @since 8.19.0
*/
public function is_cc_enabled() {
$value = false;
if ( 'yes' === $this->email_options['summaries_carbon_copy'] ) {
$value = true;
}
return apply_filters( 'monsterinsights_email_cc_enabled', $value, $this );
}
/**
* Check if html template option is turned on
*
* @return bool
* @since 8.19.0
*
*/
public function is_enabled_html_template() {
$value = true;
if ( 'no' === $this->email_options['summaries_html_template'] ) {
$value = false;
}
return apply_filters( 'monsterinsights_email_html_template', $value, $this );
}
/**
* Email Summaries cron callback.
*
* @since 8.19.0
*/
public function cron() {
if ( ! $this->is_enabled() ) {
return;
}
if( !monsterinsights_is_authed() ){
return;
}
$email = array();
$email['subject'] = $this->get_email_subject();
$email['address'] = $this->get_email_addresses();
$email['address'] = array_map( 'sanitize_email', $email['address'] );
// Create new email.
$emails = new MonsterInsights_WP_Emails( $this->email_template );
// Maybe include CC.
if ( $this->is_cc_enabled() ) {
$emails->__set( 'cc', implode( ',', $this->get_email_addresses() ) );
}
// check if html template option is enabled
if ( ! $this->is_enabled_html_template() ) {
$emails->__set( 'html', false );
}
$info_blocks = new MonsterInsights_Summaries_InfoBlocks();
$next_block = $info_blocks->get_next();
// Go.
if( !empty( $email['address'] ) ){
foreach ( $email['address'] as $address ) {
$sent = $emails->send( trim( $address ), $email['subject'] );
if ( true === $sent && ! empty( $next_block ) ) {
$info_blocks->register_sent( $next_block );
}
}
}
}
/**
* Send test email
*
* @since 8.19.0
*/
public function send_test_email() {
// Run a security check first.
check_ajax_referer( 'mi-admin-nonce', 'nonce' );
if ( ! current_user_can( 'monsterinsights_save_settings' ) ) {
return;
}
$email = array();
$email['subject'] = '[Test email] MonsterInsights Summary';
$email['address'] = $this->get_email_addresses();
$email['address'] = array_map( 'sanitize_email', $email['address'] );
// Create new email.
$emails = new MonsterInsights_WP_Emails( $this->test_email_template );
// Maybe include CC.
if ( $this->is_cc_enabled() ) {
$emails->__set( 'cc', implode( ',', $this->get_email_addresses() ) );
}
// check if html template option is enabled
if ( ! $this->is_enabled_html_template() ) {
$emails->__set( 'html', false );
}
// Go.
if(!empty($email['address'])){
foreach ( $email['address'] as $address ) {
if ( ! $emails->send( trim( $address ), $email['subject'] ) ) {
wp_send_json_error();
}
}
}
wp_send_json_success();
}
/**
* Email summaries template arguments
*
* @since 8.19.0
*/
public function set_template_args( $args ) {
if ( $this->is_enabled_html_template() ) {
$args['header']['header_image'] = $this->get_header_image();
}
$args['body']['title'] = esc_html__( 'Website Traffic Summary', 'google-analytics-for-wordpress' );
$args['body']['description'] = esc_html__( 'Let’s take a look at how your website traffic performed in the past month.', 'google-analytics-for-wordpress' );
$args['body']['summaries'] = $this->get_summaries();
$args['body']['startDate'] = $this->get_summaries_start_date();
$args['body']['endDate'] = $this->get_summaries_end_date();
$info_blocks = new MonsterInsights_Summaries_InfoBlocks();
$next_block = $info_blocks->get_next();
if ( ! empty( $next_block ) ) {
$args['body']['info_block'] = $next_block;
}
$args['body']['settings_tab_url'] = esc_url( admin_url( 'admin.php?page=monsterinsights_settings#/advanced' ) );
$args['footer']['settings_tab_url'] = esc_url( admin_url( 'admin.php?page=monsterinsights_settings#/advanced' ) );
$args['body']['summaries']['data']['galinks']['topposts'] = admin_url( 'admin.php?page=monsterinsights_reports#/' );
return apply_filters( 'monsterinsights_email_summaries_template_args', $args );
}
/**
* get the start date from the last month
*
* @since 8.19.0
*/
public function get_summaries_start_date() {
return date( "Y-m-d", strtotime( "first day of last month" ) ); // first day of last month
}
/**
* get the end date from the last week
*
* @since 8.19.0
*/
public function get_summaries_end_date() {
return date( "Y-m-d", strtotime( "last day of last month" ) ); // last day of last month
}
/**
* data for email template
*
* @since 8.19.0
*/
public function get_summaries() {
$data = array();
// get overview report data for email summaries template
$report_name = 'summaries';
$report = MonsterInsights()->reporting->get_report( $report_name );
$isnetwork = ! empty( $_REQUEST['isnetwork'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['isnetwork'] ) ) : '';
// get the data of last month
$args = array(
'start' => $this->get_summaries_start_date(),
'end' => $this->get_summaries_end_date(),
);
if ( $isnetwork ) {
$args['network'] = true;
}
if ( monsterinsights_is_pro_version() && ! MonsterInsights()->license->license_can( $report->level ) ) {
$data = array(
'success' => false,
'message' => __( "You don't have permission to view MonsterInsights reports.", 'google-analytics-for-wordpress' ),
);
} else {
$data = apply_filters( 'monsterinsights_vue_reports_data', $report->get_data( $args ), $report_name, $report );
}
return $data;
}
/**
* reset email summaries options
*
* @since 8.19.0
*/
public function reset_email_summaries_options( $key, $value ) {
if ( isset( $key ) && $key === 'email_summaries' && isset( $value ) && $value === 'off' ) {
$default_email = array(
'email' => get_option( 'admin_email' ),
);
monsterinsights_update_option( 'summaries_email_addresses', array( $default_email ) );
monsterinsights_update_option( 'summaries_header_image', '' );
}
}
}