Files
krolewskie-miody.pl/wp-content/plugins/userfeedback-lite/includes/emails/class-userfeedback-email-response-notification.php
2026-04-28 15:13:50 +02:00

369 lines
8.7 KiB
PHP

<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Email Response Notifications main class.
*
* @since 1.0.0
*/
class UserFeedback_Email_Response_Notification {
/**
* Email template to use for this class.
*
* @since 1.0.0
*
* @var string
*/
private $email_template = 'response-notification';
/**
* Test email template
*
* @since 1.0.0
*
* @var string
*/
private $test_email_template = 'response-notification';
/**
* Email options
*
* @since 1.0.0
*
* @var string
*/
private $email_options = array();
/**
* The survey this notification is for
*
* @since 1.0.0
*
* @var object
*/
private $survey;
/**
* The response this notification is for
*
* @since 1.0.0
*
* @var object
*/
private $response;
/**
* Notification logic config
*
* @since 1.0.0
*
* @var
*/
private $config;
/**
* Constructor.
*
* @since 1.0.0
*/
public function __construct( $survey, $response ) {
$this->survey = $survey;
$this->response = $response;
$this->config = $survey->notifications->email;
}
private function set_options() {
$options = array();
$options['email_addresses'] = $this->config->addresses;
$options['html_template'] = userfeedback_get_option( 'summaries_html_template' );
$options['header_image'] = userfeedback_get_option( 'notifications_header_image' );
$this->email_options = $options;
}
/**
* Send email
*
* @return void
*/
private function send() {
$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 Userfeedback_WP_Emails( $this->email_template );
$emails->set_initial_args( $this->get_template_args() );
// check if html template option is enabled
if ( ! $this->is_enabled_html_template() ) {
$emails->__set( 'html', false );
}
// Go.
foreach ( $email['address'] as $address ) {
if ( ! $emails->send( trim( $address ), $email['subject'] ) ) {
wp_send_json_error();
}
}
}
/**
* Check if email should be sent
*
* @return void
*/
public function maybe_send() {
// if ( !$this->config->active || empty( $this->config->addresses ) ) {
// If notifications aren't active, or no emails are set, bail...
// return;
// }
$logic = $this->config->logic;
if ( $logic->enable && sizeof( $logic->conditions ) > 0 ) {
$send = true;
foreach ( $logic->conditions as $condition ) {
$question_id = $condition->question_id;
$answer = $this->get_question_answer( $question_id );
if ( empty( $answer ) ) {
break;
}
$symbol = $condition->compare;
$submitted_value = $answer->value;
$compare_to = $condition->value;
$send = $send && userfeedback_check_logic( $symbol, $submitted_value, $compare_to );
}
if ( ! $send ) {
return;
}
}
$this->set_options();
$this->send();
}
/**
* Get the email header image.
*
* @since 1.0.0
*
* @return string The email from address.
*/
public function get_header_image() {
// set default header image
$img = array(
'url' => plugins_url( 'assets/img/emails/userfeedback-logo.png', USERFEEDBACK_PLUGIN_FILE ),
'2x' => '', // plugins_url( "assets/img/emails/logo-MonsterInsights@2x.png", USERFEEDBACK_PLUGIN_FILE ),
);
if ( userfeedback_is_pro_version() && userfeedback_is_licensed() && ! empty( $this->email_options['header_image'] ) ) {
$img['url'] = $this->email_options['header_image'];
$img['2x'] = '';
}
return apply_filters( 'userfeedback_email_header_image', $img );
}
/**
* Get email subject
*
* @since 1.0.0
*/
public function get_email_subject() {
$site_url = get_site_url();
$site_url_parsed = wp_parse_url( $site_url );
// Translators: The domain of the site is appended to the subject.
$subject = sprintf( __( 'New UserFeedback Response - %s', 'userfeedback-lite' ), $this->survey->title );
return apply_filters( 'userfeedback_emails_new_response_subject', $subject, $this->survey, $this->response );
}
/**
* Get email addresses to send
*
* @since 1.0.0
*/
public function get_email_addresses() {
$emails = array();
$email_addresses = $this->config->active ? explode( ',', $this->config->addresses ) : array();
if ( ! empty( $email_addresses ) ) {
foreach ( $email_addresses as $email_address ) {
if ( ! empty( $email_address ) && is_email( $email_address ) ) {
$emails[] = $email_address;
}
}
}
return apply_filters( 'userfeedback_email_notification_addresses', $emails, $this->survey, $this->response );
}
/**
* Check if html template option is turned on
*
* @since 1.0.0
*
* @return bool
*/
public function is_enabled_html_template() {
$value = true;
if ( false === $this->email_options['html_template'] ) {
$value = false;
}
return apply_filters( 'userfeedback_email_html_template', $value, $this );
}
/**
* Get email summaries template arguments
*
* @since 1.0.0
*/
private function get_template_args() {
$args['preview_title'] = $this->get_email_subject();
$args['header_image'] = $this->get_header_image();
$args['survey_id'] = $this->survey->id;
$args['survey_title'] = $this->survey->title;
$args['title'] = sprintf(
// translators: %s is the survey title.
__( 'New Response to <b>%s</b>', 'userfeedback-lite' ),
esc_html( $this->survey->title )
);
$survey_id = $this->survey->id;
$notification_config_url = userfeedback_get_screen_url( 'userfeedback_surveys', "edit/$survey_id/notifications" );
$args['description'] =
sprintf(
// translators: %1$s is the site name, %2$s is the URL to notification settings.
__( 'You are receiving this UserFeedback survey notification from <b>%1$s</b>. <a href="%2$s">Adjust your settings here</a>.', 'userfeedback-lite' ),
esc_html( get_bloginfo( 'name' ) ),
esc_url( $notification_config_url )
);
$args['answers'] = $this->get_answers();
$args['settings_tab_url'] = $notification_config_url;
return apply_filters( 'userfeedback_email_notification_template_args', $args );
}
/**
* Get response answers
*
* @return array|array[]
*/
private function get_answers() {
$questions = $this->survey->questions;
$answers = array_map(
function( $question ) {
return array(
'question_id' => $question->id,
'question_title' => $question->title,
'type' => $question->type,
'value' => $this->get_question_answer_html( $question ),
);
},
$questions
);
return $answers;
}
private function get_question_answer( $question_id ) {
$answers = $this->response->answers;
// Find answer...
foreach ( $answers as $answer ) {
if ( $answer->question_id === $question_id ) {
return $answer;
}
}
return null;
}
/**
* Get processed question answer
*
* @param $question
* @return string
*/
private function get_question_answer_html( $question ) {
$answers = $this->response->answers;
$found_answer = $this->get_question_answer( $question->id );
$skipped_content = sprintf(
// translators: %1$s is an opening HTML tag, %2$s is a closing HTML tag.
__( '%1$sSkipped%2$s', 'userfeedback-lite' ),
'<small><i>',
'</i></small>'
);
if ( empty( $found_answer ) ) {
return $skipped_content;
}
$raw_value = $found_answer->value;
// If answer is null, the question was skipped...
if ( empty( $raw_value ) ) {
return $skipped_content;
};
$value = $raw_value;
if ( $question->type === 'email' ) {
$value = sprintf(
'<a href="mailto:%1$s">%1$s</a>',
$raw_value
);
} elseif ( $question->type === 'nps' ) {
$value = $value . '<small>/10</small>';
} elseif ( $question->type === 'checkbox' ) {
$value = implode( ', ', $value );
} elseif ( $question->type === 'star-rating' ) {
// translators: %s is the number of stars.
$value = sprintf( __( '%s stars', 'userfeedback-lite' ), $value );
}
if ( ! empty( $found_answer->extra ) ) {
foreach ( $found_answer->extra as $attr => $extra_value ) {
$value .= sprintf(
'<br/><p>- %s: <i>%s</i></p>',
$attr,
$extra_value
);
}
}
return $value;
}
}
// Hook onto response action
function userfeedback_send_response_email_notification( $survey_id, $response_id ) {
$survey = UserFeedback_Survey::find( $survey_id );
$response = UserFeedback_Response::find( $response_id );
$notification_email = new UserFeedback_Email_Response_Notification( $survey, $response );
$notification_email->maybe_send();
}
add_action( 'userfeedback_survey_response', 'userfeedback_send_response_email_notification', 10, 2 );