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; } }