+ * Retrieve any registered editor stylesheets
+ *
+ * @since 4.0.0
+ *
+ * @global array $editor_styles Registered editor stylesheets
+ *
+ * @return array If registered, a list of editor stylesheet URLs.
+ */
+function get_editor_stylesheets() {
+ $stylesheets = array();
+ // load editor_style.css if the current theme supports it
+ if ( ! empty( $GLOBALS['editor_styles'] ) && is_array( $GLOBALS['editor_styles'] ) ) {
+ $editor_styles = $GLOBALS['editor_styles'];
+
+ $editor_styles = array_unique( array_filter( $editor_styles ) );
+ $style_uri = get_stylesheet_directory_uri();
+ $style_dir = get_stylesheet_directory();
+
+ // Support externally referenced styles (like, say, fonts).
+ foreach ( $editor_styles as $key => $file ) {
+ if ( preg_match( '~^(https?:)?//~', $file ) ) {
+ $stylesheets[] = esc_url_raw( $file );
+ unset( $editor_styles[ $key ] );
+ }
+ }
+
+ // Look in a parent theme first, that way child theme CSS overrides.
+ if ( is_child_theme() ) {
+ $template_uri = get_template_directory_uri();
+ $template_dir = get_template_directory();
+
+ foreach ( $editor_styles as $key => $file ) {
+ if ( $file && file_exists( "$template_dir/$file" ) ) {
+ $stylesheets[] = "$template_uri/$file";
+ }
+ }
+ }
+
+ foreach ( $editor_styles as $file ) {
+ if ( $file && file_exists( "$style_dir/$file" ) ) {
+ $stylesheets[] = "$style_uri/$file";
+ }
+ }
+ }
+
+ /**
+ * Filters the array of stylesheets applied to the editor.
+ *
+ * @since 4.3.0
+ *
+ * @param array $stylesheets Array of stylesheets to be applied to the editor.
+ */
+ return apply_filters( 'editor_stylesheets', $stylesheets );
+}
+
+/**
+ * Expand a theme's starter content configuration using core-provided data.
+ *
+ * @since 4.7.0
+ *
+ * @return array Array of starter content.
+ */
+function get_theme_starter_content() {
+ $theme_support = get_theme_support( 'starter-content' );
+ if ( is_array( $theme_support ) && ! empty( $theme_support[0] ) && is_array( $theme_support[0] ) ) {
+ $config = $theme_support[0];
+ } else {
+ $config = array();
+ }
+
+ $core_content = array(
+ 'widgets' => array(
+ 'text_business_info' => array( 'text', array(
+ 'title' => _x( 'Find Us', 'Theme starter content' ),
+ 'text' => join( '', array(
+ '<p><strong>' . _x( 'Address', 'Theme starter content' ) . '</strong><br />',
+ _x( '123 Main Street', 'Theme starter content' ) . '<br />' . _x( 'New York, NY 10001', 'Theme starter content' ) . '</p>',
+ '<p><strong>' . _x( 'Hours', 'Theme starter content' ) . '</strong><br />',
+ _x( 'Monday—Friday: 9:00AM–5:00PM', 'Theme starter content' ) . '<br />' . _x( 'Saturday & Sunday: 11:00AM–3:00PM', 'Theme starter content' ) . '</p>'
+ ) ),
+ ) ),
+ 'text_about' => array( 'text', array(
+ 'title' => _x( 'About This Site', 'Theme starter content' ),
+ 'text' => _x( 'This may be a good place to introduce yourself and your site or include some credits.', 'Theme starter content' ),
+ ) ),
+ 'archives' => array( 'archives', array(
+ 'title' => _x( 'Archives', 'Theme starter content' ),
+ ) ),
+ 'calendar' => array( 'calendar', array(
+ 'title' => _x( 'Calendar', 'Theme starter content' ),
+ ) ),
+ 'categories' => array( 'categories', array(
+ 'title' => _x( 'Categories', 'Theme starter content' ),
+ ) ),
+ 'meta' => array( 'meta', array(
+ 'title' => _x( 'Meta', 'Theme starter content' ),
+ ) ),
+ 'recent-comments' => array( 'recent-comments', array(
+ 'title' => _x( 'Recent Comments', 'Theme starter content' ),
+ ) ),
+ 'recent-posts' => array( 'recent-posts', array(
+ 'title' => _x( 'Recent Posts', 'Theme starter content' ),
+ ) ),
+ 'search' => array( 'search', array(
+ 'title' => _x( 'Search', 'Theme starter content' ),
+ ) ),
+ ),
+ 'nav_menus' => array(
+ 'link_home' => array(
+ 'type' => 'custom',
+ 'title' => _x( 'Home', 'Theme starter content' ),
+ 'url' => home_url(),
+ ),
+ 'page_home' => array( // Deprecated in favor of home_link.
+ 'type' => 'post_type',
+ 'object' => 'page',
+ 'object_id' => '{{home}}',
+ ),
+ 'page_about' => array(
+ 'type' => 'post_type',
+ 'object' => 'page',
+ 'object_id' => '{{about}}',
+ ),
+ 'page_blog' => array(
+ 'type' => 'post_type',
+ 'object' => 'page',
+ 'object_id' => '{{blog}}',
+ ),
+ 'page_news' => array(
+ 'type' => 'post_type',
+ 'object' => 'page',
+ 'object_id' => '{{news}}',
+ ),
+ 'page_contact' => array(
+ 'type' => 'post_type',
+ 'object' => 'page',
+ 'object_id' => '{{contact}}',
+ ),
+
+ 'link_email' => array(
+ 'title' => _x( 'Email', 'Theme starter content' ),
+ 'url' => 'mailto:wordpress@example.com',
+ ),
+ 'link_facebook' => array(
+ 'title' => _x( 'Facebook', 'Theme starter content' ),
+ 'url' => 'https://www.facebook.com/wordpress',
+ ),
+ 'link_foursquare' => array(
+ 'title' => _x( 'Foursquare', 'Theme starter content' ),
+ 'url' => 'https://foursquare.com/',
+ ),
+ 'link_github' => array(
+ 'title' => _x( 'GitHub', 'Theme starter content' ),
+ 'url' => 'https://github.com/wordpress/',
+ ),
+ 'link_instagram' => array(
+ 'title' => _x( 'Instagram', 'Theme starter content' ),
+ 'url' => 'https://www.instagram.com/explore/tags/wordcamp/',
+ ),
+ 'link_linkedin' => array(
+ 'title' => _x( 'LinkedIn', 'Theme starter content' ),
+ 'url' => 'https://www.linkedin.com/company/1089783',
+ ),
+ 'link_pinterest' => array(
+ 'title' => _x( 'Pinterest', 'Theme starter content' ),
+ 'url' => 'https://www.pinterest.com/',
+ ),
+ 'link_twitter' => array(
+ 'title' => _x( 'Twitter', 'Theme starter content' ),
+ 'url' => 'https://twitter.com/wordpress',
+ ),
+ 'link_yelp' => array(
+ 'title' => _x( 'Yelp', 'Theme starter content' ),
+ 'url' => 'https://www.yelp.com',
+ ),
+ 'link_youtube' => array(
+ 'title' => _x( 'YouTube', 'Theme starter content' ),
+ 'url' => 'https://www.youtube.com/channel/UCdof4Ju7amm1chz1gi1T2ZA',
+ ),
+ ),
+ 'posts' => array(
+ 'home' => array(
+ 'post_type' => 'page',
+ 'post_title' => _x( 'Home', 'Theme starter content' ),
+ 'post_content' => _x( 'Welcome to your site! This is your homepage, which is what most visitors will see when they come to your site for the first time.', 'Theme starter content' ),
+ ),
+ 'about' => array(
+ 'post_type' => 'page',
+ 'post_title' => _x( 'About', 'Theme starter content' ),
+ 'post_content' => _x( 'You might be an artist who would like to introduce yourself and your work here or maybe you’re a business with a mission to describe.', 'Theme starter content' ),
+ ),
+ 'contact' => array(
+ 'post_type' => 'page',
+ 'post_title' => _x( 'Contact', 'Theme starter content' ),
+ 'post_content' => _x( 'This is a page with some basic contact information, such as an address and phone number. You might also try a plugin to add a contact form.', 'Theme starter content' ),
+ ),
+ 'blog' => array(
+ 'post_type' => 'page',
+ 'post_title' => _x( 'Blog', 'Theme starter content' ),
+ ),
+ 'news' => array(
+ 'post_type' => 'page',
+ 'post_title' => _x( 'News', 'Theme starter content' ),
+ ),
+
+ 'homepage-section' => array(
+ 'post_type' => 'page',
+ 'post_title' => _x( 'A homepage section', 'Theme starter content' ),
+ 'post_content' => _x( 'This is an example of a homepage section. Homepage sections can be any page other than the homepage itself, including the page that shows your latest blog posts.', 'Theme starter content' ),
+ ),
+ ),
+ );
+
+ $content = array();
+
+ foreach ( $config as $type => $args ) {
+ switch( $type ) {
+ // Use options and theme_mods as-is.
+ case 'options' :
+ case 'theme_mods' :
+ $content[ $type ] = $config[ $type ];
+ break;
+
+ // Widgets are grouped into sidebars.
+ case 'widgets' :
+ foreach ( $config[ $type ] as $sidebar_id => $widgets ) {
+ foreach ( $widgets as $id => $widget ) {
+ if ( is_array( $widget ) ) {
+
+ // Item extends core content.
+ if ( ! empty( $core_content[ $type ][ $id ] ) ) {
+ $widget = array(
+ $core_content[ $type ][ $id ][0],
+ array_merge( $core_content[ $type ][ $id ][1], $widget ),
+ );
+ }
+
+ $content[ $type ][ $sidebar_id ][] = $widget;
+ } elseif ( is_string( $widget ) && ! empty( $core_content[ $type ] ) && ! empty( $core_content[ $type ][ $widget ] ) ) {
+ $content[ $type ][ $sidebar_id ][] = $core_content[ $type ][ $widget ];
+ }
+ }
+ }
+ break;
+
+ // And nav menu items are grouped into nav menus.
+ case 'nav_menus' :
+ foreach ( $config[ $type ] as $nav_menu_location => $nav_menu ) {
+
+ // Ensure nav menus get a name.
+ if ( empty( $nav_menu['name'] ) ) {
+ $nav_menu['name'] = $nav_menu_location;
+ }
+
+ $content[ $type ][ $nav_menu_location ]['name'] = $nav_menu['name'];
+
+ foreach ( $nav_menu['items'] as $id => $nav_menu_item ) {
+ if ( is_array( $nav_menu_item ) ) {
+
+ // Item extends core content.
+ if ( ! empty( $core_content[ $type ][ $id ] ) ) {
+ $nav_menu_item = array_merge( $core_content[ $type ][ $id ], $nav_menu_item );
+ }
+
+ $content[ $type ][ $nav_menu_location ]['items'][] = $nav_menu_item;
+ } elseif ( is_string( $nav_menu_item ) && ! empty( $core_content[ $type ] ) && ! empty( $core_content[ $type ][ $nav_menu_item ] ) ) {
+ $content[ $type ][ $nav_menu_location ]['items'][] = $core_content[ $type ][ $nav_menu_item ];
+ }
+ }
+ }
+ break;
+
+ // Attachments are posts but have special treatment.
+ case 'attachments' :
+ foreach ( $config[ $type ] as $id => $item ) {
+ if ( ! empty( $item['file'] ) ) {
+ $content[ $type ][ $id ] = $item;
+ }
+ }
+ break;
+
+ // All that's left now are posts (besides attachments). Not a default case for the sake of clarity and future work.
+ case 'posts' :
+ foreach ( $config[ $type ] as $id => $item ) {
+ if ( is_array( $item ) ) {
+
+ // Item extends core content.
+ if ( ! empty( $core_content[ $type ][ $id ] ) ) {
+ $item = array_merge( $core_content[ $type ][ $id ], $item );
+ }
+
+ // Enforce a subset of fields.
+ $content[ $type ][ $id ] = wp_array_slice_assoc(
+ $item,
+ array(
+ 'post_type',
+ 'post_title',
+ 'post_excerpt',
+ 'post_name',
+ 'post_content',
+ 'menu_order',
+ 'comment_status',
+ 'thumbnail',
+ 'template',
+ )
+ );
+ } elseif ( is_string( $item ) && ! empty( $core_content[ $type ][ $item ] ) ) {
+ $content[ $type ][ $item ] = $core_content[ $type ][ $item ];
+ }
+ }
+ break;
+ }
+ }
+
+ /**
+ * Filters the expanded array of starter content.
+ *
+ * @since 4.7.0
+ *
+ * @param array $content Array of starter content.
+ * @param array $config Array of theme-specific starter content configuration.
+ */
+ return apply_filters( 'get_theme_starter_content', $content, $config );
+}
+
+/**
+ * Registers theme support for a given feature.