Changeset 55231
- Timestamp:
- 02/06/2023 03:31:50 PM (2 years ago)
- Location:
- trunk
- Files:
-
- 3 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-includes/class-wp-theme-json-resolver.php
r55146 r55231 428 428 $stylesheet = $theme->get_stylesheet(); 429 429 $args = array( 430 'posts_per_page' => 1, 431 'orderby' => 'date', 432 'order' => 'desc', 433 'post_type' => $post_type_filter, 434 'post_status' => $post_status_filter, 435 'ignore_sticky_posts' => true, 436 'no_found_rows' => true, 437 'tax_query' => array( 430 'posts_per_page' => 1, 431 'orderby' => 'date', 432 'order' => 'desc', 433 'post_type' => $post_type_filter, 434 'post_status' => $post_status_filter, 435 'ignore_sticky_posts' => true, 436 'no_found_rows' => true, 437 'update_post_meta_cache' => false, 438 'update_post_term_cache' => false, 439 'tax_query' => array( 438 440 array( 439 441 'taxonomy' => 'wp_theme', … … 447 449 $recent_posts = $global_style_query->query( $args ); 448 450 if ( count( $recent_posts ) === 1 ) { 449 $user_cpt = get_ post( $recent_posts[0], ARRAY_A);451 $user_cpt = get_object_vars( $recent_posts[0] ); 450 452 } elseif ( $create_post ) { 451 453 $cpt_post_id = wp_insert_post( … … 463 465 ); 464 466 if ( ! is_wp_error( $cpt_post_id ) ) { 465 $user_cpt = get_ post( $cpt_post_id, ARRAY_A);467 $user_cpt = get_object_vars( get_post( $cpt_post_id ) ); 466 468 } 467 469 } … … 526 528 * Returns the data merged from multiple origins. 527 529 * 528 * There are three sources of data (origins) for a site: 529 * default, theme, and custom. The custom's has higher priority 530 * than the theme's, and the theme's higher than default's. 530 * There are four sources of data (origins) for a site: 531 * 532 * - default => WordPress 533 * - blocks => each one of the blocks provides data for itself 534 * - theme => the active theme 535 * - custom => data provided by the user 536 * 537 * The custom's has higher priority than the theme's, the theme's higher than blocks', 538 * and block's higher than default's. 531 539 * 532 540 * Unlike the getters … … 536 544 * this method returns data after it has been merged with the previous origins. 537 545 * This means that if the same piece of data is declared in different origins 538 * ( user, theme, and core), the last origin overrides the previous.546 * (default, blocks, theme, custom), the last origin overrides the previous. 539 547 * 540 548 * For example, if the user has set a background color … … 546 554 * added the `$origin` parameter. 547 555 * @since 6.1.0 Added block data and generation of spacingSizes array. 548 * 549 * @param string $origin Optional. To what level should we merge data. 550 * Valid values are 'theme' or 'custom'. Default 'custom'. 556 * @since 6.2.0 Changed ' $origin' parameter values to 'default', 'blocks', 'theme' or 'custom'. 557 * 558 * @param string $origin Optional. To what level should we merge data: 'default', 'blocks', 'theme' or 'custom'. 559 * 'custom' is used as default value as well as fallback value if the origin is unknown. 551 560 * @return WP_Theme_JSON 552 561 */ … … 557 566 558 567 $result = static::get_core_data(); 568 if ( 'default' === $origin ) { 569 $result->set_spacing_sizes(); 570 return $result; 571 } 572 559 573 $result->merge( static::get_block_data() ); 574 if ( 'blocks' === $origin ) { 575 return $result; 576 } 577 560 578 $result->merge( static::get_theme_data() ); 561 562 if ( 'custom' === $origin ) {563 $result->merge( static::get_user_data() );564 } 565 566 // Generate the default spacingSizes array based on the merged spacingScale settings.579 if ( 'theme' === $origin ) { 580 $result->set_spacing_sizes(); 581 return $result; 582 } 583 584 $result->merge( static::get_user_data() ); 567 585 $result->set_spacing_sizes(); 568 586 … … 651 669 652 670 /** 671 * Returns an array of all nested JSON files within a given directory. 672 * 673 * @since 6.2.0 674 * 675 * @param string $dir The directory to recursively iterate and list files of. 676 * @return array The merged array. 677 */ 678 private static function recursively_iterate_json( $dir ) { 679 $nested_files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir ) ); 680 $nested_json_files = iterator_to_array( new RegexIterator( $nested_files, '/^.+\.json$/i', RecursiveRegexIterator::GET_MATCH ) ); 681 return $nested_json_files; 682 } 683 684 685 /** 653 686 * Returns the style variations defined by the theme. 654 687 * 655 688 * @since 6.0.0 689 * @since 6.2.0 Returns parent theme variations if theme is a child. 656 690 * 657 691 * @return array 658 692 */ 659 693 public static function get_style_variations() { 660 $variations = array(); 661 $base_directory = get_stylesheet_directory() . '/styles'; 694 $variation_files = array(); 695 $variations = array(); 696 $base_directory = get_stylesheet_directory() . '/styles'; 697 $template_directory = get_template_directory() . '/styles'; 662 698 if ( is_dir( $base_directory ) ) { 663 $nested_files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $base_directory ) ); 664 $nested_html_files = iterator_to_array( new RegexIterator( $nested_files, '/^.+\.json$/i', RecursiveRegexIterator::GET_MATCH ) ); 665 ksort( $nested_html_files ); 666 foreach ( $nested_html_files as $path => $file ) { 667 $decoded_file = wp_json_file_decode( $path, array( 'associative' => true ) ); 668 if ( is_array( $decoded_file ) ) { 669 $translated = static::translate( $decoded_file, wp_get_theme()->get( 'TextDomain' ) ); 670 $variation = ( new WP_Theme_JSON( $translated ) )->get_raw_data(); 671 if ( empty( $variation['title'] ) ) { 672 $variation['title'] = basename( $path, '.json' ); 699 $variation_files = static::recursively_iterate_json( $base_directory ); 700 } 701 if ( is_dir( $template_directory ) && $template_directory !== $base_directory ) { 702 $variation_files_parent = static::recursively_iterate_json( $template_directory ); 703 // If the child and parent variation file basename are the same, only include the child theme's. 704 foreach ( $variation_files_parent as $parent_path => $parent ) { 705 foreach ( $variation_files as $child_path => $child ) { 706 if ( basename( $parent_path ) === basename( $child_path ) ) { 707 unset( $variation_files_parent[ $parent_path ] ); 673 708 } 674 $variations[] = $variation;675 709 } 676 710 } 711 $variation_files = array_merge( $variation_files, $variation_files_parent ); 712 } 713 ksort( $variation_files ); 714 foreach ( $variation_files as $path => $file ) { 715 $decoded_file = wp_json_file_decode( $path, array( 'associative' => true ) ); 716 if ( is_array( $decoded_file ) ) { 717 $translated = static::translate( $decoded_file, wp_get_theme()->get( 'TextDomain' ) ); 718 $variation = ( new WP_Theme_JSON( $translated ) )->get_raw_data(); 719 if ( empty( $variation['title'] ) ) { 720 $variation['title'] = basename( $path, '.json' ); 721 } 722 $variations[] = $variation; 723 } 677 724 } 678 725 return $variations; 679 726 } 680 681 727 } -
trunk/tests/phpunit/tests/rest-api/rest-global-styles-controller.php
r55192 r55231 485 485 $data = $response->get_data(); 486 486 $expected = array( 487 array( 488 'version' => 2, 489 'title' => 'variation-b', 490 'settings' => array( 491 'blocks' => array( 492 'core/post-title' => array( 493 'color' => array( 494 'palette' => array( 495 'theme' => array( 496 array( 497 'slug' => 'light', 498 'name' => 'Light', 499 'color' => '#f1f1f1', 500 ), 501 ), 502 ), 503 ), 504 ), 505 ), 506 ), 507 ), 487 508 array( 488 509 'version' => 2, … … 512 533 ), 513 534 ); 514 $this->assertSameSetsWithIndex( $data, $expected ); 535 536 wp_recursive_ksort( $data ); 537 wp_recursive_ksort( $expected ); 538 539 $this->assertSameSets( $data, $expected ); 515 540 } 516 541 -
trunk/tests/phpunit/tests/theme/wpThemeJsonResolver.php
r55118 r55231 236 236 $this->assertSame( 237 237 'Wariant motywu blokowego', 238 $style_variations[ 0]['title']238 $style_variations[1]['title'] 239 239 ); 240 240 } … … 776 776 $this->assertNull( $property->getValue(), 'Theme i18n schema should not have been loaded without theme support.' ); 777 777 } 778 779 /** 780 * Tests that get_merged_data returns the data merged up to the proper origin. 781 * 782 * @ticket 57545 783 * 784 * @covers WP_Theme_JSON_Resolver::get_merged_data 785 * 786 * @dataProvider data_get_merged_data_returns_origin 787 * 788 * @param string $origin What origin to get data from. 789 * @param bool $core_palette Whether the core palette is present. 790 * @param string $core_palette_text Message. 791 * @param string $block_styles Whether the block styles are present. 792 * @param string $block_styles_text Message. 793 * @param bool $theme_palette Whether the theme palette is present. 794 * @param string $theme_palette_text Message. 795 * @param bool $user_palette Whether the user palette is present. 796 * @param string $user_palette_text Message. 797 */ 798 public function test_get_merged_data_returns_origin( $origin, $core_palette, $core_palette_text, $block_styles, $block_styles_text, $theme_palette, $theme_palette_text, $user_palette, $user_palette_text ) { 799 // Make sure there is data from the blocks origin. 800 register_block_type( 801 'my/block-with-styles', 802 array( 803 'api_version' => 2, 804 'attributes' => array( 805 'borderColor' => array( 806 'type' => 'string', 807 ), 808 'style' => array( 809 'type' => 'object', 810 ), 811 ), 812 'supports' => array( 813 '__experimentalStyle' => array( 814 'typography' => array( 815 'fontSize' => '42rem', 816 ), 817 ), 818 ), 819 ) 820 ); 821 822 // Make sure there is data from the theme origin. 823 switch_theme( 'block-theme' ); 824 825 // Make sure there is data from the user origin. 826 wp_set_current_user( self::$administrator_id ); 827 $user_cpt = WP_Theme_JSON_Resolver::get_user_data_from_wp_global_styles( wp_get_theme(), true ); 828 $config = json_decode( $user_cpt['post_content'], true ); 829 $config['settings']['color']['palette']['custom'] = array( 830 array( 831 'color' => 'hotpink', 832 'name' => 'My color', 833 'slug' => 'my-color', 834 ), 835 ); 836 $user_cpt['post_content'] = wp_json_encode( $config ); 837 wp_update_post( $user_cpt, true, false ); 838 839 $theme_json = WP_Theme_JSON_Resolver::get_merged_data( $origin ); 840 $settings = $theme_json->get_settings(); 841 $styles = $theme_json->get_styles_block_nodes(); 842 $styles = array_filter( 843 $styles, 844 static function( $element ) { 845 return isset( $element['name'] ) && 'my/block-with-styles' === $element['name']; 846 } 847 ); 848 unregister_block_type( 'my/block-with-styles' ); 849 850 $this->assertSame( $core_palette, isset( $settings['color']['palette']['default'] ), $core_palette_text ); 851 $this->assertSame( $block_styles, count( $styles ) === 1, $block_styles_text ); 852 $this->assertSame( $theme_palette, isset( $settings['color']['palette']['theme'] ), $theme_palette_text ); 853 $this->assertSame( $user_palette, isset( $settings['color']['palette']['custom'] ), $user_palette_text ); 854 855 } 856 857 /** 858 * Data provider. 859 * 860 * @return array[] 861 */ 862 public function data_get_merged_data_returns_origin() { 863 return array( 864 'origin_default' => array( 865 'origin' => 'default', 866 'core_palette' => true, 867 'core_palette_text' => 'Core palette must be present', 868 'block_styles' => false, 869 'block_styles_text' => 'Block styles should not be present', 870 'theme_palette' => false, 871 'theme_palette_text' => 'Theme palette should not be present', 872 'user_palette' => false, 873 'user_palette_text' => 'User palette should not be present', 874 ), 875 'origin_blocks' => array( 876 'origin' => 'blocks', 877 'core_palette' => true, 878 'core_palette_text' => 'Core palette must be present', 879 'block_styles' => true, 880 'block_styles_text' => 'Block styles must be present', 881 'theme_palette' => false, 882 'theme_palette_text' => 'Theme palette should not be present', 883 'user_palette' => false, 884 'user_palette_text' => 'User palette should not be present', 885 ), 886 'origin_theme' => array( 887 'origin' => 'theme', 888 'core_palette' => true, 889 'core_palette_text' => 'Core palette must be present', 890 'block_styles' => true, 891 'block_styles_text' => 'Block styles must be present', 892 'theme_palette' => true, 893 'theme_palette_text' => 'Theme palette must be present', 894 'user_palette' => false, 895 'user_palette_text' => 'User palette should not be present', 896 ), 897 'origin_custom' => array( 898 'origin' => 'custom', 899 'core_palette' => true, 900 'core_palette_text' => 'Core palette must be present', 901 'block_styles' => true, 902 'block_styles_text' => 'Block styles must be present', 903 'theme_palette' => true, 904 'theme_palette_text' => 'Theme palette must be present', 905 'user_palette' => true, 906 'user_palette_text' => 'User palette must be present', 907 ), 908 ); 909 } 910 911 /** 912 * Tests that get_style_variations returns all variations, including parent theme variations if the theme is a child, 913 * and that the child variation overwrites the parent variation of the same name. 914 * 915 * @ticket 57545 916 * 917 * @covers WP_Theme_JSON_Resolver::get_style_variations 918 **/ 919 public function test_get_style_variations_returns_all_variations() { 920 // Switch to a child theme. 921 switch_theme( 'block-theme-child' ); 922 wp_set_current_user( self::$administrator_id ); 923 924 $actual_settings = WP_Theme_JSON_Resolver::get_style_variations(); 925 $expected_settings = array( 926 array( 927 'version' => 2, 928 'title' => 'variation-b', 929 'settings' => array( 930 'blocks' => array( 931 'core/post-title' => array( 932 'color' => array( 933 'palette' => array( 934 'theme' => array( 935 array( 936 'slug' => 'dark', 937 'name' => 'Dark', 938 'color' => '#010101', 939 ), 940 ), 941 ), 942 ), 943 ), 944 ), 945 ), 946 ), 947 array( 948 'version' => 2, 949 'title' => 'Block theme variation', 950 'settings' => array( 951 'color' => array( 952 'palette' => array( 953 'theme' => array( 954 array( 955 'slug' => 'foreground', 956 'name' => 'Foreground', 957 'color' => '#3F67C6', 958 ), 959 ), 960 ), 961 ), 962 ), 963 'styles' => array( 964 'blocks' => array( 965 'core/post-title' => array( 966 'typography' => array( 967 'fontWeight' => '700', 968 ), 969 ), 970 ), 971 ), 972 ), 973 ); 974 975 wp_recursive_ksort( $actual_settings ); 976 wp_recursive_ksort( $expected_settings ); 977 978 $this->assertSame( 979 $expected_settings, 980 $actual_settings 981 ); 982 } 778 983 }
Note: See TracChangeset
for help on using the changeset viewer.