$cdn_urls = $this->options->get( 'cdn_cnames', [] ); if ( ! $cdn_urls ) { return $hosts; } // Separate image hosts from the other ones. $image_hosts = []; $other_hosts = []; $cdn_zones = $this->options->get( 'cdn_zone', [] ); foreach ( $cdn_urls as $k => $urls ) { if ( ! in_array( $cdn_zones[ $k ], $zones, true ) ) { continue; } $urls = explode( ',', $urls ); $urls = array_map( 'trim', $urls ); if ( 'images' === $cdn_zones[ $k ] ) { foreach ( $urls as $url ) { $image_hosts[] = $url; } } else { foreach ( $urls as $url ) { $other_hosts[] = $url; } } } // Make sure the image hosts are not also used for other things (duplicate). $image_hosts = array_diff( $image_hosts, $other_hosts ); // Then remove the remaining from the final list. return array_diff( $hosts, $image_hosts ); } /** * Maybe remove the images option from the CDN dropdown. * * @since 3.4 * @access public * @author Grégory Viguier * * @param bool $allow true to add the option, false otherwise. * @return bool */ public function maybe_remove_images_from_cdn_dropdown( $allow ) { if ( ! $allow ) { return $allow; } if ( ! ewww_image_optimizer_get_option( 'ewww_image_optimizer_exactdn' ) ) { return $allow; } // EWWW uses ExactDN: WPR CDN should be disabled for images. return false; } /** ----------------------------------------------------------------------------------------- */ /** PUBLIC TOOLS ============================================================================ */ /** ----------------------------------------------------------------------------------------- */ /** * Get the plugin name. * * @since 3.4 * @access public * @author Grégory Viguier * * @return string */ public function get_name() { return 'EWWW'; } /** * Get the plugin identifier. * * @since 3.4 * @access public * @author Grégory Viguier * * @return string */ public function get_id() { return 'ewww'; } /** * Tell if the plugin converts images to webp. * * @since 3.4 * @access public * @author Grégory Viguier * * @return bool */ public function is_converting_to_webp() { if ( ! function_exists( 'ewww_image_optimizer_get_option' ) ) { // No EWWW, no webp. return false; } return (bool) ewww_image_optimizer_get_option( 'ewww_image_optimizer_webp' ); } /** * Tell if the plugin serves webp images on frontend. * * @since 3.4 * @access public * @author Grégory Viguier * * @return bool */ public function is_serving_webp() { if ( ! function_exists( 'ewww_image_optimizer_get_option' ) ) { // No EWWW, no webp. return false; } if ( ewww_image_optimizer_get_option( 'ewww_image_optimizer_exactdn' ) ) { // EWWW uses ExactDN (WPR CDN should be disabled for images). return true; } if ( ewww_image_optimizer_get_option( 'ewww_image_optimizer_webp_for_cdn' ) ) { // EWWW uses JS to rewrite file extensions. return true; } // Decide if rewrite rules are used. if ( ! function_exists( 'ewww_image_optimizer_webp_rewrite_verify' ) ) { // Uh? return false; } if ( ! function_exists( 'get_home_path' ) ) { require_once ABSPATH . 'wp-admin/includes/file.php'; } if ( ! function_exists( 'extract_from_markers' ) ) { require_once ABSPATH . 'wp-admin/includes/misc.php'; } /** * This function returns null if rules are present and valid. Otherwise it returns rules to be inserted. * Note: this also returns null if WP Fastest Cache rules for webp are found in the file. * * @see ewww_image_optimizer_wpfc_webp_enabled() */ $use_rewrite_rules = ! ewww_image_optimizer_webp_rewrite_verify(); /** * Filter wether EWW is using rewrite rules for webp. * * @since 3.4 * @author Grégory Viguier * * @param bool $use_rewrite_rules True when EWWW uses rewrite rules. False otherwise. */ return (bool) apply_filters( 'rocket_webp_ewww_use_rewrite_rules', $use_rewrite_rules ); } /** * Tell if the plugin uses a CDN-compatible technique to serve webp images on frontend. * * @since 3.4 * @access public * @author Grégory Viguier * * @return bool */ public function is_serving_webp_compatible_with_cdn() { if ( ! function_exists( 'ewww_image_optimizer_get_option' ) ) { // No EWWW, no webp. return false; } if ( ewww_image_optimizer_get_option( 'ewww_image_optimizer_exactdn' ) ) { // EWWW uses ExactDN. return true; } if ( ewww_image_optimizer_get_option( 'ewww_image_optimizer_webp_for_cdn' ) ) { // EWWW uses JS to rewrite file extensions. return true; } // At this point, the plugin is using rewrite rules or nothing. return false; } /** * Get the plugin basename. * * @since 3.4 * @access public * @author Grégory Viguier * * @return bool */ public function get_basename() { if ( empty( $this->plugin_basename ) ) { $this->plugin_basename = rocket_has_constant( 'EWWW_IMAGE_OPTIMIZER_PLUGIN_FILE' ) ? plugin_basename( rocket_get_constant( 'EWWW_IMAGE_OPTIMIZER_PLUGIN_FILE' ) ) : 'ewww-image-optimizer/ewww-image-optimizer.php'; } return $this->plugin_basename; } /** ----------------------------------------------------------------------------------------- */ /** PRIVATE TOOLS =========================================================================== */ /** ----------------------------------------------------------------------------------------- */ /** * Tell if EWWW is active for network. * * @since 3.4 * @access private * @author Grégory Viguier * * @return bool */ private function is_active_for_network() { static $is; if ( isset( $is ) ) { return $is; } if ( ! is_multisite() ) { $is = false; return $is; } if ( ! function_exists( 'is_plugin_active_for_network' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $is = is_plugin_active_for_network( $this->get_basename() ) && ! get_site_option( 'ewww_image_optimizer_allow_multisite_override' ); return $is; } }