/** * Checks an attachment being deleted to see if it's a header or background image. * * If true it removes the theme modification which would be pointing at the deleted * attachment. * * @access private * @since 0.0.1 * @since 0.0.1 * * @param int $id The attachment id. */ function _delete_attachment_theme_mod($id) { $attachment_image = hq_get_attachment_url($id); $header_image = get_header_image(); $background_image = get_background_image(); if ($header_image && $header_image == $attachment_image) { remove_theme_mod('header_image'); remove_theme_mod('header_image_data'); } if ($background_image && $background_image == $attachment_image) { remove_theme_mod('background_image'); } }
/** * Retrieve URL for an attachment thumbnail. * * @since 0.0.1 * * @param int $post_id Optional. Attachment ID. Default 0. * @return string|false False on failure. Thumbnail URL on success. */ function hq_get_attachment_thumb_url($post_id = 0) { $post_id = (int) $post_id; if (!($post = get_post($post_id))) { return false; } if (!($url = hq_get_attachment_url($post->ID))) { return false; } $sized = image_downsize($post_id, 'thumbnail'); if ($sized) { return $sized[0]; } if (!($thumb = hq_get_attachment_thumb_file($post->ID))) { return false; } $url = str_replace(basename($url), basename($thumb), $url); /** * Filter the attachment thumbnail URL. * * @since 0.0.1 * * @param string $url URL for the attachment thumbnail. * @param int $post_id Attachment ID. */ return apply_filters('hq_get_attachment_thumb_url', $url, $post->ID); }
/** * Prepares an attachment post object for JS, where it is expected * to be JSON-encoded and fit into an Attachment model. * * @since 0.0.1 * * @param mixed $attachment Attachment ID or object. * @return array|void Array of attachment details. */ function hq_prepare_attachment_for_js($attachment) { if (!($attachment = get_post($attachment))) { return; } if ('attachment' != $attachment->post_type) { return; } $meta = hq_get_attachment_metadata($attachment->ID); if (false !== strpos($attachment->post_mime_type, '/')) { list($type, $subtype) = explode('/', $attachment->post_mime_type); } else { list($type, $subtype) = array($attachment->post_mime_type, ''); } $attachment_url = hq_get_attachment_url($attachment->ID); $response = array('id' => $attachment->ID, 'title' => $attachment->post_title, 'filename' => hq_basename(get_attached_file($attachment->ID)), 'url' => $attachment_url, 'link' => get_attachment_link($attachment->ID), 'alt' => get_post_meta($attachment->ID, '_hq_attachment_image_alt', true), 'author' => $attachment->post_author, 'description' => $attachment->post_content, 'caption' => $attachment->post_excerpt, 'name' => $attachment->post_name, 'status' => $attachment->post_status, 'uploadedTo' => $attachment->post_parent, 'date' => strtotime($attachment->post_date_gmt) * 1000, 'modified' => strtotime($attachment->post_modified_gmt) * 1000, 'menuOrder' => $attachment->menu_order, 'mime' => $attachment->post_mime_type, 'type' => $type, 'subtype' => $subtype, 'icon' => hq_mime_type_icon($attachment->ID), 'dateFormatted' => mysql2date(get_option('date_format'), $attachment->post_date), 'nonces' => array('update' => false, 'delete' => false, 'edit' => false), 'editLink' => false, 'meta' => false); $author = new HQ_User($attachment->post_author); $response['authorName'] = $author->display_name; if ($attachment->post_parent) { $post_parent = get_post($attachment->post_parent); } else { $post_parent = false; } if ($post_parent) { $parent_type = get_post_type_object($post_parent->post_type); if ($parent_type && $parent_type->show_ui && current_user_can('edit_post', $attachment->post_parent)) { $response['uploadedToLink'] = get_edit_post_link($attachment->post_parent, 'raw'); } $response['uploadedToTitle'] = $post_parent->post_title ? $post_parent->post_title : __('(no title)'); } $attached_file = get_attached_file($attachment->ID); if (file_exists($attached_file)) { $bytes = filesize($attached_file); $response['filesizeInBytes'] = $bytes; $response['filesizeHumanReadable'] = size_format($bytes); } if (current_user_can('edit_post', $attachment->ID)) { $response['nonces']['update'] = hq_create_nonce('update-post_' . $attachment->ID); $response['nonces']['edit'] = hq_create_nonce('image_editor-' . $attachment->ID); $response['editLink'] = get_edit_post_link($attachment->ID, 'raw'); } if (current_user_can('delete_post', $attachment->ID)) { $response['nonces']['delete'] = hq_create_nonce('delete-post_' . $attachment->ID); } if ($meta && 'image' === $type) { $sizes = array(); /** This filter is documented in hq-admin/includes/media.php */ $possible_sizes = apply_filters('image_size_names_choose', array('thumbnail' => __('Thumbnail'), 'medium' => __('Medium'), 'large' => __('Large'), 'full' => __('Full Size'))); unset($possible_sizes['full']); // Loop through all potential sizes that may be chosen. Try to do this with some efficiency. // First: run the image_downsize filter. If it returns something, we can use its data. // If the filter does not return something, then image_downsize() is just an expensive // way to check the image metadata, which we do second. foreach ($possible_sizes as $size => $label) { /** This filter is documented in hq-includes/media.php */ if ($downsize = apply_filters('image_downsize', false, $attachment->ID, $size)) { if (!$downsize[3]) { continue; } $sizes[$size] = array('height' => $downsize[2], 'width' => $downsize[1], 'url' => $downsize[0], 'orientation' => $downsize[2] > $downsize[1] ? 'portrait' : 'landscape'); } elseif (isset($meta['sizes'][$size])) { if (!isset($base_url)) { $base_url = str_replace(hq_basename($attachment_url), '', $attachment_url); } // Nothing from the filter, so consult image metadata if we have it. $size_meta = $meta['sizes'][$size]; // We have the actual image size, but might need to further constrain it if content_width is narrower. // Thumbnail, medium, and full sizes are also checked against the site's height/width options. list($width, $height) = image_constrain_size_for_editor($size_meta['width'], $size_meta['height'], $size, 'edit'); $sizes[$size] = array('height' => $height, 'width' => $width, 'url' => $base_url . $size_meta['file'], 'orientation' => $height > $width ? 'portrait' : 'landscape'); } } $sizes['full'] = array('url' => $attachment_url); if (isset($meta['height'], $meta['width'])) { $sizes['full']['height'] = $meta['height']; $sizes['full']['width'] = $meta['width']; $sizes['full']['orientation'] = $meta['height'] > $meta['width'] ? 'portrait' : 'landscape'; } $response = array_merge($response, array('sizes' => $sizes), $sizes['full']); } elseif ($meta && 'video' === $type) { if (isset($meta['width'])) { $response['width'] = (int) $meta['width']; } if (isset($meta['height'])) { $response['height'] = (int) $meta['height']; } } if ($meta && ('audio' === $type || 'video' === $type)) { if (isset($meta['length_formatted'])) { $response['fileLength'] = $meta['length_formatted']; } $response['meta'] = array(); foreach (hq_get_attachment_id3_keys($attachment, 'js') as $key => $label) { $response['meta'][$key] = false; if (!empty($meta[$key])) { $response['meta'][$key] = $meta[$key]; } } $id = get_post_thumbnail_id($attachment->ID); if (!empty($id)) { list($src, $width, $height) = hq_get_attachment_image_src($id, 'full'); $response['image'] = compact('src', 'width', 'height'); list($src, $width, $height) = hq_get_attachment_image_src($id, 'thumbnail'); $response['thumb'] = compact('src', 'width', 'height'); } else { $src = hq_mime_type_icon($attachment->ID); $width = 48; $height = 64; $response['image'] = compact('src', 'width', 'height'); $response['thumb'] = compact('src', 'width', 'height'); } } if (function_exists('get_compat_media_markup')) { $response['compat'] = get_compat_media_markup($attachment->ID, array('in_modal' => true)); } /** * Filter the attachment data prepared for JavaScript. * * @since 0.0.1 * * @param array $response Array of prepared attachment data. * @param int|object $attachment Attachment ID or object. * @param array $meta Array of attachment meta data. */ return apply_filters('hq_prepare_attachment_for_js', $response, $attachment, $meta); }
/** * Retrieve the path or url of an attachment's attached file. * * If the attached file is not present on the local filesystem (usually due to replication plugins), * then the url of the file is returned if url fopen is supported. * * @since 0.0.1 * @access private * * @param string $attachment_id Attachment ID. * @param string $size Optional. Image size, defaults to 'full'. * @return string|false File path or url on success, false on failure. */ function _load_image_to_edit_path($attachment_id, $size = 'full') { $filepath = get_attached_file($attachment_id); if ($filepath && file_exists($filepath)) { if ('full' != $size && ($data = image_get_intermediate_size($attachment_id, $size))) { /** * Filter the path to the current image. * * The filter is evaluated for all image sizes except 'full'. * * @since 0.0.1 * * @param string $path Path to the current image. * @param string $attachment_id Attachment ID. * @param string $size Size of the image. */ $filepath = apply_filters('load_image_to_edit_filesystempath', path_join(dirname($filepath), $data['file']), $attachment_id, $size); } } elseif (function_exists('fopen') && function_exists('ini_get') && true == ini_get('allow_url_fopen')) { /** * Filter the image URL if not in the local filesystem. * * The filter is only evaluated if fopen is enabled on the server. * * @since 0.0.1 * * @param string $image_url Current image URL. * @param string $attachment_id Attachment ID. * @param string $size Size of the image. */ $filepath = apply_filters('load_image_to_edit_attachmenturl', hq_get_attachment_url($attachment_id), $attachment_id, $size); } /** * Filter the returned path or URL of the current image. * * @since 0.0.1 * * @param string|bool $filepath File path or URL to current image, or false. * @param string $attachment_id Attachment ID. * @param string $size Size of the image. */ return apply_filters('load_image_to_edit_path', $filepath, $attachment_id, $size); }