erializer->deserialize( $serialized_data_store ); $handled = $this->handle_lcp_data( $url, $raw_data, $previous_data_version, $previous_data_hash, $is_mobile, $data_store ); if ( is_wp_error( $handled ) ) { wp_send_json_error( array( 'error_msg' => $handled->get_error_message() ) ); } else { wp_send_json_success(); } } public function handle_lcp_data( $url, $raw_data, $previous_data_version, $previous_data_hash, $is_mobile, $data_store = null ) { $current_data_version = $this->lcp_helper->get_current_lcp_data_version(); $data = $this->lcp_helper->sanitize_data( $raw_data ); $lcp_data = new LCP_Data( $data, $current_data_version ); if ( ! $lcp_data->is_lcp_element_image() ) { return new WP_Error( 'not-an-image', esc_html__( 'LCP element is not an image.', 'wp-smushit' ) ); } if ( empty( $url ) || empty( $raw_data ) || empty( $data_store ) || ! is_a( $data_store, LCP_Data_Store::class ) ) { return new WP_Error( 'error-in-processing', esc_html__( 'Error in processing LCP data, fields empty.', 'wp-smushit' ) ); } $version_changed = $previous_data_version === LCP_Helper::get_no_data_version() || $current_data_version !== $previous_data_version; $hash_changed = $previous_data_hash === LCP_Helper::get_no_data_hash() || $lcp_data->get_hash() !== $previous_data_hash; if ( ! $version_changed && ! $hash_changed ) { return new WP_Error( 'data-already-up-to-date', esc_html__( 'LCP data is already up to date', 'wp-smushit' ) ); } $data_store->save( $url, $is_mobile, $lcp_data ); $this->do_lcp_data_updated_action( $lcp_data, $data_store, $url ); $this->clear_cache( $data_store, $url ); return true; } /** * @param $page_markup string * @param $parsed_page Page * * @return mixed */ public function preload_lcp_images( $page_markup, $parsed_page ) { if ( ! preg_match( '##', $page_markup, $matches ) ) { return $page_markup; } $lcp_data = $this->lcp_helper->get_lcp_data_for_current_page(); if ( ! $lcp_data ) { return $page_markup; } $tag = ( new LCP_Preload_Tag( $parsed_page, $lcp_data ) )->make_preload_tag(); if ( empty( $tag ) ) { return $page_markup; } $title = $matches[0]; $replace = preg_replace( '#' . $title . '#', '' . $tag, $page_markup, 1 ); if ( null === $replace ) { return $page_markup; } return $replace; } public function clear_post_lcp_data( $post_id ) { $data_store = new LCP_Data_Store_Post_Meta(); $data_store->set_post_id( $post_id ); $data_store->delete_all(); $data_store_home = new LCP_Data_Store_Home(); $data_store_home->delete_all(); } public function mark_all_lcp_data_as_dirty() { $this->lcp_helper->increment_lcp_data_version(); } public function ajax_mark_all_lcp_data_as_dirty() { if ( ! check_ajax_referer( 'wp-smush-ajax', '_ajax_nonce', false ) ) { wp_send_json_error( array( 'error_msg' => esc_html__( 'Nonce verification failed.', 'wp-smushit' ), ) ); } $this->mark_all_lcp_data_as_dirty(); } /** * Remove fetchpriority attribute from if Smart LCP fetchpriority is enabled * * @param array $attributes * * @return array */ public function remove_fetchpriority_attribute( $attributes ) { $preload_settings = $this->settings->get_setting( 'wp-smush-preload' ); if ( empty( $preload_settings['lcp_fetchpriority'] ) ) { return $attributes; } // Exit early if attribute not set or not "high". if ( empty( $attributes['fetchpriority'] ) || $attributes['fetchpriority'] !== 'high' ) { return $attributes; } // Only remove if we have LCP data for this page. if ( $this->lcp_helper->get_lcp_data_for_current_page() ) { unset( $attributes['fetchpriority'] ); } return $attributes; } /** * @param LCP_Data $lcp_data * @param LCP_Data_Store $data_store * @param $url * * @return void */ private function do_lcp_data_updated_action( $lcp_data, $data_store, $url ) { do_action( 'wp_smush_lcp_data_updated', $lcp_data, $data_store, $url ); } private function clear_cache( $data_store, $url ) { switch ( $data_store->get_type() ) { case LCP_Data_Store_Post_Meta::get_type_key(): $this->cache_helper->clear_post_cache( $data_store->get_object_id() ); break; case LCP_Data_Store_Home::get_type_key(): $this->cache_helper->clear_home_cache( $url ); break; } } }