298 lines
6.7 KiB
PHP
298 lines
6.7 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Email Summary Blurb Class.
|
||
|
*
|
||
|
* @package EDD
|
||
|
* @subpackage Emails
|
||
|
* @copyright Copyright (c) 2022, Easy Digital Downloads, LLC
|
||
|
* @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
|
||
|
* @since 3.1
|
||
|
*/
|
||
|
|
||
|
// Exit if accessed directly.
|
||
|
defined( 'ABSPATH' ) || exit;
|
||
|
|
||
|
use \EDD\Utils\EnvironmentChecker;
|
||
|
|
||
|
/**
|
||
|
* EDD_Email_Summary_Blurb Class.
|
||
|
*
|
||
|
* Takes care of fetching the available blurbs and determines
|
||
|
* which blurb meets the conditions and is next to be sent.
|
||
|
*
|
||
|
* @since 3.1
|
||
|
*/
|
||
|
class EDD_Email_Summary_Blurb {
|
||
|
|
||
|
/**
|
||
|
* URL of the endpoint for the blurbs JSON.
|
||
|
*
|
||
|
* @since 3.1
|
||
|
*
|
||
|
* @const string
|
||
|
*/
|
||
|
const BLURBS_ENDPOINT_URL = 'https://plugin.easydigitaldownloads.com/wp-content/summaries.json';
|
||
|
|
||
|
/**
|
||
|
* Environment Checker class.
|
||
|
*
|
||
|
* @var EnvironmentChecker
|
||
|
*/
|
||
|
protected $environment_checker;
|
||
|
|
||
|
/**
|
||
|
* Class constructor.
|
||
|
*
|
||
|
* @since 3.1
|
||
|
*/
|
||
|
public function __construct() {
|
||
|
|
||
|
// Load plugin.php so that we can use is_plugin_active().
|
||
|
require_once ABSPATH . 'wp-admin/includes/plugin.php';
|
||
|
$this->environment_checker = new EnvironmentChecker();
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Fetch all blurbs from remote endpoint.
|
||
|
*
|
||
|
* @since 3.1
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function fetch_blurbs() {
|
||
|
$blurbs = array();
|
||
|
$request_body = false;
|
||
|
|
||
|
$request = wp_safe_remote_get( self::BLURBS_ENDPOINT_URL );
|
||
|
|
||
|
// @todo - Detect first response code, before redirect!
|
||
|
if ( ! is_wp_error( $request ) && 200 === wp_remote_retrieve_response_code( $request ) ) {
|
||
|
$request_body = wp_remote_retrieve_body( $request );
|
||
|
$blurbs = json_decode( $request_body, true );
|
||
|
}
|
||
|
|
||
|
if ( empty( $request_body ) ) {
|
||
|
// HTTP Request for blurbs is empty, fallback to local .json file.
|
||
|
$fallback_json = wp_json_file_decode( EDD_PLUGIN_DIR . 'includes/admin/promos/email-summary/blurbs.json', array( 'associative' => true ) );
|
||
|
if ( ! empty( $fallback_json ) ) {
|
||
|
$blurbs = $fallback_json;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $blurbs;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Get the next blurb that can be sent.
|
||
|
*
|
||
|
* @since 3.1
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function get_next() {
|
||
|
$all_data = $this->fetch_blurbs();
|
||
|
$blurbs = array();
|
||
|
$blurbs_sent = get_option( 'email_summary_blurbs_sent', array() );
|
||
|
$next_blurb = false;
|
||
|
|
||
|
if ( empty( $all_data['blurbs'] ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// Loop through the fetched blurbs and filter out all that meet the conditions.
|
||
|
foreach ( $all_data['blurbs'] as $key => $blurb ) {
|
||
|
if ( $this->does_blurb_meet_conditions( $blurb ) ) {
|
||
|
$blurbs[] = $blurb;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Find first blurb that was not yet sent.
|
||
|
foreach ( $blurbs as $blurb ) {
|
||
|
$blurb_hash = $this->get_blurb_hash( $blurb );
|
||
|
if ( is_array( $blurbs_sent ) && ! in_array( $blurb_hash, $blurbs_sent, true ) ) {
|
||
|
$next_blurb = $blurb;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// If all of the available blurbs were already sent out, choose random blurb.
|
||
|
if ( ! $next_blurb && ! empty( $blurbs ) ) {
|
||
|
$next_blurb = $blurbs[ array_rand( $blurbs ) ];
|
||
|
}
|
||
|
|
||
|
return $next_blurb;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Save blurb as sent to the options.
|
||
|
*
|
||
|
* @since 3.1
|
||
|
*
|
||
|
* @param array $blurb Blurb data.
|
||
|
* @return void
|
||
|
*/
|
||
|
public function mark_blurb_sent( $blurb ) {
|
||
|
$blurbs_sent = get_option( 'email_summary_blurbs_sent', array() );
|
||
|
if ( ! empty( $blurb ) ) {
|
||
|
$blurb_hash = $this->get_blurb_hash( $blurb );
|
||
|
if ( ! in_array( $blurb_hash, $blurbs_sent, true ) ) {
|
||
|
$blurbs_sent[] = $blurb_hash;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
update_option( 'email_summary_blurbs_sent', $blurbs_sent );
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Hash blurb array
|
||
|
*
|
||
|
* @since 3.1
|
||
|
*
|
||
|
* @param array $blurb Blurb data.
|
||
|
* @return string MD5 hashed blurb.
|
||
|
*/
|
||
|
public function get_blurb_hash( $blurb ) {
|
||
|
if ( empty( $blurb ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
// We want to sort the array, so that we can get reliable hash everytime even if array properties order changed.
|
||
|
array_multisort( $blurb );
|
||
|
return md5( wp_json_encode( $blurb ) );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if store pass matches the condition from the blurb.
|
||
|
*
|
||
|
* @since 3.1
|
||
|
*
|
||
|
* @param string $condition Pass details.
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function check_blurb_current_pass( $condition ) {
|
||
|
return $this->environment_checker->meetsCondition( $condition );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if store has all requested plugins active.
|
||
|
*
|
||
|
* @since 3.1
|
||
|
*
|
||
|
* @param array $active_plugins An array of plugins that all need to be active.
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function check_blurb_active_plugins( $active_plugins ) {
|
||
|
foreach ( $active_plugins as $plugin_name ) {
|
||
|
if ( ! is_plugin_active( $plugin_name ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if store has certain plugins inactive.
|
||
|
*
|
||
|
* @since 3.1
|
||
|
*
|
||
|
* @param array $inactive_plugins An array of plugins that needs to be inactive.
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function check_blurb_inactive_plugins( $inactive_plugins ) {
|
||
|
foreach ( $inactive_plugins as $plugin_name ) {
|
||
|
if ( is_plugin_active( $plugin_name ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if store has specific products/downloads active.
|
||
|
*
|
||
|
* @since 3.1
|
||
|
*
|
||
|
* @param array $conditions An array of predefined conditions.
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function check_blurb_has_downloads( $conditions ) {
|
||
|
foreach ( $conditions as $condition_name ) {
|
||
|
// Check if store has any products that are free.
|
||
|
if ( 'free' === $condition_name ) {
|
||
|
$args = array(
|
||
|
'post_type' => 'download',
|
||
|
'posts_per_page' => 1,
|
||
|
'fields' => 'ids',
|
||
|
'no_found_rows' => true,
|
||
|
'meta_query' => array(
|
||
|
array(
|
||
|
'key' => 'edd_price',
|
||
|
'value' => '0.00',
|
||
|
),
|
||
|
),
|
||
|
);
|
||
|
|
||
|
$downloads = new WP_Query( $args );
|
||
|
if ( 0 === $downloads->post_count ) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if blurb meets conditions.
|
||
|
*
|
||
|
* @since 3.1
|
||
|
*
|
||
|
* @param array $blurb Blurb data.
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function does_blurb_meet_conditions( $blurb ) {
|
||
|
if ( isset( $blurb['conditions'] ) && ! empty( $blurb['conditions'] ) ) {
|
||
|
foreach ( $blurb['conditions'] as $condition_name => $condition ) {
|
||
|
if ( empty( $condition ) ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// Pass check.
|
||
|
if ( 'current_pass' === $condition_name ) {
|
||
|
if ( ! $this->check_blurb_current_pass( $condition ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Active plugins check.
|
||
|
if ( 'active_plugins' === $condition_name ) {
|
||
|
if ( ! $this->check_blurb_active_plugins( $condition ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Inactive plugins check.
|
||
|
if ( 'inactive_plugins' === $condition_name ) {
|
||
|
if ( ! $this->check_blurb_inactive_plugins( $condition ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Check for specific product/downloads.
|
||
|
if ( 'has_downloads' === $condition_name ) {
|
||
|
if ( ! $this->check_blurb_has_downloads( $condition ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
}
|