diff --git a/class/class-mainwp-child-posts.php b/class/class-mainwp-child-posts.php index 93c58f60..3ac69878 100644 --- a/class/class-mainwp-child-posts.php +++ b/class/class-mainwp-child-posts.php @@ -630,7 +630,7 @@ private function get_post_edit( $id ) { //phpcs:ignore -- NOSONAR - complex. 'post_password' => $post->post_password, ); - if ( empty( $post_featured_image ) ) { // Featured image is set, retrieve URL. + if ( ! empty( $post_featured_image ) ) { // Featured image is set, retrieve URL. $img = wp_get_attachment_image_src( $post_featured_image, 'full' ); $post_featured_image = $img[0]; } @@ -693,7 +693,7 @@ private function get_page_edit( $id ) { //phpcs:ignore -- NOSONAR - complex. 'post_password' => $post->post_password, ); - if ( empty( $post_featured_image ) ) { + if ( ! empty( $post_featured_image ) ) { $img = wp_get_attachment_image_src( $post_featured_image, 'full' ); $post_featured_image = $img[0]; } diff --git a/class/class-mainwp-child-server-information-base.php b/class/class-mainwp-child-server-information-base.php index 042d8dfd..1d1550dc 100644 --- a/class/class-mainwp-child-server-information-base.php +++ b/class/class-mainwp-child-server-information-base.php @@ -29,44 +29,6 @@ public static function get_class_name() { return __CLASS__; } - /** - * Initiate check on important System Variables and compare them to required defaults. - * - * @uses \MainWP\Child\MainWP_Child_Server_Information_Base::check() - * @uses \MainWP\Child\MainWP_Child_Server_Information_Base::check_mainwp_directory() - * - * @return int $i Number of detected issues. - */ - protected static function get_warnings() { - $i = 0; - if ( ! static::check( '>=', '3.4', 'get_wordpress_version' ) ) { - ++$i; - } - if ( ! static::check( '>=', '5.2.4', 'get_php_version' ) ) { - ++$i; - } - if ( ! static::check( '>=', '5.0', 'get_my_sql_version' ) ) { - ++$i; - } - if ( ! static::check( '>=', '30', 'get_max_execution_time', '=', '0' ) ) { - ++$i; - } - if ( ! static::check( '>=', '2M', 'get_upload_max_filesize', null, null, true ) ) { - ++$i; - } - if ( ! static::check( '>=', '2M', 'get_post_max_size', null, null, true ) ) { - ++$i; - } - if ( ! static::check( '>=', '10000', 'get_output_buffer_size' ) ) { - ++$i; - } - if ( ! static::check_mainwp_directory() ) { - ++$i; - } - - return $i; - } - /** * Check if MainWP Directory is writeable. * diff --git a/class/class-mainwp-child-server-information.php b/class/class-mainwp-child-server-information.php index b80a0243..64135d43 100644 --- a/class/class-mainwp-child-server-information.php +++ b/class/class-mainwp-child-server-information.php @@ -31,169 +31,6 @@ public static function get_class_name() { return __CLASS__; } - /** - * Add hooks after WordPress has finished loading but before any headers are sent. - * - * @uses MainWP_Child_Server_Information::dismiss_warnings() Dismiss warnings. - */ - public static function init() { - add_action( - 'wp_ajax_mainwp-child_dismiss_warnings', - array( - static::get_class_name(), - 'dismiss_warnings', - ) - ); - } - - /** - * Dismiss warnings. - * - * @uses \MainWP\Child\MainWP_Helper::update_option() Update option by option name. - * @uses \MainWP\Child\MainWP_Child_Server_Information_Base::get_warnings() Initiate check on important System Variables and compare them to required defaults. - * @uses get_option() Retrieves an option value based on an option name. - * @see https://developer.wordpress.org/reference/functions/get_option/ - * - * @used-by MainWP_Child_Server_Information::init() Add hooks after WordPress has finished loading but before any headers are sent. - */ - public static function dismiss_warnings() { - // phpcs:disable WordPress.Security.NonceVerification - if ( isset( $_POST['what'] ) ) { - $dismissWarnings = get_option( 'mainwp_child_dismiss_warnings' ); - if ( ! is_array( $dismissWarnings ) ) { - $dismissWarnings = array(); - } - if ( 'warning' === $_POST['what'] ) { - if ( isset( $_POST['warnings'] ) ) { - $warnings = intval( $_POST['warnings'] ); - } else { - $warnings = static::get_warnings(); - } - $dismissWarnings['warnings'] = $warnings; - } - MainWP_Helper::update_option( 'mainwp_child_dismiss_warnings', $dismissWarnings ); - } - // phpcs:enable - } - - /** - * Render warnings. - * - * @uses \MainWP\Child\MainWP_Helper::update_option() Update option by option name. - * @uses \MainWP\Child\MainWP_Child_Server_Information_Base::get_warnings() Initiate check on important System Variables and compare them to required defaults. - * @uses get_option() Retrieves an option value based on an option name. - * @see https://developer.wordpress.org/reference/functions/get_option/ - * - * @used-by MainWP_Child_Server_Information::init() Add hooks after WordPress has finished loading but before any headers are sent. - */ - public static function render_warnings() { - $request_uri = isset( $_SERVER['REQUEST_URI'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : ''; - if ( isset( $_SERVER['REQUEST_URI'] ) && ( stristr( $request_uri, 'mainwp_child_tab' ) || stristr( $request_uri, 'mainwp-reports-page' ) || stristr( $request_uri, 'mainwp-reports-settings' ) ) ) { - return; - } - - // improved query. - if ( static::is_mainwp_pages() ) { - return; - } - - $warnings = static::get_warnings(); - - $dismissWarnings = get_option( 'mainwp_child_dismiss_warnings' ); - if ( ! is_array( $dismissWarnings ) ) { - $dismissWarnings = array(); - } - - if ( isset( $dismissWarnings['warnings'] ) && $dismissWarnings['warnings'] >= $warnings ) { - $warnings = 0; - } - - if ( 0 === $warnings ) { - return; - } - - if ( $warnings > 0 ) { - $dismissWarnings['warnings'] = 0; - } - - MainWP_Helper::update_option( 'mainwp_child_dismiss_warnings', $dismissWarnings ); - ?> - - - -
- - - 0 ) { - $warning .= ''; - } - echo $warning; // phpcs:ignore WordPress.Security.EscapeOutput - ?> - -
This site may not connect to your dashboard or may have other issues. Check your MainWP server information page.Dismiss
-
- check_other_auth(); MainWP_Clone::instance()->init(); - MainWP_Child_Server_Information::init(); MainWP_Client_Report::instance()->init(); MainWP_Child_Plugins_Check::instance(); MainWP_Child_Themes_Check::instance(); diff --git a/class/class-mainwp-clone-page.php b/class/class-mainwp-clone-page.php index 81c12ee6..c6db1a30 100644 --- a/class/class-mainwp-clone-page.php +++ b/class/class-mainwp-clone-page.php @@ -575,6 +575,11 @@ public static function render_java_script() { var pollingDownloading = undefined; var backupDownloadFinished = false; + var pollingBackupInfo = { + 'poll_check': 0, + 'size_check': 0, + }; + handleCloneError = function ( resp ) { updateClonePopup( resp.error, true, 'red' ); }; @@ -627,48 +632,49 @@ public static function render_java_script() { jQuery.post( ajaxurl, data, function ( pSiteId, pSiteName ) { return function ( resp ) { - backupCreationFinished = true; - clearTimeout( pollingCreation ); - - var progressBar = jQuery( '#mainwp-child-clone-create-progress' ); - progressBar.progressbar( 'value', parseFloat( progressBar.progressbar( 'option', 'max' ) ) ); - - if ( resp.error ) { - handleCloneError( resp ); - return; - } - updateClonePopup( mwp_sprintf( translations['backup_created'], pSiteName, (resp.size / 1024).toFixed( 2 ) ) ); - cloneInitiateBackupDownload( pSiteId, resp.url, resp.size ); + cloneBackupFinishied(resp, pSiteId, pSiteName ); } }( siteId, siteName ), 'json' ); - pollingCreation = setTimeout( function () { - cloneBackupCreationPolling( siteId, rand ); - }, 1000 ); + pollingCreation = setTimeout( function (psiteName) { + cloneBackupCreationPolling( siteId, rand, psiteName ); + }(siteName), 1000 ); }; - cloneBackupCreationPolling = function ( siteId, rand ) { + cloneBackupCreationPolling = function ( siteId, rand, psiteName ) { if ( backupCreationFinished ) return; var data = mainwpchild_secure_data({ action: 'mainwp-child_clone_backupcreatepoll', siteId: siteId, - rand: rand + rand: rand, + backupInfo: pollingBackupInfo }); - jQuery.post( ajaxurl, data, function ( pSiteId, pRand ) { - return function ( resp ) { + jQuery.post( ajaxurl, data, function ( pSiteId, pRand, psiteName ) { + return function ( resp, psiteName ) { + if(resp.backupFinishedResult){ + cloneBackupFinishied(resp.backupFinishedResult, pSiteId, psiteName ); + } if ( backupCreationFinished ) return; if ( resp.size ) { var progressBar = jQuery( '#mainwp-child-clone-create-progress' ); if ( progressBar.progressbar( 'option', 'value' ) < progressBar.progressbar( 'option', 'max' ) ) { progressBar.progressbar( 'value', resp.size ); } + if ( resp.size_byte ) { + if(resp.size_byte === pollingBackupInfo.size_check ){ + pollingBackupInfo.poll_check++; + } else { + pollingBackupInfo.poll_check = 0; + } + pollingBackupInfo.size_check = resp.size_byte; + } } pollingCreation = setTimeout( function () { cloneBackupCreationPolling( pSiteId, pRand ); }, 1000 ); } - }( siteId, rand ), 'json' ); + }( siteId, rand, psiteName ), 'json' ); }; cloneInitiateBackupDownload = function ( pSiteId, pFile, pSize ) { @@ -716,7 +722,7 @@ public static function render_java_script() { file: pFile }); - jQuery.post( ajaxurl, data, function ( pSiteId ) { + jQuery.post( ajaxurl, data, function ( pSiteId, pFile ) { return function ( resp ) { if ( backupDownloadFinished ) return; if ( resp.size ) { @@ -727,10 +733,25 @@ public static function render_java_script() { } pollingDownloading = setTimeout( function () { - cloneBackupDownloadPolling( pSiteId ); + cloneBackupDownloadPolling( pSiteId, pFile ); }, 1000 ); } - }( siteId ), 'json' ); + }( siteId, pFile ), 'json' ); + }; + + cloneBackupFinishied = function ( resp, pSiteId, pSiteName ) { + backupCreationFinished = true; + clearTimeout( pollingCreation ); + + var progressBar = jQuery( '#mainwp-child-clone-create-progress' ); + progressBar.progressbar( 'value', parseFloat( progressBar.progressbar( 'option', 'max' ) ) ); + + if ( resp.error ) { + handleCloneError( resp ); + return; + } + updateClonePopup( mwp_sprintf( translations['backup_created'], pSiteName, (resp.size / 1024).toFixed( 2 ) ) ); + cloneInitiateBackupDownload( pSiteId, resp.url, resp.size ); }; cloneInitiateExtractBackup = function ( file ) { diff --git a/class/class-mainwp-clone.php b/class/class-mainwp-clone.php index 47e292c5..9387e2fb 100644 --- a/class/class-mainwp-clone.php +++ b/class/class-mainwp-clone.php @@ -148,7 +148,7 @@ public function secure_request( $action = '', $query_arg = 'security' ) { $ajaxPosts[ $action ] = isset( $_POST['dts'] ) ? sanitize_text_field( wp_unslash( $_POST['dts'] ) ) : ''; MainWP_Helper::update_option( 'mainwp_ajaxposts', $ajaxPosts ); } - // phpcs:enable + // phpcs:enable WordPress.Security.NonceVerification } /** @@ -217,7 +217,7 @@ public static function upload_mimes( $mime_types = array() ) { * @uses \MainWP\Child\MainWP_Helper::write() */ public function request_clone_funct() { // phpcs:ignore -- Current complexity is the only way to achieve desired results, pull request solutions appreciated. - // phpcs:disable WordPress.Security.NonceVerification + // phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized if ( ! isset( $_REQUEST['key'] ) ) { return; } @@ -257,23 +257,61 @@ public function request_clone_funct() { // phpcs:ignore -- Current complexity is $f = isset( $_POST['f'] ) ? sanitize_text_field( wp_unslash( $_POST['f'] ) ) : ''; $archiveFile = false; if ( ! empty( $f ) ) { - $result = glob( $backupdir . 'backup-' . $f . '-*' ); // NOSONAR . + $result = glob( $backupdir . 'backup-' . $f . '-*' ); // NOSONAR . + $found_files = array(); // to bad fix multi full backup files created with same rand value. foreach ( $result as $file ) { if ( self::is_archive( $file, 'backup-' . $f . '-' ) ) { - $archiveFile = $file; - break; + $found_files[] = $file; + } + } + if ( $found_files ) { + $the_size = 0; + $the_file = false; + foreach ( $found_files as $_file ) { + $file_size = filesize( $_file ); + if ( $file_size > $the_size ) { + $the_size = $file_size; + $the_file = $_file; + } } + $archiveFile = $the_file; } } if ( false === $archiveFile ) { return; } - MainWP_Helper::write( array( 'size' => filesize( $archiveFile ) ) ); + $fsize = filesize( $archiveFile ); + + $check_info = ! empty( $_POST['cloneCheckInfo'] ) ? json_decode( wp_unslash( $_POST['cloneCheckInfo'] ), true ) : array(); + + if ( ! is_array( $check_info ) ) { + $check_info = array(); + } + + $poll_check = isset( $check_info['poll_check'] ) ? intval( $check_info['poll_check'] ) : 0; + $size_check = isset( $check_info['size_check'] ) ? intval( $check_info['size_check'] ) : 0; + + if ( $poll_check > 5 && $size_check === $fsize ) { + // smart check backup done. + $backup_result = get_transient( 'clone-full-backup-' . wp_unslash( $_POST['f'] ) ); + if ( ! empty( $backup_result ) && is_array( $backup_result ) ) { + MainWP_Helper::write( + array( + 'size' => $fsize, + 'backupFinishedResult' => array( + 'url' => $backup_result['backup'], + 'size' => round( $backup_result['size'] / 1024, 0 ), + ), + ) + ); + } + } + MainWP_Helper::write( array( 'size' => $fsize ) ); } elseif ( 'createCloneBackup' === $cloneFunc ) { $this->create_clone_backup(); } - // phpcs:enable + // phpcs:enable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized return true; } @@ -302,7 +340,7 @@ private function create_clone_backup() { // phpcs:ignore -- Current complexity i if ( MainWP_Helper::is_dir_empty( ABSPATH . 'clone' ) ) { MainWP_Helper::rmdir( ABSPATH . 'clone' ); } - // phpcs:disable WordPress.Security.NonceVerification + //phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized $wpversion = isset( $_POST['wpversion'] ) ? sanitize_text_field( wp_unslash( $_POST['wpversion'] ) ) : ''; global $wp_version; $includeCoreFiles = ( $wpversion !== $wp_version ); @@ -332,7 +370,7 @@ private function create_clone_backup() { // phpcs:ignore -- Current complexity i } elseif ( isset( $_POST['file'] ) ) { $file = ! empty( $_POST['file'] ) ? sanitize_text_field( wp_unslash( $_POST['file'] ) ) : false; } - // phpcs:enable + $res = MainWP_Backup::get()->create_full_backup( $newExcludes, $file, true, $includeCoreFiles, 0, false, false, false, false, $method ); if ( ! $res ) { $information['backup'] = false; @@ -370,7 +408,10 @@ private function create_clone_backup() { // phpcs:ignore -- Current complexity i } closedir( $fh ); $information['themes'] = $themes; + update_option( '', $information ); + set_transient( 'clone-full-backup-' . wp_unslash( $_POST['f'] ), $information, HOUR_IN_SECONDS ); // to support to fix issue timeout of create clone backup request. MainWP_Helper::write( $information ); + //phpcs:enable WordPress.Security.NonceVerification,WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized } /** @@ -447,7 +488,7 @@ public function clone_backup_create() { } catch ( \Exception $e ) { $output = array( 'error' => $e->getMessage() ); } - // phpcs:enable + // phpcs:enable WordPress.Security.NonceVerification die( wp_json_encode( $output ) ); } @@ -464,7 +505,7 @@ public function clone_backup_create() { public function clone_backup_create_poll() { try { $this->secure_request( 'mainwp-child_clone_backupcreatepoll' ); - // phpcs:disable WordPress.Security.NonceVerification + // phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized if ( ! isset( $_POST['siteId'] ) ) { throw new \Exception( esc_html__( 'No site given', 'mainwp-child' ) ); } @@ -475,7 +516,6 @@ public function clone_backup_create_poll() { if ( ! is_array( $sitesToClone ) || ! isset( $sitesToClone[ $siteId ] ) ) { throw new \Exception( esc_html__( 'Site not found', 'mainwp-child' ) ); } - // phpcs:enable $siteToClone = $sitesToClone[ $siteId ]; $url = $siteToClone['url']; @@ -487,9 +527,10 @@ public function clone_backup_create_poll() { $result = MainWP_Utility::fetch_url( $url, array( - 'cloneFunc' => 'createCloneBackupPoll', - 'key' => $key, - 'f' => $rand, + 'cloneFunc' => 'createCloneBackupPoll', + 'key' => $key, + 'f' => $rand, + 'cloneCheckInfo' => isset( $_POST['backupInfo'] ) && is_array( $_POST['backupInfo'] ) ? wp_json_encode( wp_unslash( $_POST['backupInfo'] ) ) : '', ) ); @@ -497,7 +538,15 @@ public function clone_backup_create_poll() { throw new \Exception( esc_html__( 'Invalid response', 'mainwp-child' ) ); } - $output = array( 'size' => round( $result['size'] / 1024, 0 ) ); + $output = array( + 'size' => round( $result['size'] / 1024, 0 ), + 'size_byte' => $result['size'], + ); + + if ( isset( $result['backupFinishedResult'] ) ) { + $output['backupFinishedResult'] = $result['backupFinishedResult']; + } + // phpcs:enable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized } catch ( \Exception $e ) { $output = array( 'error' => $e->getMessage() ); } @@ -611,7 +660,7 @@ public function clone_backup_download() { // phpcs:ignore -- Current complexity } catch ( \Exception $e ) { $output = array( 'error' => $e->getMessage() ); } - // phpcs:enable + // phpcs:enable WordPress.Security.NonceVerification die( wp_json_encode( $output ) ); } @@ -674,7 +723,7 @@ public function clone_backup_extract() { } elseif ( isset( $_POST['file'] ) ) { $file = ! empty( $_POST['file'] ) ? sanitize_text_field( wp_unslash( $_POST['file'] ) ) : false; } - // phpcs:enable + // phpcs:enable WordPress.Security.NonceVerification $testFull = false; $file = $this->clone_backup_get_file( $file, $testFull ); $cloneInstall = new MainWP_Clone_Install( $file ); diff --git a/class/class-mainwp-pages.php b/class/class-mainwp-pages.php index b4a5fe74..c4b14c99 100644 --- a/class/class-mainwp-pages.php +++ b/class/class-mainwp-pages.php @@ -96,7 +96,6 @@ public function init() { * * @uses \MainWP\Child\MainWP_Child_Branding::get_branding_options() * @uses \MainWP\Child\MainWP_Child_Branding::is_branding() - * @uses \MainWP\Child\MainWP_Child_Server_Information::render_warnings() */ public function admin_notice() { // Admin Notice... @@ -116,7 +115,6 @@ public function admin_notice() { $msg .= ''; echo wp_kses_post( $msg ); } - MainWP_Child_Server_Information::render_warnings(); } /** diff --git a/class/class-mainwp-utility.php b/class/class-mainwp-utility.php index 030b9b54..becac1b8 100644 --- a/class/class-mainwp-utility.php +++ b/class/class-mainwp-utility.php @@ -327,7 +327,16 @@ public static function upload_image( $img_url, $img_data = array(), $check_file_ if ( is_wp_error( $temporary_file ) ) { throw new MainWP_Exception( 'Error: ' . esc_html( $temporary_file->get_error_message() ) ); } else { - $filename = basename( $img_url ); + $filename = basename( $img_url ); + + $file_ext = strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) ); + if ( empty( $file_ext ) && ! empty( $img_data['image_url'] ) ) { // to fix for gallery issue. + $_filename = basename( $img_data['image_url'] ); + $_file_ext = strtolower( pathinfo( $_filename, PATHINFO_EXTENSION ) ); + $filename .= '.' . $_file_ext; + $img_url = $img_data['image_url']; // to fix issue create attachment media. + } + $local_img_path = $upload_dir['path'] . DIRECTORY_SEPARATOR . $filename; $local_img_url = $upload_dir['url'] . '/' . basename( $local_img_path ); @@ -374,7 +383,7 @@ public function check_image_file_name( $filename ) { return false; } - $allowed_files = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'bmp', 'tif', 'tiff', 'ico', 'avif' ); + $allowed_files = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'bmp', 'tif', 'tiff', 'ico', 'avif', 'webp', 'heic' ); $names = explode( '.', $filename ); $file_ext = strtolower( end( $names ) ); if ( ! in_array( $file_ext, $allowed_files ) ) { diff --git a/mainwp-child.php b/mainwp-child.php index afbfe857..331bae16 100644 --- a/mainwp-child.php +++ b/mainwp-child.php @@ -12,7 +12,7 @@ * Author: MainWP * Author URI: https://mainwp.com * Text Domain: mainwp-child - * Version: 5.1.1 + * Version: 5.2 * Requires at least: 5.4 * Requires PHP: 7.4 */ diff --git a/readme.txt b/readme.txt index c0de4640..52b43322 100644 --- a/readme.txt +++ b/readme.txt @@ -5,9 +5,9 @@ Author: mainwp Author URI: https://mainwp.com Plugin URI: https://mainwp.com Requires at least: 6.2 -Tested up to: 6.5.5 +Tested up to: 6.6.1 Requires PHP: 7.4 -Stable tag: 5.1.1 +Stable tag: 5.2 License: GPLv3 or later License URI: https://www.gnu.org/licenses/gpl-3.0.html @@ -111,31 +111,14 @@ We have an extensive FAQ with more questions and answers [here](https://mainwp.c == Changelog == -= 5.1.1 - 7-9-2024 = += 5.2 - 8-28-2024 = -* Fixed: An issue with applying custom CSS for the White Label extension option -* Fixed: Synchronization problem caused by older PHP version +* Fixed: Issue with inserting multiple galleries in a post. +* Fixed: Problem with cloning sites on specific hosting environments. +* Fixed: Issue causing the post featured image to be removed after editing. +* Updated: System requirements checks to ensure they are current and relevant. +* Removed: Irrelevant system requirements checks for a streamlined setup process. -= 5.1 - 6-18-2024 = - -* Fixed: An issue with submitting Time Capsule settings. -* Added: Integrated a Rollback feature to revert plugins to the last stable version in case of update errors. -* Updated: Addressed coding standard issues found by SonarCloud. - -[See Video Changelog](https://youtu.be/OtqrgU8q5RA) - -= 5.0.1.1 - 4-23-2024 = -* Added: Support for the RunCloud Hub plugin in the Cache Control. - -= 5.0.1 - 4-9-2024 = -* Fixed: Post subcategories sharing the same name but belonging to different main categories are now correctly displayed. -* Fixed: Addressed a scenario where the MainWP Child plugin inadvertently triggered Core updates. -* Fixed: The detection of WP Optimize caching plugin in the Cache Control extension -* Fixed: Last purged time not being refreshed when clearing the Cache Control cache -* Fixed: Resolved a problem with invalid URL encountered when navigating back after submitting a White Label Support Form. -* Added: Introduced support for the AVIF image format in post and page creation processes. -* Added: We’ve expanded support for Cache Control extension to include Pressable Cache Management. - -[See Video Changelog](https://www.youtube.com/watch?v=5idFDPrgFf8) +[See Video Changelog](https://www.youtube.com/watch?v=) [See changelog for all versions.](https://mainwp.com/mainwp-child-changelog.txt)