diff --git src/wp-includes/class-wp-customize-manager.php src/wp-includes/class-wp-customize-manager.php
index 54c3f0e..3e7e870 100644
|
|
final class WP_Customize_Manager { |
523 | 523 | } |
524 | 524 | } |
525 | 525 | |
526 | | // Import theme starter content for fresh installs when landing in the customizer and no existing changeset loaded. |
527 | | if ( get_option( 'fresh_site' ) && 'customize.php' === $pagenow && ! $this->changeset_post_id() ) { |
| 526 | /* |
| 527 | * Import theme starter content for fresh installs when landing in the customizer. |
| 528 | * Import starter content at after_setup_theme:100 so that any |
| 529 | * add_theme_support( 'starter-content' ) calls will have been made. |
| 530 | */ |
| 531 | if ( get_option( 'fresh_site' ) && 'customize.php' === $pagenow ) { |
528 | 532 | add_action( 'after_setup_theme', array( $this, 'import_theme_starter_content' ), 100 ); |
529 | 533 | } |
530 | 534 | |
… |
… |
final class WP_Customize_Manager { |
885 | 889 | } |
886 | 890 | |
887 | 891 | /** |
888 | | * Import theme starter content into post values. |
| 892 | * Starter content setting IDs. |
| 893 | * |
| 894 | * @since 4.7.0 |
| 895 | * @access private |
| 896 | * @var array |
| 897 | */ |
| 898 | protected $starter_content_settings_ids = array(); |
| 899 | |
| 900 | /** |
| 901 | * Import theme starter content into the customized state. |
889 | 902 | * |
890 | 903 | * @since 4.7.0 |
891 | 904 | * @access public |
… |
… |
final class WP_Customize_Manager { |
897 | 910 | $starter_content = get_theme_starter_content(); |
898 | 911 | } |
899 | 912 | |
| 913 | $changeset_data = array(); |
| 914 | if ( $this->changeset_post_id() ) { |
| 915 | $changeset_data = $this->get_changeset_post_data( $this->changeset_post_id() ); |
| 916 | } |
| 917 | |
900 | 918 | $sidebars_widgets = isset( $starter_content['widgets'] ) && ! empty( $this->widgets ) ? $starter_content['widgets'] : array(); |
901 | 919 | $posts = isset( $starter_content['posts'] ) && ! empty( $this->nav_menus ) ? $starter_content['posts'] : array(); |
902 | 920 | $options = isset( $starter_content['options'] ) ? $starter_content['options'] : array(); |
… |
… |
final class WP_Customize_Manager { |
932 | 950 | $widget_id = sprintf( '%s-%d', $id_base, $max_widget_numbers[ $id_base ] ); |
933 | 951 | $setting_id = sprintf( 'widget_%s[%d]', $id_base, $max_widget_numbers[ $id_base ] ); |
934 | 952 | |
935 | | $class = 'WP_Customize_Setting'; |
936 | | |
937 | | /** This filter is documented in wp-includes/class-wp-customize-manager.php */ |
938 | | $args = apply_filters( 'customize_dynamic_setting_args', false, $setting_id ); |
939 | | |
940 | | if ( false !== $args ) { |
941 | | |
942 | | /** This filter is documented in wp-includes/class-wp-customize-manager.php */ |
943 | | $class = apply_filters( 'customize_dynamic_setting_class', $class, $setting_id, $args ); |
944 | | |
945 | | $setting = new $class( $this, $setting_id, $args ); |
946 | | $setting_value = call_user_func( $setting->sanitize_js_callback, $instance, $setting ); |
| 953 | $setting_value = $this->widgets->sanitize_widget_js_instance( $instance ); |
| 954 | if ( empty( $changeset_data[ $setting_id ] ) || ! empty( $changeset_data[ $setting_id ]['starter_content'] ) ) { |
947 | 955 | $this->set_post_value( $setting_id, $setting_value ); |
948 | | $sidebar_widget_ids[] = $widget_id; |
| 956 | $this->starter_content_settings_ids[] = $setting_id; |
949 | 957 | } |
| 958 | $sidebar_widget_ids[] = $widget_id; |
950 | 959 | } |
951 | 960 | |
952 | | $this->set_post_value( sprintf( 'sidebars_widgets[%s]', $sidebar_id ), $sidebar_widget_ids ); |
| 961 | $setting_id = sprintf( 'sidebars_widgets[%s]', $sidebar_id ); |
| 962 | if ( empty( $changeset_data[ $setting_id ] ) || ! empty( $changeset_data[ $setting_id ]['starter_content'] ) ) { |
| 963 | $this->set_post_value( $setting_id, $sidebar_widget_ids ); |
| 964 | $this->starter_content_settings_ids[] = $setting_id; |
| 965 | } |
953 | 966 | } |
954 | 967 | |
955 | 968 | // Posts & pages. |
956 | 969 | if ( ! empty( $posts ) ) { |
| 970 | $nav_menus_created_posts = array(); |
| 971 | if ( ! empty( $changeset_data['nav_menus_created_posts']['value'] ) ) { |
| 972 | $nav_menus_created_posts = $changeset_data['nav_menus_created_posts']['value']; |
| 973 | } |
| 974 | |
| 975 | $existing_posts = array(); |
| 976 | if ( ! empty( $nav_menus_created_posts ) ) { |
| 977 | $existing_posts_query = new WP_Query( array( |
| 978 | 'post__in' => $nav_menus_created_posts, |
| 979 | 'post_status' => 'auto-draft', |
| 980 | 'post_type' => 'any', |
| 981 | 'number' => -1, |
| 982 | ) ); |
| 983 | foreach ( $existing_posts_query->posts as $existing_post ) { |
| 984 | $existing_posts[ $existing_post->post_type . ':' . $existing_post->post_name ] = $existing_post; |
| 985 | } |
| 986 | } |
| 987 | |
957 | 988 | foreach ( array_keys( $posts ) as $post_symbol ) { |
| 989 | if ( empty( $posts[ $post_symbol ]['post_type'] ) ) { |
| 990 | continue; |
| 991 | } |
| 992 | $post_type = $posts[ $post_symbol ]['post_type']; |
| 993 | if ( ! empty( $posts[ $post_symbol ]['post_name'] ) ) { |
| 994 | $post_name = $posts[ $post_symbol ]['post_name']; |
| 995 | } elseif ( ! empty( $posts[ $post_symbol ]['post_title'] ) ) { |
| 996 | $post_name = sanitize_title( $posts[ $post_symbol ]['post_title'] ); |
| 997 | } else { |
| 998 | continue; |
| 999 | } |
| 1000 | |
| 1001 | // Use existing auto-draft post if one already exists with the same type and name. |
| 1002 | if ( isset( $existing_posts[ $post_type . ':' . $post_name ] ) ) { |
| 1003 | $posts[ $post_symbol ] = $existing_posts[ $post_type . ':' . $post_name ]->ID; |
| 1004 | continue; |
| 1005 | } |
| 1006 | |
958 | 1007 | $r = $this->nav_menus->insert_auto_draft_post( $posts[ $post_symbol ] ); |
959 | 1008 | if ( $r instanceof WP_Post ) { |
960 | 1009 | $posts[ $post_symbol ]['ID'] = $r->ID; |
961 | 1010 | } |
962 | 1011 | } |
963 | | $this->set_post_value( 'nav_menus_created_posts', wp_list_pluck( $posts, 'ID' ) ); // This is why nav_menus component is dependency for adding posts. |
| 1012 | |
| 1013 | // The nav_menus_created_posts setting is why nav_menus component is dependency for adding posts. |
| 1014 | $setting_id = 'nav_menus_created_posts'; |
| 1015 | if ( empty( $changeset_data[ $setting_id ] ) || ! empty( $changeset_data[ $setting_id ]['starter_content'] ) ) { |
| 1016 | $nav_menus_created_posts = array_unique( array_merge( $nav_menus_created_posts, wp_list_pluck( $posts, 'ID' ) ) ); |
| 1017 | $this->set_post_value( $setting_id, $nav_menus_created_posts ); |
| 1018 | $this->starter_content_settings_ids[] = $setting_id; |
| 1019 | } |
964 | 1020 | } |
965 | 1021 | |
966 | 1022 | // Nav menus. |
967 | 1023 | $placeholder_id = -1; |
| 1024 | $reused_nav_menu_setting_ids = array(); |
968 | 1025 | foreach ( $nav_menus as $nav_menu_location => $nav_menu ) { |
969 | | $nav_menu_term_id = $placeholder_id--; |
970 | | $nav_menu_setting_id = sprintf( 'nav_menu[%d]', $nav_menu_term_id ); |
| 1026 | |
| 1027 | $nav_menu_term_id = null; |
| 1028 | $nav_menu_setting_id = null; |
| 1029 | $matches = array(); |
| 1030 | |
| 1031 | // Look for an existing placeholder menu with starter content. |
| 1032 | foreach ( $changeset_data as $setting_id => $setting_params ) { |
| 1033 | $can_reuse = ( |
| 1034 | ! empty( $setting_params['starter_content'] ) |
| 1035 | && |
| 1036 | ! in_array( $setting_id, $reused_nav_menu_setting_ids, true ) |
| 1037 | && |
| 1038 | preg_match( '#^nav_menu\[(?P<nav_menu_id>-?\d+)\]$#', $setting_id, $matches ) |
| 1039 | ); |
| 1040 | if ( $can_reuse ) { |
| 1041 | $nav_menu_term_id = intval( $matches['nav_menu_id'] ); |
| 1042 | $nav_menu_setting_id = $setting_id; |
| 1043 | $reused_nav_menu_setting_ids[] = $setting_id; |
| 1044 | break; |
| 1045 | } |
| 1046 | } |
| 1047 | |
| 1048 | if ( ! $nav_menu_term_id ) { |
| 1049 | while ( isset( $changeset_data[ sprintf( 'nav_menu[%d]', $placeholder_id ) ] ) ) { |
| 1050 | $placeholder_id--; |
| 1051 | } |
| 1052 | $nav_menu_term_id = $placeholder_id; |
| 1053 | $nav_menu_setting_id = sprintf( 'nav_menu[%d]', $placeholder_id ); |
| 1054 | } |
| 1055 | |
971 | 1056 | $this->set_post_value( $nav_menu_setting_id, array( |
972 | 1057 | 'name' => isset( $nav_menu['name'] ) ? $nav_menu['name'] : $nav_menu_location, |
973 | 1058 | ) ); |
| 1059 | $this->starter_content_settings_ids[] = $nav_menu_setting_id; |
974 | 1060 | |
975 | 1061 | // @todo Add support for menu_item_parent. |
976 | 1062 | $position = 0; |
… |
… |
final class WP_Customize_Manager { |
994 | 1080 | } else { |
995 | 1081 | $nav_menu_item['object_id'] = 0; |
996 | 1082 | } |
997 | | $this->set_post_value( $nav_menu_item_setting_id, $nav_menu_item ); |
| 1083 | |
| 1084 | if ( empty( $changeset_data[ $nav_menu_item_setting_id ] ) || ! empty( $changeset_data[ $nav_menu_item_setting_id ]['starter_content'] ) ) { |
| 1085 | $this->set_post_value( $nav_menu_item_setting_id, $nav_menu_item ); |
| 1086 | $this->starter_content_settings_ids[] = $nav_menu_item_setting_id; |
| 1087 | } |
998 | 1088 | } |
999 | 1089 | |
1000 | | $this->set_post_value( sprintf( 'nav_menu_locations[%s]', $nav_menu_location ), $nav_menu_term_id ); |
| 1090 | $setting_id = sprintf( 'nav_menu_locations[%s]', $nav_menu_location ); |
| 1091 | if ( empty( $changeset_data[ $setting_id ] ) || ! empty( $changeset_data[ $setting_id ]['starter_content'] ) ) { |
| 1092 | $this->set_post_value( $setting_id, $nav_menu_term_id ); |
| 1093 | $this->starter_content_settings_ids[] = $setting_id; |
| 1094 | } |
1001 | 1095 | } |
1002 | 1096 | |
1003 | 1097 | // Options. |
… |
… |
final class WP_Customize_Manager { |
1005 | 1099 | if ( preg_match( '/^{{(?P<symbol>.+)}}$/', $value, $matches ) && isset( $posts[ $matches['symbol'] ] ) ) { |
1006 | 1100 | $value = $posts[ $matches['symbol'] ]['ID']; |
1007 | 1101 | } |
1008 | | $this->set_post_value( $name, $value ); |
| 1102 | |
| 1103 | if ( empty( $changeset_data[ $name ] ) || ! empty( $changeset_data[ $name ]['starter_content'] ) ) { |
| 1104 | $this->set_post_value( $name, $value ); |
| 1105 | $this->starter_content_settings_ids[] = $name; |
| 1106 | } |
1009 | 1107 | } |
1010 | 1108 | |
1011 | 1109 | // Theme mods. |
… |
… |
final class WP_Customize_Manager { |
1013 | 1111 | if ( preg_match( '/^{{(?P<symbol>.+)}}$/', $value, $matches ) && isset( $posts[ $matches['symbol'] ] ) ) { |
1014 | 1112 | $value = $posts[ $matches['symbol'] ]['ID']; |
1015 | 1113 | } |
1016 | | $this->set_post_value( $name, $value ); |
| 1114 | |
| 1115 | if ( empty( $changeset_data[ $name ] ) || ! empty( $changeset_data[ $name ]['starter_content'] ) ) { |
| 1116 | $this->set_post_value( $name, $value ); |
| 1117 | $this->starter_content_settings_ids[] = $name; |
| 1118 | } |
| 1119 | } |
| 1120 | |
| 1121 | if ( ! empty( $this->starter_content_settings_ids ) ) { |
| 1122 | if ( did_action( 'customize_register' ) ) { |
| 1123 | $this->_save_starter_content_changeset(); |
| 1124 | } else { |
| 1125 | add_action( 'customize_register', array( $this, '_save_starter_content_changeset' ), 1000 ); |
| 1126 | } |
| 1127 | } |
| 1128 | } |
| 1129 | |
| 1130 | /** |
| 1131 | * Save starter content changeset. |
| 1132 | * |
| 1133 | * @since 4.7.0 |
| 1134 | * @access private |
| 1135 | */ |
| 1136 | public function _save_starter_content_changeset() { |
| 1137 | |
| 1138 | if ( empty( $this->starter_content_settings_ids ) ) { |
| 1139 | return; |
1017 | 1140 | } |
| 1141 | |
| 1142 | $this->save_changeset_post( array( |
| 1143 | 'data' => array_fill_keys( $this->starter_content_settings_ids, array( 'starter_content' => true ) ), |
| 1144 | 'starter_content' => true, |
| 1145 | ) ); |
1018 | 1146 | } |
1019 | 1147 | |
1020 | 1148 | /** |
… |
… |
final class WP_Customize_Manager { |
1823 | 1951 | * @param array $args { |
1824 | 1952 | * Args for changeset post. |
1825 | 1953 | * |
1826 | | * @type array $data Optional additional changeset data. Values will be merged on top of any existing post values. |
1827 | | * @type string $status Post status. Optional. If supplied, the save will be transactional and a post revision will be allowed. |
1828 | | * @type string $title Post title. Optional. |
1829 | | * @type string $date_gmt Date in GMT. Optional. |
1830 | | * @type int $user_id ID for user who is saving the changeset. Optional, defaults to the current user ID. |
| 1954 | * @type array $data Optional additional changeset data. Values will be merged on top of any existing post values. |
| 1955 | * @type string $status Post status. Optional. If supplied, the save will be transactional and a post revision will be allowed. |
| 1956 | * @type string $title Post title. Optional. |
| 1957 | * @type string $date_gmt Date in GMT. Optional. |
| 1958 | * @type int $user_id ID for user who is saving the changeset. Optional, defaults to the current user ID. |
| 1959 | * @type bool $starter_content Whether the data is starter content. If false (default), then $starter_content will be cleared for any $data being saved. |
1831 | 1960 | * } |
1832 | 1961 | * |
1833 | 1962 | * @return array|WP_Error Returns array on success and WP_Error with array data on error. |
… |
… |
final class WP_Customize_Manager { |
1841 | 1970 | 'data' => array(), |
1842 | 1971 | 'date_gmt' => null, |
1843 | 1972 | 'user_id' => get_current_user_id(), |
| 1973 | 'starter_content' => false, |
1844 | 1974 | ), |
1845 | 1975 | $args |
1846 | 1976 | ); |
… |
… |
final class WP_Customize_Manager { |
1977 | 2107 | if ( ! isset( $data[ $changeset_setting_id ] ) ) { |
1978 | 2108 | $data[ $changeset_setting_id ] = array(); |
1979 | 2109 | } |
| 2110 | |
1980 | 2111 | $data[ $changeset_setting_id ] = array_merge( |
1981 | 2112 | $data[ $changeset_setting_id ], |
1982 | 2113 | $setting_params, |
… |
… |
final class WP_Customize_Manager { |
1985 | 2116 | 'user_id' => $args['user_id'], |
1986 | 2117 | ) |
1987 | 2118 | ); |
| 2119 | |
| 2120 | // Clear starter_content flag in data if changeset is not explicitly being updated for starter content. |
| 2121 | if ( empty( $args['starter_content'] ) ) { |
| 2122 | unset( $data[ $changeset_setting_id ]['starter_content'] ); |
| 2123 | } |
1988 | 2124 | } |
1989 | 2125 | } |
1990 | 2126 | |
diff --git src/wp-includes/theme.php src/wp-includes/theme.php
index 66e10b2..606c0db 100644
|
|
function get_theme_starter_content() { |
1792 | 1792 | $config = array(); |
1793 | 1793 | } |
1794 | 1794 | |
1795 | | $core_content = array ( |
| 1795 | $core_content = array( |
1796 | 1796 | 'widgets' => array( |
1797 | | 'text_business_info' => array ( 'text', array ( |
| 1797 | 'text_business_info' => array( 'text', array( |
1798 | 1798 | 'title' => _x( 'Find Us', 'Theme starter content' ), |
1799 | | 'text' => join( '', array ( |
| 1799 | 'text' => join( '', array( |
1800 | 1800 | '<p><strong>' . _x( 'Address', 'Theme starter content' ) . '</strong><br />', |
1801 | 1801 | _x( '123 Main Street', 'Theme starter content' ) . '<br />' . _x( 'New York, NY 10001', 'Theme starter content' ) . '</p>', |
1802 | 1802 | '<p><strong>' . _x( 'Hours', 'Theme starter content' ) . '</strong><br />', |
1803 | 1803 | _x( 'Monday—Friday: 9:00AM–5:00PM', 'Theme starter content' ) . '<br />' . _x( 'Saturday & Sunday: 11:00AM–3:00PM', 'Theme starter content' ) . '</p>' |
1804 | 1804 | ) ), |
1805 | 1805 | ) ), |
1806 | | 'search' => array ( 'search', array ( |
| 1806 | 'search' => array( 'search', array( |
1807 | 1807 | 'title' => _x( 'Site Search', 'Theme starter content' ), |
1808 | 1808 | ) ), |
1809 | | 'text_credits' => array ( 'text', array ( |
| 1809 | 'text_credits' => array( 'text', array( |
1810 | 1810 | 'title' => _x( 'Site Credits', 'Theme starter content' ), |
1811 | 1811 | 'text' => sprintf( _x( 'This site was created on %s', 'Theme starter content' ), get_date_from_gmt( current_time( 'mysql', 1 ), 'c' ) ), |
1812 | 1812 | ) ), |
1813 | 1813 | ), |
1814 | | 'nav_menus' => array ( |
| 1814 | 'nav_menus' => array( |
1815 | 1815 | 'page_home' => array( |
1816 | 1816 | 'type' => 'post_type', |
1817 | 1817 | 'object' => 'page', |
… |
… |
function get_theme_starter_content() { |
1887 | 1887 | |
1888 | 1888 | foreach ( $config as $type => $args ) { |
1889 | 1889 | switch( $type ) { |
1890 | | // Use options and theme_mods as-is |
| 1890 | // Use options and theme_mods as-is. |
1891 | 1891 | case 'options' : |
1892 | 1892 | case 'theme_mods' : |
1893 | 1893 | $content[ $type ] = $config[ $type ]; |
1894 | 1894 | break; |
1895 | 1895 | |
1896 | | // Widgets are an extra level down due to groupings |
| 1896 | // Widgets are grouped into sidebars. |
1897 | 1897 | case 'widgets' : |
1898 | | foreach ( $config[ $type ] as $group => $items ) { |
1899 | | foreach ( $items as $id ) { |
1900 | | if ( ! empty( $core_content[ $type ] ) && ! empty( $core_content[ $type ][ $id ] ) ) { |
1901 | | $content[ $type ][ $group ][ $id ] = $core_content[ $type ][ $id ]; |
| 1898 | foreach ( $config[ $type ] as $sidebar_id => $widgets ) { |
| 1899 | foreach ( $widgets as $widget ) { |
| 1900 | if ( is_array( $widget ) ) { |
| 1901 | $content[ $type ][ $sidebar_id ][] = $widget; |
| 1902 | } elseif ( is_string( $widget ) && ! empty( $core_content[ $type ] ) && ! empty( $core_content[ $type ][ $widget ] ) ) { |
| 1903 | $content[ $type ][ $sidebar_id ][] = $core_content[ $type ][ $widget ]; |
1902 | 1904 | } |
1903 | 1905 | } |
1904 | 1906 | } |
1905 | 1907 | break; |
1906 | 1908 | |
1907 | | // And nav menus are yet another level down |
| 1909 | // And nav menu items are grouped into nav menus. |
1908 | 1910 | case 'nav_menus' : |
1909 | | foreach ( $config[ $type ] as $group => $args2 ) { |
1910 | | // Menu groups need a name |
1911 | | if ( empty( $args['name'] ) ) { |
1912 | | $args2['name'] = $group; |
| 1911 | foreach ( $config[ $type ] as $nav_menu_location => $nav_menu ) { |
| 1912 | |
| 1913 | // Ensure nav menus get a name. |
| 1914 | if ( empty( $nav_menu['name'] ) ) { |
| 1915 | $nav_menu['name'] = $nav_menu_location; |
1913 | 1916 | } |
1914 | 1917 | |
1915 | | $content[ $type ][ $group ]['name'] = $args2['name']; |
| 1918 | $content[ $type ][ $nav_menu_location ]['name'] = $nav_menu['name']; |
1916 | 1919 | |
1917 | | // Do we need to check if this is empty? |
1918 | | foreach ( $args2['items'] as $id ) { |
1919 | | if ( ! empty( $core_content[ $type ] ) && ! empty( $core_content[ $type ][ $id ] ) ) { |
1920 | | $content[ $type ][ $group ]['items'][ $id ] = $core_content[ $type ][ $id ]; |
| 1920 | foreach ( $nav_menu['items'] as $nav_menu_item ) { |
| 1921 | if ( is_array( $nav_menu_item ) ) { |
| 1922 | $content[ $type ][ $nav_menu_location ]['items'][] = $nav_menu_item; |
| 1923 | } elseif ( is_string( $nav_menu_item ) && ! empty( $core_content[ $type ] ) && ! empty( $core_content[ $type ][ $nav_menu_item ] ) ) { |
| 1924 | $content[ $type ][ $nav_menu_location ]['items'][] = $core_content[ $type ][ $nav_menu_item ]; |
1921 | 1925 | } |
1922 | 1926 | } |
1923 | 1927 | } |
1924 | 1928 | break; |
1925 | 1929 | |
1926 | | |
1927 | | // Everything else should map at the next level |
| 1930 | // Everything else should map at the next level. |
1928 | 1931 | default : |
1929 | | foreach( $config[ $type ] as $id ) { |
1930 | | if ( ! empty( $core_content[ $type ] ) && ! empty( $core_content[ $type ][ $id ] ) ) { |
1931 | | $content[ $type ][ $id ] = $core_content[ $type ][ $id ]; |
| 1932 | foreach( $config[ $type ] as $i => $item ) { |
| 1933 | if ( is_array( $item ) ) { |
| 1934 | $content[ $type ][ $i ] = $item; |
| 1935 | } elseif ( is_string( $item ) && ! empty( $core_content[ $type ] ) && ! empty( $core_content[ $type ][ $item ] ) ) { |
| 1936 | $content[ $type ][ $item ] = $core_content[ $type ][ $item ]; |
1932 | 1937 | } |
1933 | 1938 | } |
1934 | 1939 | break; |