Skip to content

Commit

Permalink
Block version gating (#14703)
Browse files Browse the repository at this point in the history
* Add a check to see if required version of gutenberg is available before registering a block
  • Loading branch information
glendaviesnz authored Feb 24, 2020
1 parent 6578b98 commit 0ea25dc
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 0 deletions.
58 changes: 58 additions & 0 deletions class.jetpack-gutenberg.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
*
Expand Down
22 changes: 22 additions & 0 deletions tests/php/general/test-class.jetpack-gutenberg.php
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
}
}

0 comments on commit 0ea25dc

Please sign in to comment.