You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

170 lines
5.2 KiB
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
/**
* Code related to the update notification emails.
*
* @since 1.0.57
* @package RankMath
* @subpackage RankMath\Core
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath;
use RankMath\KB;
use RankMath\Traits\Hooker;
use RankMath\Helper;
defined( 'ABSPATH' ) || exit;
/**
* Common class.
*/
class Update_Email {
use Hooker;
/**
* Constructor method.
*/
public function __construct() {
$this->filter( 'pre_set_site_transient_update_plugins', 'maybe_send_update_notification_email', 130 );
}
/**
* Maybe send the update notification email to the administrator if the setting is turned on.
*
* @param mixed $transient update_plugins site transient value.
* @return mixed
*/
public function maybe_send_update_notification_email( $transient ) {
if ( ! Helper::get_settings( 'general.update_notification_email' ) ) {
return $transient;
}
$should_send = $this->do_filter( 'admin/should_send_update_notification', $this->should_send_email( $transient ), $transient );
if ( ! $should_send ) {
return $transient;
}
$to = get_site_option( 'admin_email' );
// Translators: placeholder is the site title.
$subject = __( '[%s] An update is available for Rank Math', 'rank-math' );
$subject = sprintf( $subject, wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ) );
$body = [];
$body[] = __( 'Hello,', 'rank-math' ) . "\n";
// Translators: placeholder is the site URL.
$body[] = sprintf( __( 'This is an automated email to let you know that there is an update available for the Rank Math SEO plugin installed on: %s', 'rank-math' ), get_home_url() ) . "\n";
$products = $this->do_filter( 'admin/update_notification_products', $this->get_updatable_products( $transient ), $transient );
$list = $this->get_products_list( $products );
$body[] = $list;
// Translators: placeholder is the new admin page URL.
$body[] = sprintf( __( 'To ensure your site is always on the latest, most up-to-date version of Rank Math - we recommend logging into the admin area to update the plugin as soon as possible: %s', 'rank-math' ), admin_url( 'update-core.php' ) ) . "\n";
// Add a note about the support forums.
$body[] = __( 'If you have any questions or experience any issues our support team is at your disposal:', 'rank-math' );
$body[] = __( 'https://support.rankmath.com/', 'rank-math' );
$body[] = "\n" . '-';
$body[] = __( 'Rank Math Team', 'rank-math' );
$body = implode( "\n", $body );
$headers = '';
$email = compact( 'to', 'subject', 'body', 'headers' );
$email = $this->do_filter( 'admin/update_notification_email', $email );
$result = wp_mail( $email['to'], $email['subject'], $email['body'], $email['headers'] );
$stored = get_option( 'rank_math_update_notifications_sent', [] );
$new_opt = $stored;
foreach ( $products as $key => $value ) {
$new_opt[ $key ] = $value;
}
update_option( 'rank_math_update_notifications_sent', $new_opt, false );
return $transient;
}
/**
* Check if we should send an update email or not, based on the update_plugins transient value.
*
* @param mixed $transient Transient value.
* @return boolean
*/
public function should_send_email( $transient ) {
// No need to send email if auto-update is enabled.
if ( Helper::get_auto_update_setting() ) {
return false;
}
if ( ! is_object( $transient )
|| empty( $transient->response )
|| empty( $transient->response['seo-by-rank-math/rank-math.php'] )
|| empty( $transient->response['seo-by-rank-math/rank-math.php']->new_version )
) {
return false;
}
$new_version = $transient->response['seo-by-rank-math/rank-math.php']->new_version;
// Now let's check if we've already sent this email.
$sent = get_option( 'rank_math_update_notifications_sent', [ 'free' => [ 'new_version' => '1.0' ] ] );
if ( ! isset( $sent['free'] ) ) {
$sent['free'] = [ 'new_version' => '1.0' ];
}
if ( version_compare( $sent['free']['new_version'], $new_version, '>=' ) ) {
return false;
}
return true;
}
/**
* Get list of updatable products and their data.
*
* @param mixed $transient The update_plugins transient value.
* @return array
*/
public function get_updatable_products( $transient ) {
if ( ! $this->should_send_email( $transient ) ) {
return [];
}
$old_version = rank_math()->version;
$new_version = $transient->response['seo-by-rank-math/rank-math.php']->new_version;
$products = [
'free' => [
'name' => __( 'Rank Math Free', 'rank-math' ),
'old_version' => $old_version,
'new_version' => $new_version,
'changelog' => KB::get( 'changelog-free', 'Changelog Update notification mail' ),
],
];
return $products;
}
/**
* Turn products array into a human-readable list.
*
* @param array $products_array Products array.
* @return string
*/
public function get_products_list( $products_array ) {
$list = '';
foreach ( $products_array as $product_data ) {
// Translators: placeholders are the old and new version numbers.
$list .= sprintf( __( '%1$s: Old %2$s -> New %3$s | Changelog: %4$s', 'rank-math' ), $product_data['name'], $product_data['old_version'], $product_data['new_version'], $product_data['changelog'] ) . "\n";
}
return $list;
}
}