WordPress Version: 3.9
/**
* Insert an attachment.
*
* If you set the 'ID' in the $object parameter, it will mean that you are
* updating and attempt to update the attachment. You can also set the
* attachment name or title by setting the key 'post_name' or 'post_title'.
*
* You can set the dates for the attachment manually by setting the 'post_date'
* and 'post_date_gmt' keys' values.
*
* By default, the comments will use the default settings for whether the
* comments are allowed. You can close them manually or keep them open by
* setting the value for the 'comment_status' key.
*
* The $object parameter can have the following:
* 'post_status' - Default is 'draft'. Can not be overridden, set the same as parent post.
* 'post_type' - Default is 'post', will be set to attachment. Can not override.
* 'post_author' - Default is current user ID. The ID of the user, who added the attachment.
* 'ping_status' - Default is the value in default ping status option. Whether the attachment
* can accept pings.
* 'post_parent' - Default is 0. Can use $parent parameter or set this for the post it belongs
* to, if any.
* 'menu_order' - Default is 0. The order it is displayed.
* 'to_ping' - Whether to ping.
* 'pinged' - Default is empty string.
* 'post_password' - Default is empty string. The password to access the attachment.
* 'guid' - Global Unique ID for referencing the attachment.
* 'post_content_filtered' - Attachment post content filtered.
* 'post_excerpt' - Attachment excerpt.
*
* @since 2.0.0
* @uses $wpdb
*
* @param string|array $object Arguments to override defaults.
* @param string $file Optional filename.
* @param int $parent Parent post ID.
* @return int Attachment ID.
*/
function wp_insert_attachment($object, $file = false, $parent = 0)
{
global $wpdb;
$user_id = get_current_user_id();
$defaults = array('post_status' => 'inherit', 'post_type' => 'post', 'post_author' => $user_id, 'ping_status' => get_option('default_ping_status'), 'post_parent' => 0, 'post_title' => '', 'menu_order' => 0, 'to_ping' => '', 'pinged' => '', 'post_password' => '', 'post_content' => '', 'guid' => '', 'post_content_filtered' => '', 'post_excerpt' => '', 'import_id' => 0, 'context' => '');
$object = wp_parse_args($object, $defaults);
if (!empty($parent)) {
$object['post_parent'] = $parent;
}
unset($object['filter']);
$object = sanitize_post($object, 'db');
// export array as variables
extract($object, EXTR_SKIP);
if (empty($post_author)) {
$post_author = $user_id;
}
$post_type = 'attachment';
if (!in_array($post_status, array('inherit', 'private'))) {
$post_status = 'inherit';
}
if (!empty($post_category)) {
$post_category = array_filter($post_category);
}
// Filter out empty terms
// Make sure we set a valid category.
if (empty($post_category) || 0 == count($post_category) || !is_array($post_category)) {
$post_category = array();
}
// Are we updating or creating?
if (!empty($ID)) {
$update = true;
$post_ID = (int) $ID;
} else {
$update = false;
$post_ID = 0;
}
// Create a valid post name.
if (empty($post_name)) {
$post_name = sanitize_title($post_title);
} else {
$post_name = sanitize_title($post_name);
}
// expected_slashed ($post_name)
$post_name = wp_unique_post_slug($post_name, $post_ID, $post_status, $post_type, $post_parent);
if (empty($post_date)) {
$post_date = current_time('mysql');
}
if (empty($post_date_gmt)) {
$post_date_gmt = current_time('mysql', 1);
}
if (empty($post_modified)) {
$post_modified = $post_date;
}
if (empty($post_modified_gmt)) {
$post_modified_gmt = $post_date_gmt;
}
if (empty($comment_status)) {
if ($update) {
$comment_status = 'closed';
} else {
$comment_status = get_option('default_comment_status');
}
}
if (empty($ping_status)) {
$ping_status = get_option('default_ping_status');
}
if (isset($to_ping)) {
$to_ping = preg_replace('|\s+|', "\n", $to_ping);
} else {
$to_ping = '';
}
if (isset($post_parent)) {
$post_parent = (int) $post_parent;
} else {
$post_parent = 0;
}
if (isset($menu_order)) {
$menu_order = (int) $menu_order;
} else {
$menu_order = 0;
}
if (!isset($post_password)) {
$post_password = '';
}
if (!isset($pinged)) {
$pinged = '';
}
// expected_slashed (everything!)
$data = compact(array('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_content_filtered', 'post_title', 'post_excerpt', 'post_status', 'post_type', 'comment_status', 'ping_status', 'post_password', 'post_name', 'to_ping', 'pinged', 'post_modified', 'post_modified_gmt', 'post_parent', 'menu_order', 'post_mime_type', 'guid'));
/**
* Filter attachment post data before it is updated in or added
* to the database.
*
* @since 3.9.0
*
* @param array $data Array of sanitized attachment post data.
* @param array $object Array of un-sanitized attachment post data.
*/
$data = apply_filters('wp_insert_attachment_data', $data, $object);
$data = wp_unslash($data);
if ($update) {
$wpdb->update($wpdb->posts, $data, array('ID' => $post_ID));
} else {
// If there is a suggested ID, use it if not already present
if (!empty($import_id)) {
$import_id = (int) $import_id;
if (!$wpdb->get_var($wpdb->prepare("SELECT ID FROM {$wpdb->posts} WHERE ID = %d", $import_id))) {
$data['ID'] = $import_id;
}
}
$wpdb->insert($wpdb->posts, $data);
$post_ID = (int) $wpdb->insert_id;
}
if (empty($post_name)) {
$post_name = sanitize_title($post_title, $post_ID);
$wpdb->update($wpdb->posts, compact("post_name"), array('ID' => $post_ID));
}
if (is_object_in_taxonomy($post_type, 'category')) {
wp_set_post_categories($post_ID, $post_category);
}
if (isset($tags_input) && is_object_in_taxonomy($post_type, 'post_tag')) {
wp_set_post_tags($post_ID, $tags_input);
}
// support for all custom taxonomies
if (!empty($tax_input)) {
foreach ($tax_input as $taxonomy => $tags) {
$taxonomy_obj = get_taxonomy($taxonomy);
if (is_array($tags)) {
// array = hierarchical, string = non-hierarchical.
$tags = array_filter($tags);
}
if (current_user_can($taxonomy_obj->cap->assign_terms)) {
wp_set_post_terms($post_ID, $tags, $taxonomy);
}
}
}
if ($file) {
update_attached_file($post_ID, $file);
}
clean_post_cache($post_ID);
if (!empty($context)) {
add_post_meta($post_ID, '_wp_attachment_context', $context, true);
}
if ($update) {
/**
* Fires once an existing attachment has been updated.
*
* @since 2.0.0
*
* @param int $post_ID Attachment ID.
*/
do_action('edit_attachment', $post_ID);
} else {
/**
* Fires once an attachment has been added.
*
* @since 2.0.0
*
* @param int $post_ID Attachment ID.
*/
do_action('add_attachment', $post_ID);
}
return $post_ID;
}