laipower/wp-content/plugins/easy-digital-downloads/includes/emails/email-summary/class-edd-email-summary-blurb.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;
}
}