Ticket #38615: 38615.12.diff
File 38615.12.diff, 12.9 KB (added by , 8 years ago) |
---|
-
src/wp-content/themes/twentyseventeen/functions.php
diff --git src/wp-content/themes/twentyseventeen/functions.php src/wp-content/themes/twentyseventeen/functions.php index 1bcb95f..19770b3 100644
function twentyseventeen_setup() { 123 123 124 124 'posts' => array( 125 125 'home', 126 'about', 127 'contact', 128 'blog', 129 'homepage-section', 126 'about' => array( 127 'thumbnail' => '{{featured-image-2}}', 128 ), 129 'contact' => array( 130 'thumbnail' => '{{featured-image-1}}', 131 ), 132 'blog' => array( 133 'thumbnail' => '{{featured-image-3}}', 134 ), 135 'homepage-section' => array( 136 'thumbnail' => '{{featured-image-1}}', 137 ), 138 ), 139 140 'attachments' => array( 141 'featured-image-1' => array( 142 'post_title' => _x( 'Espresso', 'Theme starter content' ), 143 'file' => 'assets/images/espresso.jpg', 144 ), 145 'featured-image-2' => array( 146 'post_title' => _x( 'Sandwich', 'Theme starter content' ), 147 'file' => 'assets/images/sandwich.jpg', 148 ), 149 'featured-image-3' => array( 150 'post_title' => _x( 'Coffee', 'Theme starter content' ), 151 'file' => 'assets/images/coffee.jpg', 152 ), 130 153 ), 131 154 132 155 'options' => array( -
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 439e2b5..e61a2a8 100644
final class WP_Customize_Manager { 916 916 } 917 917 918 918 $sidebars_widgets = isset( $starter_content['widgets'] ) && ! empty( $this->widgets ) ? $starter_content['widgets'] : array(); 919 $attachments = isset( $starter_content['attachments'] ) && ! empty( $this->nav_menus ) ? $starter_content['attachments'] : array(); 919 920 $posts = isset( $starter_content['posts'] ) && ! empty( $this->nav_menus ) ? $starter_content['posts'] : array(); 920 921 $options = isset( $starter_content['options'] ) ? $starter_content['options'] : array(); 921 922 $nav_menus = isset( $starter_content['nav_menus'] ) && ! empty( $this->nav_menus ) ? $starter_content['nav_menus'] : array(); … … final class WP_Customize_Manager { 965 966 } 966 967 } 967 968 968 // Posts & pages. 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; 969 $starter_content_auto_draft_post_ids = array(); 970 if ( ! empty( $changeset_data['nav_menus_created_posts']['value'] ) ) { 971 $starter_content_auto_draft_post_ids = array_merge( $starter_content_auto_draft_post_ids, $changeset_data['nav_menus_created_posts']['value'] ); 972 } 973 974 $existing_starter_content_posts = array(); 975 if ( ! empty( $starter_content_auto_draft_post_ids ) ) { 976 $existing_posts_query = new WP_Query( array( 977 'post__in' => $starter_content_auto_draft_post_ids, 978 'post_status' => 'auto-draft', 979 'post_type' => 'any', 980 'number' => -1, 981 ) ); 982 foreach ( $existing_posts_query->posts as $existing_post ) { 983 $existing_starter_content_posts[ $existing_post->post_type . ':' . $existing_post->post_name ] = $existing_post; 984 } 985 } 986 987 // Attachments are technically posts but handled differently. 988 if ( ! empty( $attachments ) ) { 989 // Such is The WordPress Way. 990 require_once( ABSPATH . 'wp-admin/includes/file.php' ); 991 require_once( ABSPATH . 'wp-admin/includes/media.php' ); 992 require_once( ABSPATH . 'wp-admin/includes/image.php' ); 993 994 $attachment_ids = array(); 995 996 foreach ( $attachments as $symbol => $attachment ) { 997 998 // A file is required and URLs to files are not currently allowed. 999 if ( empty( $attachment['file'] ) || preg_match( '#^https?://$#', $attachment['file'] ) ) { 1000 continue; 985 1001 } 1002 1003 $file_array = array(); 1004 $file_path = null; 1005 if ( file_exists( $attachment['file'] ) ) { 1006 $file_path = $attachment['file']; // Could be absolute path to file in plugin. 1007 } elseif ( is_child_theme() && file_exists( get_stylesheet_directory() . '/' . $attachment['file'] ) ) { 1008 $file_path = get_stylesheet_directory() . '/' . $attachment['file']; 1009 } elseif ( file_exists( get_template_directory() . '/' . $attachment['file'] ) ) { 1010 $file_path = get_template_directory() . '/' . $attachment['file']; 1011 } else { 1012 continue; 1013 } 1014 $file_array['name'] = basename( $attachment['file'] ); 1015 1016 // Skip file types that are not recognized. 1017 $checked_filetype = wp_check_filetype( $file_array['name'] ); 1018 if ( empty( $checked_filetype['type'] ) ) { 1019 continue; 1020 } 1021 1022 // Ensure post_name is set since not automatically derived from post_title for new auto-draft posts. 1023 if ( empty( $attachment['post_name'] ) ) { 1024 if ( ! empty( $attachment['post_title'] ) ) { 1025 $attachment['post_name'] = sanitize_title( $attachment['post_title'] ); 1026 } else { 1027 $attachment['post_name'] = sanitize_title( preg_replace( '/\.\w+$/', '', $file_array['name'] ) ); 1028 } 1029 } 1030 1031 $attachment_id = null; 1032 $attached_file = null; 1033 if ( isset( $existing_starter_content_posts[ 'attachment:' . $attachment['post_name'] ] ) ) { 1034 $attachment_post = $existing_starter_content_posts[ 'attachment:' . $attachment['post_name'] ]; 1035 $attachment_id = $attachment_post->ID; 1036 $attached_file = get_attached_file( $attachment_id ); 1037 if ( empty( $attached_file ) || ! file_exists( $attached_file ) ) { 1038 $attachment_id = null; 1039 $attached_file = null; 1040 } elseif ( $this->get_stylesheet() !== get_post_meta( $attachment_post->ID, '_starter_content_theme', true ) ) { 1041 1042 // Re-generate attachment metadata since it was previously generated for a different theme. 1043 $metadata = wp_generate_attachment_metadata( $attachment_post->ID, $attached_file ); 1044 wp_update_attachment_metadata( $attachment_id, $metadata ); 1045 update_post_meta( $attachment_id, '_starter_content_theme', $this->get_stylesheet() ); 1046 } 1047 } 1048 1049 // Insert the attachment auto-draft because it doesn't yet exist or the attached file is gone. 1050 if ( ! $attachment_id ) { 1051 1052 // Copy file to temp location so that original file won't get deleted from theme after sideloading. 1053 $temp_file_name = wp_tempnam( basename( $file_path ) ); 1054 if ( $temp_file_name && copy( $file_path, $temp_file_name ) ) { 1055 $file_array['tmp_name'] = $temp_file_name; 1056 } 1057 if ( empty( $file_array['tmp_name'] ) ) { 1058 continue; 1059 } 1060 1061 $attachment_post_data = array_merge( 1062 wp_array_slice_assoc( $attachment, array( 'post_title', 'post_content', 'post_excerpt', 'post_name' ) ), 1063 array( 1064 'post_status' => 'auto-draft', // So attachment will be garbage collected in a week if changeset is never published. 1065 ) 1066 ); 1067 1068 $attachment_id = media_handle_sideload( $file_array, 0, null, $attachment_post_data ); 1069 if ( is_wp_error( $attachment_id ) ) { 1070 continue; 1071 } 1072 update_post_meta( $attachment_id, '_starter_content_theme', $this->get_stylesheet() ); 1073 } 1074 1075 $attachment_ids[ $symbol ] = $attachment_id; 1076 $starter_content_auto_draft_post_ids = array_merge( $starter_content_auto_draft_post_ids, array_values( $attachment_ids ) ); 986 1077 } 1078 } 987 1079 1080 // Posts & pages. 1081 if ( ! empty( $posts ) ) { 988 1082 foreach ( array_keys( $posts ) as $post_symbol ) { 989 1083 if ( empty( $posts[ $post_symbol ]['post_type'] ) ) { 990 1084 continue; … … final class WP_Customize_Manager { 999 1093 } 1000 1094 1001 1095 // 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 ]['ID'] = $existing_ posts[ $post_type . ':' . $post_name ]->ID;1096 if ( isset( $existing_starter_content_posts[ $post_type . ':' . $post_name ] ) ) { 1097 $posts[ $post_symbol ]['ID'] = $existing_starter_content_posts[ $post_type . ':' . $post_name ]->ID; 1004 1098 continue; 1005 1099 } 1006 1100 1101 // Translate the featured image symbol 1102 if ( ! empty( $posts[ $post_symbol ]['thumbnail'] ) 1103 && preg_match( '/^{{(?P<symbol>.+)}}$/', $posts[ $post_symbol ]['thumbnail'], $matches ) 1104 && isset( $attachment_ids[ $matches['symbol'] ] ) ) { 1105 $posts[ $post_symbol ]['meta_input']['_thumbnail_id'] = $attachment_ids[ $matches['symbol'] ]; 1106 } 1107 1108 if ( ! empty( $posts[ $post_symbol ]['template'] ) ) { 1109 $posts[ $post_symbol ]['meta_input']['_wp_page_template'] = $posts[ $post_symbol ]['template']; 1110 } 1111 1007 1112 $r = $this->nav_menus->insert_auto_draft_post( $posts[ $post_symbol ] ); 1008 1113 if ( $r instanceof WP_Post ) { 1009 1114 $posts[ $post_symbol ]['ID'] = $r->ID; 1010 1115 } 1011 1116 } 1012 1117 1013 // The nav_menus_created_posts setting is why nav_menus component is dependency for adding posts. 1118 $starter_content_auto_draft_post_ids = array_merge( $starter_content_auto_draft_post_ids, wp_list_pluck( $posts, 'ID' ) ); 1119 } 1120 1121 // The nav_menus_created_posts setting is why nav_menus component is dependency for adding posts. 1122 if ( ! empty( $this->nav_menus ) && ! empty( $starter_content_auto_draft_post_ids ) ) { 1014 1123 $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, array_values( $nav_menus_created_posts ) ); 1018 $this->pending_starter_content_settings_ids[] = $setting_id; 1019 } 1124 $this->set_post_value( $setting_id, array_unique( array_values( $starter_content_auto_draft_post_ids ) ) ); 1125 $this->pending_starter_content_settings_ids[] = $setting_id; 1020 1126 } 1021 1127 1022 1128 // Nav menus. -
src/wp-includes/class-wp-customize-nav-menus.php
diff --git src/wp-includes/class-wp-customize-nav-menus.php src/wp-includes/class-wp-customize-nav-menus.php index 7ce9e18..1305a14 100644
final class WP_Customize_Nav_Menus { 1191 1191 $post_ids = $setting->post_value(); 1192 1192 if ( ! empty( $post_ids ) ) { 1193 1193 foreach ( $post_ids as $post_id ) { 1194 $target_status = 'attachment' === get_post_type( $post_id ) ? 'inherit' : 'publish'; 1195 1194 1196 // Note that wp_publish_post() cannot be used because unique slugs need to be assigned. 1195 wp_update_post( array( 'ID' => $post_id, 'post_status' => 'publish') );1197 wp_update_post( array( 'ID' => $post_id, 'post_status' => $target_status ) ); 1196 1198 } 1197 1199 } 1198 1200 } -
src/wp-includes/post.php
diff --git src/wp-includes/post.php src/wp-includes/post.php index d3c68ca..620d1e4 100644
function wp_insert_post( $postarr, $wp_error = false ) { 3058 3058 } 3059 3059 3060 3060 $post_status = empty( $postarr['post_status'] ) ? 'draft' : $postarr['post_status']; 3061 if ( 'attachment' === $post_type && ! in_array( $post_status, array( 'inherit', 'private', 'trash' )) ) {3061 if ( 'attachment' === $post_type && ! in_array( $post_status, array( 'inherit', 'private', 'trash', 'auto-draft' ), true ) ) { 3062 3062 $post_status = 'inherit'; 3063 3063 } 3064 3064 -
src/wp-includes/theme.php
diff --git src/wp-includes/theme.php src/wp-includes/theme.php index 13bf9ca..8e2690f 100644
function get_theme_starter_content() { 2012 2012 } 2013 2013 break; 2014 2014 2015 // Everything else should map at the next level. 2016 default : 2017 foreach( $config[ $type ] as $i => $item ) { 2018 if ( is_array( $item ) ) { 2019 $content[ $type ][ $i ] = $item; 2015 // Attachments are posts but have special treatment. 2016 case 'attachments' : 2017 foreach ( $config[ $type ] as $id => $item ) { 2018 if ( ! empty( $item['file'] ) ) { 2019 $content[ $type ][ $id ] = $item; 2020 } 2021 } 2022 break; 2023 2024 // All that's left now are posts (besides attachments). Not a default case for the sake of clarity and future work. 2025 case 'posts' : 2026 foreach ( $config[ $type ] as $id => $item ) { 2027 if ( is_array( $item ) && ! empty( $core_content[ $type ] ) && ! empty( $core_content[ $type ][ $id ] ) ) { 2028 $content[ $type ][ $id ] = $core_content[ $type ][ $id ]; 2029 2030 // Extra fields - currently locked down because they require special treatment. 2031 foreach ( $item as $key => $value ) { 2032 if ( 'thumbnail' === $key || 'template' === $key ) { 2033 $content[ $type ][ $id ][ $key ] = $value; 2034 } 2035 } 2020 2036 } elseif ( is_string( $item ) && ! empty( $core_content[ $type ] ) && ! empty( $core_content[ $type ][ $item ] ) ) { 2021 2037 $content[ $type ][ $item ] = $core_content[ $type ][ $item ]; 2022 2038 }