diff --git a/class.jetpack-gutenberg.php b/class.jetpack-gutenberg.php index 93e6da63779b5..4c18957b354da 100644 --- a/class.jetpack-gutenberg.php +++ b/class.jetpack-gutenberg.php @@ -27,6 +27,11 @@ function jetpack_register_block( $slug, $args = array() ) { $slug = 'jetpack/' . $slug; } + if ( isset( $args['version_requirements'] ) + && ! Jetpack_Gutenberg::is_gutenberg_version_available( $args['version_requirements'], $slug ) ) { + return false; + } + // Checking whether block is registered to ensure it isn't registered twice. if ( Jetpack_Gutenberg::is_registered( $slug ) ) { return false; @@ -89,6 +94,59 @@ class Jetpack_Gutenberg { */ private static $availability = array(); + /** + * Check to see if a minimum version of Gutenberg is available. Because a Gutenberg version is not available in + * php if the Gutenberg plugin is not installed, if we know which minimum WP release has the required version we can + * optionally fall back to that. + * + * @param array $version_requirements An array containing the required Gutenberg version and, if known, the WordPress version that was released with this minimum version. + * @param string $slug The slug of the block or plugin that has the gutenberg version requirement. + * + * @since 8.3.0 + * + * @return boolean True if the version of gutenberg required by the block or plugin is available. + */ + public static function is_gutenberg_version_available( $version_requirements, $slug ) { + global $wp_version; + + // Bail if we don't at least have the gutenberg version requirement, the WP version is optional. + if ( empty( $version_requirements['gutenberg'] ) ) { + return false; + } + + // If running a local dev build of gutenberg plugin GUTENBERG_DEVELOPMENT_MODE is set so assume correct version. + if ( defined( 'GUTENBERG_DEVELOPMENT_MODE' ) && GUTENBERG_DEVELOPMENT_MODE ) { + return true; + } + + $version_available = false; + + // If running a production build of the gutenberg plugin then GUTENBERG_VERSION is set, otherwise if WP version + // with required version of Gutenberg is known check that. + if ( defined( 'GUTENBERG_VERSION' ) ) { + $version_available = version_compare( GUTENBERG_VERSION, $version_requirements['gutenberg'], '>=' ); + } elseif ( ! empty( $version_requirements['wp'] ) ) { + $version_available = version_compare( $wp_version, $version_requirements['wp'], '>=' ); + } + + if ( ! $version_available ) { + self::set_extension_unavailable( + $slug, + 'incorrect_gutenberg_version', + array( + 'required_feature' => $slug, + 'required_version' => $version_requirements, + 'current_version' => array( + 'wp' => $wp_version, + 'gutenberg' => defined( 'GUTENBERG_VERSION' ) ? GUTENBERG_VERSION : null, + ), + ) + ); + } + + return $version_available; + } + /** * Prepend the 'jetpack/' prefix to a block name * diff --git a/tests/php/general/test-class.jetpack-gutenberg.php b/tests/php/general/test-class.jetpack-gutenberg.php index 78b154641da2a..cf372208303b7 100644 --- a/tests/php/general/test-class.jetpack-gutenberg.php +++ b/tests/php/general/test-class.jetpack-gutenberg.php @@ -149,4 +149,26 @@ function test_get_available_extensions() { $this->assertNotEmpty( $extensions ); $this->assertNotContains( 'onion', $extensions ); } + + function test_returns_false_if_core_wp_version_less_than_minimum() { + $version_gated = Jetpack_Gutenberg::is_gutenberg_version_available( + array( + 'wp' => '999999', + 'gutenberg' => '999999', + ), + 'gated_block' + ); + $this->assertEquals( false, $version_gated ); + } + + function test_returns_true_if_core_wp_version_greater_or_equal_to_minimum() { + $version_gated = Jetpack_Gutenberg::is_gutenberg_version_available( + array( + 'wp' => '1', + 'gutenberg' => '999999', + ), + 'ungated_block' + ); + $this->assertEquals( true, $version_gated ); + } }