# Upload Attachment

- media-upload.php
	- if ( $_POST['html-upload'] )
		- media_handle_upload()
			- get time from parent post
			- wp_handle_upload
				- apply_filters( wp_handle_upload_prefilter )
				- test form name parity
				- test upload errors from PHP
				- test file size limiations
				- test file properly uploaded to temp location
				- check file mime type
					- wp_check_filetype_and_ext
					- check user permissions on file type upload
						- current_user_can
				- check valid uploads dir
					- wp_upload_dir
						- setup uploads path
						- setup uploads url
						- jingle jangle for multisite
						- if ( get_option( uploads_use_yearmonth_folders ) )
							- if time not supplied, get time *** PLEASE NOTE ***
							- build upload dir path based on time
						- apply_filters ( upload_dir )
						- wp_mkdir_p
							- try to make target location
						- return uploads dir path
				- wp_unique_filename
					- sanitize_title
					- if ( name not unique )
						- increment number until unique name is arrived at
				- move file in to uploads dir
				- if ( multisite )
					delete_transient ( dirsize_cache )
				apply_filters ( wp_handle_upload ) 
			- wp_insert_attachment
				- wp_parse_args
				- sanitize_post
				- set item category
				- sanitize_title
				- wp_unique_post_slug
				- set post time & modified
				- set comment status, parent, author, etc...
				- stripslashes_deep
				- if ( update )
					- wpdb->update
				- else
					- try to use suggested id (import functionality)
					- wpdb->insert
				- set title if not already set
				- wp_set_post_categories
				- update_attached_file
				- clean_post_cache
				- if ( no parent )
					- add_post_meta ( _wp_attachment_temp_parent )
				- if ( update )
					do_action ( edit_attachment )
				- else
					do_action ( add_attachment )
			- if ( no error ) 
				- wp_update_attachment_metadata ( wp_generate_attachment_metadata )
	- id ( $_GET['upload-page-form'] )
		- media_upload_form_handler @see #Edit Attachment for rabbit hole
	- show upload form
				
# Edit Attachment

- media.php: action=editattachment
	- check_admin_referer
	- current_user_can
		- die on invalid permissions
	- media_upload_form_handler
		- check_admin_referer
		- get $send_id if present
		- fill attachment data from $_POST
		- apply_filters ( attachment_fields_to_save )
		- check for image alt-text
			- update alt-text
			- update_post_meta ( _wp_attachment_image_alt )
		- wp_update_post
		- foreach ( get_attachment_taxonomies )
			- wp_set_object_terms
		- if ( insert_gallery )
			- output gallery update js
		- if ( $send_id ) 
			- stripslashes_deep ( $_POST['attachments'][$send_id] )
			- build link to return to editor
			- apply_filters ( media_send_to_editor )
			- return media_send_to_editor ( $html )
	- determine redirect url & error messages
		- wp_get_original_referer
	- wp_redirect

# Save Post

- post.php: action=editpost
	- check_admin_referer
	- edit_post
		- get_post_type_object
		- current_user_can
			- die on invalid permissions
		- if ( autosave )
			- get_post
			- check last update
			- return if too soon
		- _wp_translate_postdata
		- handle visibility
		- iterate over $post_data['meta']
			- update_meta
		- iterate over $post_data['deletemeta']
			- delete_meta
		- add_meta
		- update_post_meta
		- wp_update_post
			- wp_get_single_post
			- add_magic_quotes
			- if ( is attachment )
				- wp_insert_attachment
			- else
				- wp_insert_post
					- wp_parse_args
					- sanitize_post
					- get_post_field (post_status)
					- assign default category if none provided
					- if (update)
						- get existing post state
					- sanitize_title
					- set post time
					- set comment satus
					- make sure post is not its own parent
					- wp_unique_post_slug
					- apply_filters ( wp_insert_post_data )
					- stripslashes_deep ( postdata )
					- if (update)
						- do_action ( pre_post_update )
							- triggers
								- wp_save_post_revision
									- check for existing post
									- check for revision support
									- _wp_put_post_revision
										- _wp_post_revision_fields
											- apply_filters ( _wp_post_revision_fields )
										- add_magic_quotes
										- wp_insert_post
										- do_action _wp_put_post_revision
									- wp_get_post_revisions ( post_id )
									- prune out of date revisions
						- wpdb->update
					- else
						- check for existing id, use it if available (part of import process)
						- wpdb->insert
					- wpdb->update - update post_name for just inserted/updated post
					- if (is_object_in_taxonomy ( category ))
						- wp_set_post_categories
					- if ( isset (tags_input) && is_object_in_taxonomy ( post_tag ))
						- wp_set_post_tags
					- handle custom taxonomies
						- get_taxonomy
						- wp_set_post_terms
					- get post guid
					- clean_page_/post_cache
					- wpdb->update ( post_guid )
					- get_post
					- check valid page template
						- get_page_templates
						- update_post_meta ( _wp_page_template )
					- wp_transition_post_status
					- if ( update )
						- do_action( edit_post )
						- do_action( post_updated )
					- do_action ( save_post )
					- do_action ( wp_insert_post )
					- return 
		- _relocate_children
		- _fix_attachment_links
		- wp_set_post_lock
		- stick_/unstick_post
		- return
	- redirect_post
	- exit