hooks();
$summaries_disabled = $this->is_disabled();
if ( $summaries_disabled && \wp_next_scheduled( 'wpforms_email_summaries_cron' ) ) {
\wp_clear_scheduled_hook( 'wpforms_email_summaries_cron' );
}
if ( ! $summaries_disabled && ! \wp_next_scheduled( 'wpforms_email_summaries_cron' ) ) {
\wp_schedule_event( $this->get_first_cron_date_gmt(), 'wpforms_email_summaries_weekly', 'wpforms_email_summaries_cron' );
}
}
/**
* Get the instance of a class and store it in itself.
*
* @since 1.5.4
*/
public static function get_instance() {
static $instance;
if ( ! $instance ) {
$instance = new self();
}
return $instance;
}
/**
* Email Summaries hooks.
*
* @since 1.5.4
*/
public function hooks() {
\add_filter( 'wpforms_settings_defaults', array( $this, 'disable_summaries_setting' ) );
\add_action( 'wpforms_settings_updated', array( $this, 'deregister_fetch_info_blocks_task' ) );
if ( ! $this->is_disabled() ) {
\add_action( 'init', array( $this, 'preview' ) );
\add_filter( 'cron_schedules', array( $this, 'add_weekly_cron_schedule' ) );
\add_action( 'wpforms_email_summaries_cron', array( $this, 'cron' ) );
\add_filter( 'wpforms_tasks_get_tasks', array( $this, 'register_fetch_info_blocks_task' ) );
}
}
/**
* Check if Email Summaries are disabled in settings.
*
* @since 1.5.4
*
* @return bool
*/
protected function is_disabled() {
return (bool) apply_filters( 'wpforms_emails_summaries_is_disabled', (bool) \wpforms_setting( 'email-summaries-disable' ) );
}
/**
* Add "Disable Email Summaries" to WPForms settings.
*
* @since 1.5.4
*
* @param array $settings WPForms settings.
*
* @return mixed
*/
public function disable_summaries_setting( $settings ) {
if ( (bool) apply_filters( 'wpforms_emails_summaries_is_disabled', false ) ) {
return $settings;
}
$url = \add_query_arg(
array(
'wpforms_email_template' => 'summary',
'wpforms_email_preview' => '1',
),
\admin_url()
);
$desc = \esc_html__( 'Disable Email Summaries weekly delivery.', 'wpforms-lite' );
if ( ! $this->is_disabled() ) {
$desc .= '
' . \esc_html__( 'View Email Summary Example', 'wpforms-lite' ) . '';
}
$settings['misc']['email-summaries-disable'] = array(
'id' => 'email-summaries-disable',
'name' => \esc_html__( 'Disable Email Summaries', 'wpforms-lite' ),
'desc' => $desc,
'type' => 'checkbox',
);
return $settings;
}
/**
* Preview Email Summary.
*
* @since 1.5.4
*/
public function preview() {
if ( ! wpforms_current_user_can() ) {
return;
}
if ( ! isset( $_GET['wpforms_email_preview'], $_GET['wpforms_email_template'] ) ) { // phpcs:ignore
return;
}
if ( $_GET['wpforms_email_template'] !== 'summary' ) { // phpcs:ignore
return;
}
$args = [
'body' => [
'entries' => $this->get_entries(),
'info_block' => ( new InfoBlocks() )->get_next(),
],
];
$template = ( new Templates\Summary() )->set_args( $args );
/**
* Filters the summaries email template.
*
* @since 1.5.4
*
* @param Templates\Summary $template Default summaries email template.
*/
$template = apply_filters( 'wpforms_emails_summaries_template', $template );
$content = $template->get();
if ( wpforms_setting( 'email-template', 'default' ) !== 'default' ) {
$content = wpautop( $content );
}
echo $content; // phpcs:ignore
exit;
}
/**
* Get next cron occurrence date.
*
* @since 1.5.4
*
* @return int
*/
protected function get_first_cron_date_gmt() {
$date = \absint( \strtotime( 'next monday 2pm' ) - ( \get_option( 'gmt_offset' ) * \HOUR_IN_SECONDS ) );
return $date ? $date : \time();
}
/**
* Add custom Email Summaries cron schedule.
*
* @since 1.5.4
*
* @param array $schedules WP cron schedules.
*
* @return array
*/
public function add_weekly_cron_schedule( $schedules ) {
$schedules['wpforms_email_summaries_weekly'] = array(
'interval' => \WEEK_IN_SECONDS,
'display' => \esc_html__( 'Weekly WPForms Email Summaries', 'wpforms-lite' ),
);
return $schedules;
}
/**
* Email Summaries cron callback.
*
* @since 1.5.4
*/
public function cron() {
$entries = $this->get_entries();
// Email won't be sent if there are no form entries.
if ( empty( $entries ) ) {
return;
}
$info_blocks = new InfoBlocks();
$next_block = $info_blocks->get_next();
$args = [
'body' => [
'entries' => $entries,
'info_block' => $next_block,
],
];
$template = ( new Templates\Summary() )->set_args( $args );
/** This filter is documented in preview() method above. */
$template = apply_filters( 'wpforms_emails_summaries_template', $template );
$content = $template->get();
if ( ! $content ) {
return;
}
$parsed_home_url = wp_parse_url( home_url() );
$site_domain = $parsed_home_url['host'];
if ( is_multisite() && isset( $parsed_home_url['path'] ) ) {
$site_domain .= $parsed_home_url['path'];
}
$subject = sprintf(
/* translators: %s - site domain. */
esc_html__( 'Your Weekly WPForms Summary for %s', 'wpforms-lite' ),
$site_domain
);
/**
* Filters the summaries email subject.
*
* @since 1.5.4
*
* @param string $subject Default summaries email subject.
*/
$subject = apply_filters( 'wpforms_emails_summaries_cron_subject', $subject );
/**
* Filters the summaries recipient email address.
*
* @since 1.5.4
*
* @param string Default summaries recipient email address.
*/
$to_email = apply_filters( 'wpforms_emails_summaries_cron_to_email', get_option( 'admin_email' ) );
$sent = ( new Mailer() )
->template( $template )
->subject( $subject )
->to_email( $to_email )
->send();
if ( $sent === true ) {
$info_blocks->register_sent( $next_block );
}
}
/**
* Get form entries.
*
* @since 1.5.4
*
* @return array
*/
protected function get_entries() {
if ( \wpforms()->pro ) {
$entries_count = new \WPForms\Pro\Reports\EntriesCount();
$results = $entries_count->get_by( 'form', 0, 7, 'previous sunday' );
} else {
$entries_count = new \WPForms\Lite\Reports\EntriesCount();
$results = $entries_count->get_by_form();
}
return $results;
}
/**
* Register Action Scheduler task to fetch and cache Info Blocks.
*
* @since 1.6.4
*
* @param \WPForms\Tasks\Task[] $tasks List of task classes.
*
* @return array
*/
public static function register_fetch_info_blocks_task( $tasks ) {
$tasks[] = FetchInfoBlocksTask::class;
return $tasks;
}
/**
* Deregister Action Scheduler task to fetch and cache Info Blocks.
*
* @since 1.6.4
*/
public function deregister_fetch_info_blocks_task() {
if ( ! $this->is_disabled() ) {
return;
}
// Deregister the task.
( new FetchInfoBlocksTask() )->cancel();
// Delete last run time record.
delete_option( FetchInfoBlocksTask::LAST_RUN );
// Remove the cache file if it exists.
$file_name = ( new InfoBlocks() )->get_cache_file_path();
if ( file_exists( $file_name ) ) {
@unlink( $file_name ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
}
}
}