/** * Inserts an attachment. * * @since 0.0.1 * @access public * * @param array $object Attachment object. * @param string $file File path of the attached image. * @return int Attachment ID */ public function insert_attachment($object, $file) { $attachment_id = hq_insert_attachment($object, $file); $metadata = hq_generate_attachment_metadata($attachment_id, $file); /** * Filter the site icon attachment metadata. * * @since 0.0.1 * * @see hq_generate_attachment_metadata() * * @param array $metadata Attachment metadata. */ $metadata = apply_filters('site_icon_attachment_metadata', $metadata); hq_update_attachment_metadata($attachment_id, $metadata); return $attachment_id; }
/** * Handle importer uploading and add attachment. * * @since 0.0.1 * * @return array Uploaded file's details on success, error message on failure */ function hq_import_handle_upload() { if (!isset($_FILES['import'])) { return array('error' => __('File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini or by post_max_size being defined as smaller than upload_max_filesize in php.ini.')); } $overrides = array('test_form' => false, 'test_type' => false); $_FILES['import']['name'] .= '.txt'; $upload = hq_handle_upload($_FILES['import'], $overrides); if (isset($upload['error'])) { return $upload; } // Construct the object array $object = array('post_title' => basename($upload['file']), 'post_content' => $upload['url'], 'post_mime_type' => $upload['type'], 'guid' => $upload['url'], 'context' => 'import', 'post_status' => 'private'); // Save the data $id = hq_insert_attachment($object, $upload['file']); /* * Schedule a cleanup for one day from now in case of failed * import or missing hq_import_cleanup() call. */ hq_schedule_single_event(time() + DAY_IN_SECONDS, 'importer_scheduled_cleanup', array($id)); return array('file' => $upload['file'], 'id' => $id); }
/** * Handle an Image upload for the background image. * * @since 0.0.1 */ public function handle_upload() { if (empty($_FILES)) { return; } check_admin_referer('custom-background-upload', '_hqnonce-custom-background-upload'); $overrides = array('test_form' => false); $uploaded_file = $_FILES['import']; $hq_filetype = hq_check_filetype_and_ext($uploaded_file['tmp_name'], $uploaded_file['name']); if (!hq_match_mime_types('image', $hq_filetype['type'])) { hq_die(__('The uploaded file is not a valid image. Please try again.')); } $file = hq_handle_upload($uploaded_file, $overrides); if (isset($file['error'])) { hq_die($file['error']); } $url = $file['url']; $type = $file['type']; $file = $file['file']; $filename = basename($file); // Construct the object array $object = array('post_title' => $filename, 'post_content' => $url, 'post_mime_type' => $type, 'guid' => $url, 'context' => 'custom-background'); // Save the data $id = hq_insert_attachment($object, $file); // Add the meta-data hq_update_attachment_metadata($id, hq_generate_attachment_metadata($id, $file)); update_post_meta($id, '_hq_attachment_is_custom_background', get_option('stylesheet')); set_theme_mod('background_image', esc_url_raw($url)); $thumbnail = hq_get_attachment_image_src($id, 'thumbnail'); set_theme_mod('background_image_thumb', esc_url_raw($thumbnail[0])); /** This action is documented in hq-admin/custom-header.php */ do_action('hq_create_file_in_uploads', $file, $id); // For replication $this->updated = true; }
/** * Update a post with new post data. * * The date does not have to be set for drafts. You can set the date and it will * not be overridden. * * @since 0.0.1 * * @param array|object $postarr Optional. Post data. Arrays are expected to be escaped, * objects are not. Default array. * @param bool $hq_error Optional. Allow return of HQ_Error on failure. Default false. * @return int|HQ_Error The value 0 or HQ_Error on failure. The post ID on success. */ function hq_update_post($postarr = array(), $hq_error = false) { if (is_object($postarr)) { // Non-escaped post was passed. $postarr = get_object_vars($postarr); $postarr = hq_slash($postarr); } // First, get all of the original fields. $post = get_post($postarr['ID'], ARRAY_A); if (is_null($post)) { if ($hq_error) { return new HQ_Error('invalid_post', __('Invalid post ID.')); } return 0; } // Escape data pulled from DB. $post = hq_slash($post); // Passed post category list overwrites existing category list if not empty. if (isset($postarr['post_category']) && is_array($postarr['post_category']) && 0 != count($postarr['post_category'])) { $post_cats = $postarr['post_category']; } else { $post_cats = $post['post_category']; } // Drafts shouldn't be assigned a date unless explicitly done so by the user. if (isset($post['post_status']) && in_array($post['post_status'], array('draft', 'pending', 'auto-draft')) && empty($postarr['edit_date']) && '0000-00-00 00:00:00' == $post['post_date_gmt']) { $clear_date = true; } else { $clear_date = false; } // Merge old and new fields with new fields overwriting old ones. $postarr = array_merge($post, $postarr); $postarr['post_category'] = $post_cats; if ($clear_date) { $postarr['post_date'] = current_time('mysql'); $postarr['post_date_gmt'] = ''; } if ($postarr['post_type'] == 'attachment') { return hq_insert_attachment($postarr); } return hq_insert_post($postarr, $hq_error); }
/** * Generate post thumbnail attachment meta data. * * @since 0.0.1 * * @global array $_hq_additional_image_sizes * * @param int $attachment_id Attachment Id to process. * @param string $file Filepath of the Attached image. * @return mixed Metadata for attachment. */ function hq_generate_attachment_metadata($attachment_id, $file) { $attachment = get_post($attachment_id); $metadata = array(); $support = false; if (preg_match('!^image/!', get_post_mime_type($attachment)) && file_is_displayable_image($file)) { $imagesize = getimagesize($file); $metadata['width'] = $imagesize[0]; $metadata['height'] = $imagesize[1]; // Make the file path relative to the upload dir. $metadata['file'] = _hq_relative_upload_path($file); // Make thumbnails and other intermediate sizes. global $_hq_additional_image_sizes; $sizes = array(); foreach (get_intermediate_image_sizes() as $s) { $sizes[$s] = array('width' => '', 'height' => '', 'crop' => false); if (isset($_hq_additional_image_sizes[$s]['width'])) { $sizes[$s]['width'] = intval($_hq_additional_image_sizes[$s]['width']); } else { $sizes[$s]['width'] = get_option("{$s}_size_w"); } // For default sizes set in options if (isset($_hq_additional_image_sizes[$s]['height'])) { $sizes[$s]['height'] = intval($_hq_additional_image_sizes[$s]['height']); } else { $sizes[$s]['height'] = get_option("{$s}_size_h"); } // For default sizes set in options if (isset($_hq_additional_image_sizes[$s]['crop'])) { $sizes[$s]['crop'] = $_hq_additional_image_sizes[$s]['crop']; } else { $sizes[$s]['crop'] = get_option("{$s}_crop"); } // For default sizes set in options } /** * Filter the image sizes automatically generated when uploading an image. * * @since 0.0.1 * * @param array $sizes An associative array of image sizes. */ $sizes = apply_filters('intermediate_image_sizes_advanced', $sizes); if ($sizes) { $editor = hq_get_image_editor($file); if (!is_hq_error($editor)) { $metadata['sizes'] = $editor->multi_resize($sizes); } } else { $metadata['sizes'] = array(); } // Fetch additional metadata from EXIF/IPTC. $image_meta = hq_read_image_metadata($file); if ($image_meta) { $metadata['image_meta'] = $image_meta; } } elseif (hq_attachment_is('video', $attachment)) { $metadata = hq_read_video_metadata($file); $support = current_theme_supports('post-thumbnails', 'attachment:video') || post_type_supports('attachment:video', 'thumbnail'); } elseif (hq_attachment_is('audio', $attachment)) { $metadata = hq_read_audio_metadata($file); $support = current_theme_supports('post-thumbnails', 'attachment:audio') || post_type_supports('attachment:audio', 'thumbnail'); } if ($support && !empty($metadata['image']['data'])) { // Check for existing cover. $hash = md5($metadata['image']['data']); $posts = get_posts(array('fields' => 'ids', 'post_type' => 'attachment', 'post_mime_type' => $metadata['image']['mime'], 'post_status' => 'inherit', 'posts_per_page' => 1, 'meta_key' => '_cover_hash', 'meta_value' => $hash)); $exists = reset($posts); if (!empty($exists)) { update_post_meta($attachment_id, '_thumbnail_id', $exists); } else { $ext = '.jpg'; switch ($metadata['image']['mime']) { case 'image/gif': $ext = '.gif'; break; case 'image/png': $ext = '.png'; break; } $basename = str_replace('.', '-', basename($file)) . '-image' . $ext; $uploaded = hq_upload_bits($basename, '', $metadata['image']['data']); if (false === $uploaded['error']) { $image_attachment = array('post_mime_type' => $metadata['image']['mime'], 'post_type' => 'attachment', 'post_content' => ''); /** * Filter the parameters for the attachment thumbnail creation. * * @since 0.0.1 * * @param array $image_attachment An array of parameters to create the thumbnail. * @param array $metadata Current attachment metadata. * @param array $uploaded An array containing the thumbnail path and url. */ $image_attachment = apply_filters('attachment_thumbnail_args', $image_attachment, $metadata, $uploaded); $sub_attachment_id = hq_insert_attachment($image_attachment, $uploaded['file']); add_post_meta($sub_attachment_id, '_cover_hash', $hash); $attach_data = hq_generate_attachment_metadata($sub_attachment_id, $uploaded['file']); hq_update_attachment_metadata($sub_attachment_id, $attach_data); update_post_meta($attachment_id, '_thumbnail_id', $sub_attachment_id); } } } // Remove the blob of binary data from the array. unset($metadata['image']['data']); /** * Filter the generated attachment meta data. * * @since 0.0.1 * * @param array $metadata An array of attachment meta data. * @param int $attachment_id Current attachment ID. */ return apply_filters('hq_generate_attachment_metadata', $metadata, $attachment_id); }
/** * Insert an attachment and its metadata. * * @param array $object Attachment object. * @param string $cropped Cropped image URL. * * @return int Attachment ID. */ public final function insert_attachment($object, $cropped) { $attachment_id = hq_insert_attachment($object, $cropped); $metadata = hq_generate_attachment_metadata($attachment_id, $cropped); /** * Filter the header image attachment metadata. * * @since 0.0.1 * * @see hq_generate_attachment_metadata() * * @param array $metadata Attachment metadata. */ $metadata = apply_filters('hq_header_image_attachment_metadata', $metadata); hq_update_attachment_metadata($attachment_id, $metadata); return $attachment_id; }