+function wp_upload_dir( $time = null, $create_dir = true, $refresh_cache = false ) {
+ static $cache = array();
+
+ $key = sprintf( '%d-%s', get_current_blog_id(), (string) $time );
+
+ if ( $refresh_cache || empty( $cache[ $key ] ) ) {
+ $cache[ $key ] = _wp_upload_dir( $time );
+ }
+
+ /**
+ * Filter the uploads directory data.
+ *
+ * @since 2.0.0
+ *
+ * @param array $uploads Array of upload directory data with keys of 'path',
+ * 'url', 'subdir, 'basedir', and 'error'.
+ */
+ $uploads = apply_filters( 'upload_dir', $cache[ $key ] );
+
+ if ( $create_dir ) {
+ $path = $uploads['path'];
+ $tested_paths = wp_cache_get( 'upload_dir_tested_paths' );
+
+ if ( ! is_array( $tested_paths ) ) {
+ $tested_paths = array();
+ }
+
+ if ( ! in_array( $path, $tested_paths, true ) ) {
+ if ( ! wp_mkdir_p( $path ) ) {
+ if ( 0 === strpos( $uploads['basedir'], ABSPATH ) ) {
+ $error_path = str_replace( ABSPATH, '', $uploads['basedir'] ) . $uploads['subdir'];
+ } else {
+ $error_path = basename( $uploads['basedir'] ) . $uploads['subdir'];
+ }
+
+ $uploads['error'] = sprintf( __( 'Unable to create directory %s. Is its parent directory writable by the server?' ), esc_html( $error_path ) );
+ } else {
+ $tested_paths[] = $path;
+ wp_cache_set( 'upload_dir_tested_paths', $tested_paths );
+ }
+ }
+ }
+
+ return $uploads;
+}
+
+/**
+ * A non-filtered, non-cached version of wp_upload_dir() that doesn't check the path.
+ *
+ * @access private
+ *
+ * @param string $time Optional. Time formatted in 'yyyy/mm'. Default null.
+ * @return array See wp_upload_dir()
+ */
+function _wp_upload_dir( $time = null ) {