diff --git a/src/wp-includes/class-wp-theme-json.php b/src/wp-includes/class-wp-theme-json.php index f40fde9cf82b3..7885f27b420c5 100644 --- a/src/wp-includes/class-wp-theme-json.php +++ b/src/wp-includes/class-wp-theme-json.php @@ -2722,9 +2722,21 @@ private static function get_block_nodes( $theme_json, $selectors = array(), $opt foreach ( $theme_json['styles']['blocks'] as $name => $node ) { $node_path = array( 'styles', 'blocks', $name ); if ( $include_node_paths_only ) { - $nodes[] = array( + $variation_paths = array(); + if ( $include_variations && isset( $node['variations'] ) ) { + foreach ( $node['variations'] as $variation => $variation_node ) { + $variation_paths[] = array( + 'path' => array( 'styles', 'blocks', $name, 'variations', $variation ), + ); + } + } + $node = array( 'path' => $node_path, ); + if ( ! empty( $variation_paths ) ) { + $node['variations'] = $variation_paths; + } + $nodes[] = $node; } else { $selector = null; if ( isset( $selectors[ $name ]['selector'] ) ) { diff --git a/tests/phpunit/tests/theme/wpThemeJson.php b/tests/phpunit/tests/theme/wpThemeJson.php index 5b0653c6849a3..8fe8c7d5d0d65 100644 --- a/tests/phpunit/tests/theme/wpThemeJson.php +++ b/tests/phpunit/tests/theme/wpThemeJson.php @@ -2502,6 +2502,85 @@ public function test_return_block_node_paths() { $this->assertEquals( $expected, $block_nodes ); } + /** + * This test covers `get_block_nodes` with the `$include_node_paths_only` + * and `include_block_style_variations` options. + * + * @ticket 62399 + */ + public function test_return_block_node_paths_with_variations() { + $theme_json = new ReflectionClass( 'WP_Theme_JSON' ); + + $func = $theme_json->getMethod( 'get_block_nodes' ); + $func->setAccessible( true ); + + $theme_json = array( + 'version' => WP_Theme_JSON::LATEST_SCHEMA, + 'styles' => array( + 'typography' => array( + 'fontSize' => '16px', + ), + 'blocks' => array( + 'core/button' => array( + 'color' => array( + 'background' => 'red', + ), + 'variations' => array( + 'cheese' => array( + 'color' => array( + 'background' => 'cheese', + ), + ), + ), + ), + 'core/group' => array( + 'color' => array( + 'background' => 'blue', + ), + 'variations' => array( + 'apricot' => array( + 'color' => array( + 'background' => 'apricot', + ), + ), + ), + ), + ), + ), + ); + + $block_nodes = $func->invoke( + null, + $theme_json, + array(), + array( + 'include_node_paths_only' => true, + 'include_block_style_variations' => true, + ) + ); + + $expected = array( + array( + 'path' => array( 'styles', 'blocks', 'core/button' ), + 'variations' => array( + array( + 'path' => array( 'styles', 'blocks', 'core/button', 'variations', 'cheese' ), + ), + ), + ), + array( + 'path' => array( 'styles', 'blocks', 'core/group' ), + 'variations' => array( + array( + 'path' => array( 'styles', 'blocks', 'core/group', 'variations', 'apricot' ), + ), + ), + ), + ); + + $this->assertEquals( $expected, $block_nodes ); + } + /** * @ticket 54336 */