diff --git a/inc/compatibilities/otter_blocks.php b/inc/compatibilities/otter_blocks.php index 81dfecdb..b24e95d5 100644 --- a/inc/compatibilities/otter_blocks.php +++ b/inc/compatibilities/otter_blocks.php @@ -7,7 +7,6 @@ */ class Optml_otter_blocks extends Optml_compatibility { - /** * Should we load the integration logic. * @@ -39,5 +38,43 @@ function ( $all_watchers ) { // Replace the image URL with the optimized one in Otter-generated CSS. add_filter( 'otter_apply_dynamic_image', [ Optml_Main::instance()->manager->url_replacer, 'build_url' ], 99 ); + + // Ensure replacer is initialized for Otter REST API routes (where register_hooks isn't called). + add_filter( 'rest_pre_dispatch', [ $this, 'maybe_init_replacer_for_rest' ], 10, 3 ); + } + + /** + * Initialize replacer for Otter REST API routes. + * + * @param mixed $result Response to replace the requested version with. + * @param \WP_REST_Server $server Server instance. + * @param \WP_REST_Request $request Request used to generate the response. + * @return mixed Unmodified result. + */ + public function maybe_init_replacer_for_rest( $result, \WP_REST_Server $server, \WP_REST_Request $request ) { + $route = $request->get_route(); + + // Only initialize for Otter styles REST routes. + if ( strpos( $route, '/otter/v1/post_styles' ) === false + && strpos( $route, '/otter/v1/widget_styles' ) === false + && strpos( $route, '/otter/v1/block_styles' ) === false + ) { + return $result; + } + + if ( ! did_action( 'optml_replacer_setup' ) ) { + do_action( 'optml_replacer_setup' ); + } + + return $result; + } + + /** + * Should we early load the compatibility? + * + * @return bool Whether to load the compatibility early. + */ + public function should_load_early() { + return true; } } diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index a002da25..e60e4248 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -1020,6 +1020,12 @@ parameters: count: 1 path: inc/compatibilities/metaslider.php + - + message: '#^Method Optml_otter_blocks\:\:maybe_init_replacer_for_rest\(\) has parameter \$request with generic class WP_REST_Request but does not specify its types\: T$#' + identifier: missingType.generics + count: 1 + path: inc/compatibilities/otter_blocks.php + - message: '#^Method Optml_otter_blocks\:\:register\(\) has no return type specified\.$#' identifier: missingType.return