Make WordPress Core

Ticket #38541: 38541.2.diff

File 38541.2.diff, 16.7 KB (added by westonruter, 8 years ago)
  • src/wp-includes/class-wp-customize-manager.php

    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 { 
    523523                        }
    524524                }
    525525
    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 ) {
    528532                        add_action( 'after_setup_theme', array( $this, 'import_theme_starter_content' ), 100 );
    529533                }
    530534
    final class WP_Customize_Manager { 
    885889        }
    886890
    887891        /**
    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.
    889902         *
    890903         * @since 4.7.0
    891904         * @access public
    final class WP_Customize_Manager { 
    897910                        $starter_content = get_theme_starter_content();
    898911                }
    899912
     913                $changeset_data = array();
     914                if ( $this->changeset_post_id() ) {
     915                        $changeset_data = $this->get_changeset_post_data( $this->changeset_post_id() );
     916                }
     917
    900918                $sidebars_widgets = isset( $starter_content['widgets'] ) && ! empty( $this->widgets ) ? $starter_content['widgets'] : array();
    901919                $posts = isset( $starter_content['posts'] ) && ! empty( $this->nav_menus ) ? $starter_content['posts'] : array();
    902920                $options = isset( $starter_content['options'] ) ? $starter_content['options'] : array();
    final class WP_Customize_Manager { 
    932950                                $widget_id = sprintf( '%s-%d', $id_base, $max_widget_numbers[ $id_base ] );
    933951                                $setting_id = sprintf( 'widget_%s[%d]', $id_base, $max_widget_numbers[ $id_base ] );
    934952
    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'] ) ) {
    947955                                        $this->set_post_value( $setting_id, $setting_value );
    948                                         $sidebar_widget_ids[] = $widget_id;
     956                                        $this->starter_content_settings_ids[] = $setting_id;
    949957                                }
     958                                $sidebar_widget_ids[] = $widget_id;
    950959                        }
    951960
    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                        }
    953966                }
    954967
    955968                // Posts & pages.
    956969                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
    957988                        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
    9581007                                $r = $this->nav_menus->insert_auto_draft_post( $posts[ $post_symbol ] );
    9591008                                if ( $r instanceof WP_Post ) {
    9601009                                        $posts[ $post_symbol ]['ID'] = $r->ID;
    9611010                                }
    9621011                        }
    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                        }
    9641020                }
    9651021
    9661022                // Nav menus.
    9671023                $placeholder_id = -1;
     1024                $reused_nav_menu_setting_ids = array();
    9681025                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
    9711056                        $this->set_post_value( $nav_menu_setting_id, array(
    9721057                                'name' => isset( $nav_menu['name'] ) ? $nav_menu['name'] : $nav_menu_location,
    9731058                        ) );
     1059                        $this->starter_content_settings_ids[] = $nav_menu_setting_id;
    9741060
    9751061                        // @todo Add support for menu_item_parent.
    9761062                        $position = 0;
    final class WP_Customize_Manager { 
    9941080                                } else {
    9951081                                        $nav_menu_item['object_id'] = 0;
    9961082                                }
    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                                }
    9981088                        }
    9991089
    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                        }
    10011095                }
    10021096
    10031097                // Options.
    final class WP_Customize_Manager { 
    10051099                        if ( preg_match( '/^{{(?P<symbol>.+)}}$/', $value, $matches ) && isset( $posts[ $matches['symbol'] ] ) ) {
    10061100                                $value = $posts[ $matches['symbol'] ]['ID'];
    10071101                        }
    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                        }
    10091107                }
    10101108
    10111109                // Theme mods.
    final class WP_Customize_Manager { 
    10131111                        if ( preg_match( '/^{{(?P<symbol>.+)}}$/', $value, $matches ) && isset( $posts[ $matches['symbol'] ] ) ) {
    10141112                                $value = $posts[ $matches['symbol'] ]['ID'];
    10151113                        }
    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;
    10171140                }
     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                ) );
    10181146        }
    10191147
    10201148        /**
    final class WP_Customize_Manager { 
    18231951         * @param array $args {
    18241952         *     Args for changeset post.
    18251953         *
    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.
    18311960         * }
    18321961         *
    18331962         * @return array|WP_Error Returns array on success and WP_Error with array data on error.
    final class WP_Customize_Manager { 
    18411970                                'data' => array(),
    18421971                                'date_gmt' => null,
    18431972                                'user_id' => get_current_user_id(),
     1973                                'starter_content' => false,
    18441974                        ),
    18451975                        $args
    18461976                );
    final class WP_Customize_Manager { 
    19772107                                if ( ! isset( $data[ $changeset_setting_id ] ) ) {
    19782108                                        $data[ $changeset_setting_id ] = array();
    19792109                                }
     2110
    19802111                                $data[ $changeset_setting_id ] = array_merge(
    19812112                                        $data[ $changeset_setting_id ],
    19822113                                        $setting_params,
    final class WP_Customize_Manager { 
    19852116                                                'user_id' => $args['user_id'],
    19862117                                        )
    19872118                                );
     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                                }
    19882124                        }
    19892125                }
    19902126
  • src/wp-includes/theme.php

    diff --git src/wp-includes/theme.php src/wp-includes/theme.php
    index 66e10b2..606c0db 100644
    function get_theme_starter_content() { 
    17921792                $config = array();
    17931793        }
    17941794
    1795         $core_content = array (
     1795        $core_content = array(
    17961796                'widgets' => array(
    1797                         'text_business_info' => array ( 'text', array (
     1797                        'text_business_info' => array( 'text', array(
    17981798                                'title' => _x( 'Find Us', 'Theme starter content' ),
    1799                                 'text' => join( '', array (
     1799                                'text' => join( '', array(
    18001800                                        '<p><strong>' . _x( 'Address', 'Theme starter content' ) . '</strong><br />',
    18011801                                        _x( '123 Main Street', 'Theme starter content' ) . '<br />' . _x( 'New York, NY 10001', 'Theme starter content' ) . '</p>',
    18021802                                        '<p><strong>' . _x( 'Hours', 'Theme starter content' ) . '</strong><br />',
    18031803                                        _x( 'Monday&mdash;Friday: 9:00AM&ndash;5:00PM', 'Theme starter content' ) . '<br />' . _x( 'Saturday &amp; Sunday: 11:00AM&ndash;3:00PM', 'Theme starter content' ) . '</p>'
    18041804                                ) ),
    18051805                        ) ),
    1806                         'search' => array ( 'search', array (
     1806                        'search' => array( 'search', array(
    18071807                                'title' => _x( 'Site Search', 'Theme starter content' ),
    18081808                        ) ),
    1809                         'text_credits' => array ( 'text', array (
     1809                        'text_credits' => array( 'text', array(
    18101810                                'title' => _x( 'Site Credits', 'Theme starter content' ),
    18111811                                'text' => sprintf( _x( 'This site was created on %s', 'Theme starter content' ), get_date_from_gmt( current_time( 'mysql', 1 ), 'c' ) ),
    18121812                        ) ),
    18131813                ),
    1814                 'nav_menus' => array (
     1814                'nav_menus' => array(
    18151815                        'page_home' => array(
    18161816                                'type' => 'post_type',
    18171817                                'object' => 'page',
    function get_theme_starter_content() { 
    18871887
    18881888        foreach ( $config as $type => $args ) {
    18891889                switch( $type ) {
    1890                         // Use options and theme_mods as-is
     1890                        // Use options and theme_mods as-is.
    18911891                        case 'options' :
    18921892                        case 'theme_mods' :
    18931893                                $content[ $type ] = $config[ $type ];
    18941894                                break;
    18951895
    1896                         // Widgets are an extra level down due to groupings
     1896                        // Widgets are grouped into sidebars.
    18971897                        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 ];
    19021904                                                }
    19031905                                        }
    19041906                                }
    19051907                                break;
    19061908
    1907                         // And nav menus are yet another level down
     1909                        // And nav menu items are grouped into nav menus.
    19081910                        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;
    19131916                                        }
    19141917
    1915                                         $content[ $type ][ $group ]['name'] = $args2['name'];
     1918                                        $content[ $type ][ $nav_menu_location ]['name'] = $nav_menu['name'];
    19161919
    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 ];
    19211925                                                }
    19221926                                        }
    19231927                                }
    19241928                                break;
    19251929
    1926 
    1927                         // Everything else should map at the next level
     1930                        // Everything else should map at the next level.
    19281931                        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 ];
    19321937                                        }
    19331938                                }
    19341939                                break;