| | 974 | // Make an index of all the posts needed and what their slugs are. |
| | 975 | $needed_posts = array(); |
| | 976 | $attachments = $this->prepare_starter_content_attachments( $attachments ); |
| | 977 | foreach ( $attachments as $attachment ) { |
| | 978 | $key = 'attachment:' . $attachment['post_name']; |
| | 979 | $needed_posts[ $key ] = true; |
| | 980 | } |
| | 981 | foreach ( array_keys( $posts ) as $post_symbol ) { |
| | 982 | if ( empty( $posts[ $post_symbol ]['post_name'] ) && empty( $posts[ $post_symbol ]['post_title'] ) ) { |
| | 983 | unset( $posts[ $post_symbol ] ); |
| | 984 | continue; |
| | 985 | } |
| | 986 | if ( empty( $posts[ $post_symbol ]['post_name'] ) ) { |
| | 987 | $posts[ $post_symbol ]['post_name'] = sanitize_title( $posts[ $post_symbol ]['post_title'] ); |
| | 988 | } |
| | 989 | if ( empty( $posts[ $post_symbol ]['post_type'] ) ) { |
| | 990 | $posts[ $post_symbol ]['post_type'] = 'post'; |
| | 991 | } |
| | 992 | $needed_posts[ $posts[ $post_symbol ]['post_type'] . ':' . $posts[ $post_symbol ]['post_name'] ] = true; |
| | 993 | } |
| | 994 | $all_post_slugs = array_merge( |
| | 995 | wp_list_pluck( $attachments, 'post_name' ), |
| | 996 | wp_list_pluck( $posts, 'post_name' ) |
| | 997 | ); |
| | 998 | |
| | 999 | // Re-use auto-draft starter content posts referenced in the current customized state. |
| | 1013 | // Re-use non-auto-draft posts. |
| | 1014 | if ( ! empty( $all_post_slugs ) ) { |
| | 1015 | $existing_posts_query = new WP_Query( array( |
| | 1016 | 'post_name__in' => $all_post_slugs, |
| | 1017 | 'post_status' => array_diff( get_post_stati(), array( 'auto-draft' ) ), |
| | 1018 | 'post_type' => 'any', |
| | 1019 | 'number' => -1, |
| | 1020 | ) ); |
| | 1021 | foreach ( $existing_posts_query->posts as $existing_post ) { |
| | 1022 | $key = $existing_post->post_type . ':' . $existing_post->post_name; |
| | 1023 | if ( isset( $needed_posts[ $key ] ) && ! isset( $existing_starter_content_posts[ $key ] ) ) { |
| | 1024 | $existing_starter_content_posts[ $key ] = $existing_post; |
| | 1025 | } |
| | 1026 | } |
| | 1027 | } |
| | 1028 | |
| 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; |
| 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 | | |
| | 1035 | $file_array = array( |
| | 1036 | 'name' => $attachment['file_name'], |
| | 1037 | ); |
| | 1038 | $file_path = $attachment['file_path']; |
| | 1252 | * Prepare starter content attachments. |
| | 1253 | * |
| | 1254 | * Ensure that the attachments are valid and that they have slugs and file name/path. |
| | 1255 | * |
| | 1256 | * @since 4.7.0 |
| | 1257 | * @access private |
| | 1258 | * |
| | 1259 | * @param array $attachments Attachments. |
| | 1260 | * @return array Prepared attachments. |
| | 1261 | */ |
| | 1262 | protected function prepare_starter_content_attachments( $attachments ) { |
| | 1263 | $prepared_attachments = array(); |
| | 1264 | if ( empty( $attachments ) ) { |
| | 1265 | return $prepared_attachments; |
| | 1266 | } |
| | 1267 | |
| | 1268 | // Such is The WordPress Way. |
| | 1269 | require_once( ABSPATH . 'wp-admin/includes/file.php' ); |
| | 1270 | require_once( ABSPATH . 'wp-admin/includes/media.php' ); |
| | 1271 | require_once( ABSPATH . 'wp-admin/includes/image.php' ); |
| | 1272 | |
| | 1273 | foreach ( $attachments as $symbol => $attachment ) { |
| | 1274 | |
| | 1275 | // A file is required and URLs to files are not currently allowed. |
| | 1276 | if ( empty( $attachment['file'] ) || preg_match( '#^https?://$#', $attachment['file'] ) ) { |
| | 1277 | continue; |
| | 1278 | } |
| | 1279 | |
| | 1280 | $file_path = null; |
| | 1281 | if ( file_exists( $attachment['file'] ) ) { |
| | 1282 | $file_path = $attachment['file']; // Could be absolute path to file in plugin. |
| | 1283 | } elseif ( is_child_theme() && file_exists( get_stylesheet_directory() . '/' . $attachment['file'] ) ) { |
| | 1284 | $file_path = get_stylesheet_directory() . '/' . $attachment['file']; |
| | 1285 | } elseif ( file_exists( get_template_directory() . '/' . $attachment['file'] ) ) { |
| | 1286 | $file_path = get_template_directory() . '/' . $attachment['file']; |
| | 1287 | } else { |
| | 1288 | continue; |
| | 1289 | } |
| | 1290 | $file_name = basename( $attachment['file'] ); |
| | 1291 | |
| | 1292 | // Skip file types that are not recognized. |
| | 1293 | $checked_filetype = wp_check_filetype( $file_name ); |
| | 1294 | if ( empty( $checked_filetype['type'] ) ) { |
| | 1295 | continue; |
| | 1296 | } |
| | 1297 | |
| | 1298 | // Ensure post_name is set since not automatically derived from post_title for new auto-draft posts. |
| | 1299 | if ( empty( $attachment['post_name'] ) ) { |
| | 1300 | if ( ! empty( $attachment['post_title'] ) ) { |
| | 1301 | $attachment['post_name'] = sanitize_title( $attachment['post_title'] ); |
| | 1302 | } else { |
| | 1303 | $attachment['post_name'] = sanitize_title( preg_replace( '/\.\w+$/', '', $file_name ) ); |
| | 1304 | } |
| | 1305 | } |
| | 1306 | |
| | 1307 | $attachment['file_name'] = $file_name; |
| | 1308 | $attachment['file_path'] = $file_path; |
| | 1309 | $prepared_attachments[ $symbol ] = $attachment; |
| | 1310 | } |
| | 1311 | return $prepared_attachments; |
| | 1312 | } |
| | 1313 | |
| | 1314 | /** |