| 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 | /** |