Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Block version gating #14703

Merged
merged 14 commits into from
Feb 24, 2020
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 ) {
jeherve marked this conversation as resolved.
Show resolved Hide resolved
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 );
}
}