Enig resultaat
h The width of the thumbnail.
* @param int $thumbnail_height The height of the thumbnail.
* @param bool $crop Whether to crop or not.
*
* @return array|false An array of the filename, thumbnail width, and thumbnail height,
* or false on failure to resize such as the thumbnail being larger than the fullsize image.
*/
public function get_thumbnail( $editor, $fullsize_width, $fullsize_height, $thumbnail_width, $thumbnail_height, $crop ) {
$dims = image_resize_dimensions( $fullsize_width, $fullsize_height, $thumbnail_width, $thumbnail_height, $crop );
if ( ! $dims ) {
return false;
}
list( , , , , $dst_w, $dst_h ) = $dims;
$suffix = "{$dst_w}x{$dst_h}";
$file_ext = strtolower( pathinfo( $this->get_fullsizepath(), PATHINFO_EXTENSION ) );
return array(
'filename' => $editor->generate_filename( $suffix, null, $file_ext ),
'width' => $dst_w,
'height' => $dst_h,
);
}
/**
* Update the post content of any public post types (posts and pages by default)
* that make use of this attachment.
*
* @since 3.0.0
*
* @param array|string $args {
* Optional. Array or string of arguments for controlling the updating.
*
* @type array $post_type The post types to update. Defaults to public post types (posts and pages by default).
* @type array $post_ids Specific post IDs to update as opposed to any that uses the attachment.
* @type int $posts_per_loop How many posts to query at a time to keep memory usage down. You shouldn't need to modify this.
* }
*
* @return array|WP_Error List of post IDs that were modified. The key is the post ID and the value is either the post ID again or a WP_Error object if wp_update_post() failed.
*/
public function update_usages_in_posts( $args = array() ) {
// Temporarily disabled until it can be even better tested for edge cases
return array();
$args = wp_parse_args( $args, array(
'post_type' => array(),
'post_ids' => array(),
'posts_per_loop' => 10,
) );
if ( empty( $args['post_type'] ) ) {
$args['post_type'] = array_values( get_post_types( array( 'public' => true ) ) );
unset( $args['post_type']['attachment'] );
}
$offset = 0;
$posts_updated = array();
while ( true ) {
$posts = get_posts( array(
'numberposts' => $args['posts_per_loop'],
'offset' => $offset,
'orderby' => 'ID',
'order' => 'ASC',
'include' => $args['post_ids'],
'post_type' => $args['post_type'],
's' => 'wp-image-' . $this->attachment->ID,
// For faster queries.
'update_post_meta_cache' => false,
'update_post_term_cache' => false,
) );
if ( ! $posts ) {
break;
}
$offset += $args['posts_per_loop'];
foreach ( $posts as $post ) {
$content = $post->post_content;
$search = array();
$replace = array();
// Find all tags for this attachment and update them.
preg_match_all(
'#
]+wp-image-' . $this->attachment->ID . '[^>]+/>#i',
$content,
$matches,
PREG_SET_ORDER
);
if ( $matches ) {
foreach ( $matches as $img_tag ) {
preg_match( '# class="([^"]+)?size-([^" ]+)#i', $img_tag[0], $thumbnail_size );
if ( $thumbnail_size ) {
$thumbnail = image_downsize( $this->attachment->ID, $thumbnail_size[2] );
if ( ! $thumbnail ) {
continue;
}
$search[] = $img_tag[0];
$img_tag[0] = preg_replace( '# src="[^"]+"#i', ' src="' . esc_url( $thumbnail[0] ) . '"', $img_tag[0] );
$img_tag[0] = preg_replace(
'# width="[^"]+" height="[^"]+"#i',
' width="' . esc_attr( $thumbnail[1] ) . '" height="' . esc_attr( $thumbnail[2] ) . '"',
$img_tag[0]
);
$replace[] = $img_tag[0];
}
}
}
$content = str_replace( $search, $replace, $content );
$search = array();
$replace = array();
// Update the width in any [caption] shortcodes.
preg_match_all(
'#\[caption id="attachment_' . $this->attachment->ID . '"([^\]]+)? width="[^"]+"\]([^\[]+)size-([^" ]+)([^\[]+)\[\/caption\]#i',
$content,
$matches,
PREG_SET_ORDER
);
if ( $matches ) {
foreach ( $matches as $match ) {
$thumbnail = image_downsize( $this->attachment->ID, $match[3] );
if ( ! $thumbnail ) {
continue;
}
$search[] = $match[0];
$replace[] = '[caption id="attachment_' . $this->attachment->ID . '"' . $match[1] . ' width="' . esc_attr( $thumbnail[1] ) . '"]' . $match[2] . 'size-' . $match[3] . $match[4] . '[/caption]';
}
}
$content = str_replace( $search, $replace, $content );
$updated_post_object = (object) array(
'ID' => $post->ID,
'post_content' => $content,
);
$posts_updated[ $post->ID ] = wp_update_post( $updated_post_object, true );
}
}
return $posts_updated;
}
/**
* Returns information about the current attachment for use in the REST API.
*
* @since 3.0.0
*
* @return array|WP_Error The attachment name, fullsize URL, registered thumbnail size status, and any unregistered sizes, or WP_Error on error.
*/
public function get_attachment_info() {
$fullsizepath = $this->get_fullsizepath();
if ( is_wp_error( $fullsizepath ) ) {
$fullsizepath->add_data( array( 'attachment' => $this->attachment ) );
return $fullsizepath;
}
$editor = wp_get_image_editor( $fullsizepath );
if ( is_wp_error( $editor ) ) {
// Display a more helpful error message.
if ( 'image_no_editor' === $editor->get_error_code() ) {
$editor = new WP_Error( 'image_no_editor', __( 'The current image editor cannot process this file type.', 'regenerate-thumbnails' ) );
}
$editor->add_data( array(
'attachment' => $this->attachment,
'status' => 415,
) );
return $editor;
}
$metadata = wp_get_attachment_metadata( $this->attachment->ID );
if ( false === $metadata || ! is_array( $metadata ) ) {
return new WP_Error(
'regenerate_thumbnails_regenerator_no_metadata',
__( 'Unable to load the metadata for this attachment.', 'regenerate-thumbnails' ),
array(
'status' => 404,
'attachment' => $this->attachment,
)
);
}
if ( ! isset( $metadata['sizes'] ) ) {
$metadata['sizes'] = array();
}
// PDFs don't have width/height set.
$width = ( isset( $metadata['width'] ) ) ? $metadata['width'] : null;
$height = ( isset( $metadata['height'] ) ) ? $metadata['height'] : null;
require_once( ABSPATH . '/wp-admin/includes/image.php' );
$preview = false;
if ( file_is_displayable_image( $fullsizepath ) ) {
$preview = wp_get_attachment_url( $this->attachment->ID );
} elseif (
is_array( $metadata['sizes'] ) &&
is_array( $metadata['sizes']['full'] ) &&
! empty( $metadata['sizes']['full']['file'] )
) {
$preview = str_replace(
wp_basename( $fullsizepath ),
$metadata['sizes']['full']['file'],
wp_get_attachment_url( $this->attachment->ID )
);
if ( ! file_exists( $preview ) ) {
$preview = false;
}
}
$response = array(
'name' => ( $this->attachment->post_title ) ? $this->attachment->post_title : sprintf( __( 'Attachment %d', 'regenerate-thumbnails' ), $this->attachment->ID ),
'preview' => $preview,
'relative_path' => _wp_get_attachment_relative_path( $fullsizepath ) . DIRECTORY_SEPARATOR . wp_basename( $fullsizepath ),
'edit_url' => get_edit_post_link( $this->attachment->ID, 'raw' ),
'width' => $width,
'height' => $height,
'registered_sizes' => array(),
'unregistered_sizes' => array(),
);
$wp_upload_dir = dirname( $fullsizepath ) . DIRECTORY_SEPARATOR;
$registered_sizes = RegenerateThumbnails()->get_thumbnail_sizes();
if ( 'application/pdf' === get_post_mime_type( $this->attachment ) ) {
$registered_sizes = array_intersect_key(
$registered_sizes,
array(
'thumbnail' => true,
'medium' => true,
'large' => true,
)
);
}
// Check the status of all currently registered sizes.
foreach ( $registered_sizes as $size ) {
// Width and height are needed to generate the thumbnail filename.
if ( $width && $height ) {
$thumbnail = $this->get_thumbnail( $editor, $width, $height, $size['width'], $size['height'], $size['crop'] );
if ( $thumbnail ) {
$size['filename'] = wp_basename( $thumbnail['filename'] );
$size['fileexists'] = file_exists( $thumbnail['filename'] );
} else {
$size['filename'] = false;
$size['fileexists'] = false;
}
} elseif ( ! empty( $metadata['sizes'][ $size['label'] ]['file'] ) ) {
$size['filename'] = wp_basename( $metadata['sizes'][ $size['label'] ]['file'] );
$size['fileexists'] = file_exists( $wp_upload_dir . $metadata['sizes'][ $size['label'] ]['file'] );
} else {
$size['filename'] = false;
$size['fileexists'] = false;
}
$response['registered_sizes'][] = $size;
}
if ( ! $width && ! $height && is_array( $metadata['sizes']['full'] ) ) {
$response['registered_sizes'][] = array(
'label' => 'full',
'width' => $metadata['sizes']['full']['width'],
'height' => $metadata['sizes']['full']['height'],
'filename' => $metadata['sizes']['full']['file'],
'fileexists' => file_exists( $wp_upload_dir . $metadata['sizes']['full']['file'] ),
);
}
// Look at the attachment metadata and see if we have any extra files from sizes that are no longer registered.
foreach ( $metadata['sizes'] as $label => $size ) {
if ( ! file_exists( $wp_upload_dir . $size['file'] ) ) {
continue;
}
// An unregistered size could match a registered size's dimensions. Ignore these.
foreach ( $response['registered_sizes'] as $registered_size ) {
if ( $size['file'] === $registered_size['filename'] ) {
continue 2;
}
}
if ( ! empty( $registered_sizes[ $label ] ) ) {
/* translators: Used for listing old sizes of currently registered thumbnails */
$label = sprintf( __( '%s (old)', 'regenerate-thumbnails' ), $label );
}
$response['unregistered_sizes'][] = array(
'label' => $label,
'width' => $size['width'],
'height' => $size['height'],
'filename' => $size['file'],
'fileexists' => true,
);
}
return $response;
}
}