Create a new attachment and make a copy of the image when selecting an image from the image library. This prevents orphaning the header if the original attachment is deleted. This also prevents stomping of meta.

Add a button to skip cropping.

Props SergeyBiryukov
Fixes #20657 #20667


git-svn-id: https://develop.svn.wordpress.org/trunk@20806 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Ryan Boren 2012-05-16 17:47:55 +00:00
parent 8471a0947c
commit b36e895a24
2 changed files with 83 additions and 23 deletions

View File

@ -784,11 +784,15 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?>
<input type="hidden" name="attachment_id" id="attachment_id" value="<?php echo esc_attr( $id ); ?>" /> <input type="hidden" name="attachment_id" id="attachment_id" value="<?php echo esc_attr( $id ); ?>" />
<input type="hidden" name="oitar" id="oitar" value="<?php echo esc_attr( $oitar ); ?>" /> <input type="hidden" name="oitar" id="oitar" value="<?php echo esc_attr( $oitar ); ?>" />
<?php if ( empty( $_POST ) && isset( $_GET['file'] ) ) { ?> <?php if ( empty( $_POST ) && isset( $_GET['file'] ) ) { ?>
<input type="hidden" name="new-attachment" value="true" /> <input type="hidden" name="create-new-attachment" value="true" />
<?php } ?> <?php } ?>
<?php wp_nonce_field( 'custom-header-crop-image' ) ?> <?php wp_nonce_field( 'custom-header-crop-image' ) ?>
<?php submit_button( __( 'Crop and Publish' ) ); ?> <p class="submit"><?php
submit_button( __( 'Crop and Publish' ), 'primary', 'submit', false );
if ( isset( $oitar ) && 1 == $oitar )
submit_button( __( 'Skip Cropping, Use Image as Is' ), 'primary', 'skip-cropping', false );
?>
</p> </p>
</form> </form>
</div> </div>
@ -867,12 +871,17 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?>
else else
$dst_width = get_theme_support( 'custom-header', 'width' ); $dst_width = get_theme_support( 'custom-header', 'width' );
$cropped = wp_crop_image( $attachment_id, (int) $_POST['x1'], (int) $_POST['y1'], (int) $_POST['width'], (int) $_POST['height'], $dst_width, $dst_height ); if ( empty( $_POST['skip-cropping'] ) )
$cropped = wp_crop_image( $attachment_id, (int) $_POST['x1'], (int) $_POST['y1'], (int) $_POST['width'], (int) $_POST['height'], $dst_width, $dst_height );
elseif ( ! empty( $_POST['create-new-attachment'] ) )
$cropped = _copy_image_file( $attachment_id );
else
$cropped = get_attached_file( $attachment_id );
if ( ! $cropped || is_wp_error( $cropped ) ) if ( ! $cropped || is_wp_error( $cropped ) )
wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) ); wp_die( __( 'Image could not be processed. Please go back and try again.' ), __( 'Image Processing Error' ) );
$cropped = apply_filters('wp_create_file_in_uploads', $cropped, $attachment_id); // For replication $cropped = apply_filters('wp_create_file_in_uploads', $cropped, $attachment_id); // For replication
$is_cropped = ( get_attached_file( $attachment_id ) != $cropped );
$parent = get_post($attachment_id); $parent = get_post($attachment_id);
$parent_url = $parent->guid; $parent_url = $parent->guid;
@ -890,7 +899,7 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?>
'guid' => $url, 'guid' => $url,
'context' => 'custom-header' 'context' => 'custom-header'
); );
if ( ! empty( $_POST['new-attachment'] ) ) if ( ! empty( $_POST['create-new-attachment'] ) )
unset( $object['ID'] ); unset( $object['ID'] );
// Update the attachment // Update the attachment
@ -913,7 +922,7 @@ wp_nonce_field( 'custom-header-options', '_wpnonce-custom-header-options' ); ?>
$medium = str_replace( basename( $original ), 'midsize-' . basename( $original ), $original ); $medium = str_replace( basename( $original ), 'midsize-' . basename( $original ), $original );
if ( file_exists( $medium ) ) if ( file_exists( $medium ) )
@unlink( apply_filters( 'wp_delete_file', $medium ) ); @unlink( apply_filters( 'wp_delete_file', $medium ) );
if ( empty( $_POST['new-attachment'] ) && $is_cropped ) if ( empty( $_POST['create-new-attachment'] ) && empty( $_POST['skip-cropping'] ) )
@unlink( apply_filters( 'wp_delete_file', $original ) ); @unlink( apply_filters( 'wp_delete_file', $original ) );
return $this->finished(); return $this->finished();

View File

@ -44,9 +44,6 @@ function wp_create_thumbnail( $file, $max_side, $deprecated = '' ) {
* @return string|WP_Error|false New filepath on success, WP_Error or false on failure. * @return string|WP_Error|false New filepath on success, WP_Error or false on failure.
*/ */
function wp_crop_image( $src, $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $src_abs = false, $dst_file = false ) { function wp_crop_image( $src, $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $src_abs = false, $dst_file = false ) {
if ( 0 == $src_x && 0 == $src_y && $src_w == $dst_w && $src_h == $dst_h )
return ( is_numeric( $src ) ) ? get_attached_file( $src ) : $src;
if ( is_numeric( $src ) ) { // Handle int as attachment ID if ( is_numeric( $src ) ) { // Handle int as attachment ID
$src_file = get_attached_file( $src ); $src_file = get_attached_file( $src );
if ( ! file_exists( $src_file ) ) { if ( ! file_exists( $src_file ) ) {
@ -366,19 +363,19 @@ function file_is_displayable_image($path) {
return apply_filters('file_is_displayable_image', $result, $path); return apply_filters('file_is_displayable_image', $result, $path);
} }
function load_image_to_edit($post_id, $mime_type, $size = 'full') { /**
$filepath = get_attached_file($post_id); * Load an image resource for editing.
*
if ( $filepath && file_exists($filepath) ) { * @since 2.9.0
if ( 'full' != $size && ( $data = image_get_intermediate_size($post_id, $size) ) ) { *
$filepath = apply_filters('load_image_to_edit_filesystempath', path_join( dirname($filepath), $data['file'] ), $post_id, $size); * @param string $attachment_id Attachment ID.
} * @param string $mime_type Image mime type.
} elseif ( function_exists('fopen') && function_exists('ini_get') && true == ini_get('allow_url_fopen') ) { * @param string $size Optional. Image size, defaults to 'full'.
$filepath = apply_filters('load_image_to_edit_attachmenturl', wp_get_attachment_url($post_id) , $post_id, $size); * @return resource|false The resulting image resource on success, false on failure.
} */
function load_image_to_edit( $attachment_id, $mime_type, $size = 'full' ) {
$filepath = apply_filters('load_image_to_edit_path', $filepath, $post_id, $size); $filepath = _load_image_to_edit_path( $attachment_id, $size );
if ( empty($filepath) ) if ( empty( $filepath ) )
return false; return false;
switch ( $mime_type ) { switch ( $mime_type ) {
@ -396,7 +393,7 @@ function load_image_to_edit($post_id, $mime_type, $size = 'full') {
break; break;
} }
if ( is_resource($image) ) { if ( is_resource($image) ) {
$image = apply_filters('load_image_to_edit', $image, $post_id, $size); $image = apply_filters('load_image_to_edit', $image, $attachment_id, $size);
if ( function_exists('imagealphablending') && function_exists('imagesavealpha') ) { if ( function_exists('imagealphablending') && function_exists('imagesavealpha') ) {
imagealphablending($image, false); imagealphablending($image, false);
imagesavealpha($image, true); imagesavealpha($image, true);
@ -404,3 +401,57 @@ function load_image_to_edit($post_id, $mime_type, $size = 'full') {
} }
return $image; return $image;
} }
/**
* Retrieve the path or url of an attachemnt'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 3.4.0
* @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 ) ) ) {
$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' ) ) {
$filepath = apply_filters( 'load_image_to_edit_attachmenturl', wp_get_attachment_url( $attachment_id ), $attachment_id, $size );
}
return apply_filters( 'load_image_to_edit_path', $filepath, $attachment_id, $size );
}
/**
* Copy an existing image file.
*
* @since 3.4.0
* @access private
*
* @param string $attachment_id Attachment ID.
* @return string|false New file path on success, false on failure.
*/
function _copy_image_file( $attachment_id ) {
debug_log( 'copyin' );
$dst_file = $src_file = get_attached_file( $attachment_id );
if ( ! file_exists( $src_file ) )
$src_file = _load_image_to_edit_path( $attachment_id );
if ( $src_file ) {
$dst_file = str_replace( basename( $dst_file ), 'copy-' . basename( $dst_file ), $dst_file );
$dst_file = dirname( $dst_file ) . '/' . wp_unique_filename( dirname( $dst_file ), basename( $dst_file ) );
if ( ! @copy( $src_file, $dst_file ) )
$dst_file = false;
} else {
$dst_file = false;
}
return $dst_file;
}