|
10 | 10 | use \WP_REST_Request as WP_REST_Request; |
11 | 11 | use \WP_Post as WP_Post; |
12 | 12 | use \WP_Error as WP_Error; |
| 13 | +use function ImageOptimizerPro\Utils\get_license_key; |
13 | 14 | use function ImageOptimizerPro\Utils\is_license_active; |
14 | 15 | use function ImageOptimizerPro\Utils\is_local_site; |
| 16 | +use const ImageOptimizerPro\Constants\PURGE_ENDPOINT; |
15 | 17 |
|
16 | 18 | /** |
17 | 19 | * Class Optimizer |
@@ -119,6 +121,9 @@ private function setup() { |
119 | 121 | // set preferred image format |
120 | 122 | self::$preferred_image_formats = $settings['preferred_format']; |
121 | 123 |
|
| 124 | + // purge cache |
| 125 | + add_action( 'admin_post_image_optimizer_pro_cache_purge', [ $this, 'handle_cache_purge' ] ); |
| 126 | + |
122 | 127 | // skip photonized urls when image optimizer active |
123 | 128 | add_filter( 'jetpack_photon_skip_for_url', '__return_true' ); |
124 | 129 | add_filter( 'wp_resource_hints', [ $this, 'add_dns_prefetch' ], 10, 2 ); |
@@ -1707,4 +1712,68 @@ private static function end_buffering( $contents, $phase ) { |
1707 | 1712 | return $contents; |
1708 | 1713 | } |
1709 | 1714 |
|
| 1715 | + /** |
| 1716 | + * Handle cache purge |
| 1717 | + * |
| 1718 | + * @return void |
| 1719 | + */ |
| 1720 | + public function handle_cache_purge() { |
| 1721 | + if ( ! current_user_can( 'manage_options' ) ) { |
| 1722 | + wp_die( esc_html__( 'You do not have sufficient permissions to perform this action.', 'image-optimizer-pro' ) ); |
| 1723 | + } |
| 1724 | + |
| 1725 | + if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET['_wpnonce'] ) ), 'image_optimizer_pro_cache_purge' ) ) { |
| 1726 | + wp_die( esc_html__( 'Nonce verification failed.', 'image-optimizer-pro' ) ); |
| 1727 | + } |
| 1728 | + |
| 1729 | + $response = $this->purge_image_optimizer_cache(); |
| 1730 | + |
| 1731 | + if ( ! is_wp_error( $response ) && ! empty( $response['success'] ) ) { |
| 1732 | + $redirect_url = add_query_arg( 'iop_action', 'purge_image_optimizer_cache', wp_get_referer() ); |
| 1733 | + } else { |
| 1734 | + $redirect_url = add_query_arg( 'iop_action', 'purge_image_optimizer_cache_failed', wp_get_referer() ); |
| 1735 | + } |
| 1736 | + |
| 1737 | + wp_safe_redirect( esc_url_raw( $redirect_url ) ); |
| 1738 | + exit; |
| 1739 | + } |
| 1740 | + |
| 1741 | + /** |
| 1742 | + * Purge Image Optimizer cache |
| 1743 | + * |
| 1744 | + * @return mixed|\WP_Error|null |
| 1745 | + */ |
| 1746 | + public function purge_image_optimizer_cache() { |
| 1747 | + if ( is_multisite() ) { |
| 1748 | + return new \WP_Error( 'multisite_not_supported', esc_html__( 'Multisite is not supported for Image Optimizer Purge.', 'image-optimizer-pro' ) ); |
| 1749 | + } |
| 1750 | + |
| 1751 | + $body = wp_json_encode( |
| 1752 | + [ |
| 1753 | + 'license_key' => get_license_key(), |
| 1754 | + 'license_url' => home_url(), |
| 1755 | + ] |
| 1756 | + ); |
| 1757 | + |
| 1758 | + $response = wp_remote_post( |
| 1759 | + PURGE_ENDPOINT, |
| 1760 | + [ |
| 1761 | + 'headers' => [ |
| 1762 | + 'Content-Type' => 'application/json', |
| 1763 | + ], |
| 1764 | + 'body' => $body, |
| 1765 | + ] |
| 1766 | + ); |
| 1767 | + |
| 1768 | + if ( is_wp_error( $response ) ) { |
| 1769 | + $error_message = $response->get_error_message(); |
| 1770 | + |
| 1771 | + return new \WP_Error( 'request_failed', esc_html__( 'Request failed: ', 'image-optimizer-pro' ) . $error_message ); |
| 1772 | + } |
| 1773 | + |
| 1774 | + $response_body = wp_remote_retrieve_body( $response ); |
| 1775 | + |
| 1776 | + return json_decode( $response_body, true ); |
| 1777 | + } |
| 1778 | + |
1710 | 1779 | } |
0 commit comments