Files
wordpress-preseed/wp-content/plugins/imsanity/libs/utils.php
2019-09-11 19:08:46 +02:00

182 lines
5.6 KiB
PHP

<?php
/**
* Imsanity utility functions.
*
* @package Imsanity
*/
/**
* Util function returns an array value, if not defined then returns default instead.
*
* @param array $arr Any array.
* @param string $key Any index from that array.
* @param mixed $default Whatever you want.
*/
function imsanity_val( $arr, $key, $default = '' ) {
return isset( $arr[ $key ] ) ? $arr[ $key ] : $default;
}
/**
* Retrieves the path of an attachment via the $id and the $meta.
*
* @param array $meta The attachment metadata.
* @param int $id The attachment ID number.
* @param string $file Optional. Path relative to the uploads folder. Default ''.
* @param bool $refresh_cache Optional. True to flush cache prior to fetching path. Default true.
* @return string The full path to the image.
*/
function imsanity_attachment_path( $meta, $id, $file = '', $refresh_cache = true ) {
// Retrieve the location of the WordPress upload folder.
$upload_dir = wp_upload_dir( null, false, $refresh_cache );
$upload_path = trailingslashit( $upload_dir['basedir'] );
if ( is_array( $meta ) && ! empty( $meta['file'] ) ) {
$file_path = $meta['file'];
if ( strpos( $file_path, 's3' ) === 0 ) {
return '';
}
if ( is_file( $file_path ) ) {
return $file_path;
}
$file_path = $upload_path . $file_path;
if ( is_file( $file_path ) ) {
return $file_path;
}
$upload_path = trailingslashit( WP_CONTENT_DIR ) . 'uploads/';
$file_path = $upload_path . $meta['file'];
if ( is_file( $file_path ) ) {
return $file_path;
}
}
if ( ! $file ) {
$file = get_post_meta( $id, '_wp_attached_file', true );
}
$file_path = ( 0 !== strpos( $file, '/' ) && ! preg_match( '|^.:\\\|', $file ) ? $upload_path . $file : $file );
$filtered_file_path = apply_filters( 'get_attached_file', $file_path, $id );
if ( strpos( $filtered_file_path, 's3' ) === false && is_file( $filtered_file_path ) ) {
return str_replace( '//_imsgalleries/', '/_imsgalleries/', $filtered_file_path );
}
if ( strpos( $file_path, 's3' ) === false && is_file( $file_path ) ) {
return str_replace( '//_imsgalleries/', '/_imsgalleries/', $file_path );
}
return '';
}
/**
* Get mimetype based on file extension instead of file contents when speed outweighs accuracy.
*
* @param string $path The name of the file.
* @return string|bool The mime type based on the extension or false.
*/
function imsanity_quick_mimetype( $path ) {
$pathextension = strtolower( pathinfo( $path, PATHINFO_EXTENSION ) );
switch ( $pathextension ) {
case 'jpg':
case 'jpeg':
case 'jpe':
return 'image/jpeg';
case 'png':
return 'image/png';
case 'gif':
return 'image/gif';
case 'pdf':
return 'application/pdf';
default:
return false;
}
}
/**
* Gets the orientation/rotation of a JPG image using the EXIF data.
*
* @param string $file Name of the file.
* @param string $type Mime type of the file.
* @return int|bool The orientation value or false.
*/
function imsanity_get_orientation( $file, $type ) {
if ( function_exists( 'exif_read_data' ) && 'image/jpeg' === $type ) {
$exif = @exif_read_data( $file );
if ( is_array( $exif ) && array_key_exists( 'Orientation', $exif ) ) {
return (int) $exif['Orientation'];
}
}
return false;
}
/**
* Output a fatal error and optionally die.
*
* @param string $message The message to output.
* @param string $title A title/header for the message.
* @param bool $die Default false. Whether we should die.
*/
function imsanity_fatal( $message, $title = '', $die = false ) {
echo ( "<div style='margin:5px 0px 5px 0px;padding:10px;border: solid 1px red; background-color: #ff6666; color: black;'>"
. ( $title ? "<h4 style='font-weight: bold; margin: 3px 0px 8px 0px;'>" . $title . '</h4>' : '' )
. $message
. '</div>' );
if ( $die ) {
die();
}
}
/**
* Replacement for deprecated image_resize function
*
* @param string $file Image file path.
* @param int $max_w Maximum width to resize to.
* @param int $max_h Maximum height to resize to.
* @param bool $crop Optional. Whether to crop image or resize.
* @param string $suffix Optional. File suffix.
* @param string $dest_path Optional. New image file path.
* @param int $jpeg_quality Optional, default is 90. Image quality percentage.
* @return mixed WP_Error on failure. String with new destination path.
*/
function imsanity_image_resize( $file, $max_w, $max_h, $crop = false, $suffix = null, $dest_path = null, $jpeg_quality = 82 ) {
if ( function_exists( 'wp_get_image_editor' ) ) {
$editor = wp_get_image_editor( $file );
if ( is_wp_error( $editor ) ) {
return $editor;
}
$editor->set_quality( $jpeg_quality );
$ftype = imsanity_quick_mimetype( $file );
$orientation = imsanity_get_orientation( $file, $ftype );
// Try to correct for auto-rotation if the info is available.
switch ( $orientation ) {
case 3:
$editor->rotate( 180 );
break;
case 6:
$editor->rotate( -90 );
break;
case 8:
$editor->rotate( 90 );
break;
}
$resized = $editor->resize( $max_w, $max_h, $crop );
if ( is_wp_error( $resized ) ) {
return $resized;
}
$dest_file = $editor->generate_filename( $suffix, $dest_path );
// FIX: make sure that the destination file does not exist. this fixes
// an issue during bulk resize where one of the optimized media filenames may get
// used as the temporary file, which causes it to be deleted.
while ( file_exists( $dest_file ) ) {
$dest_file = $editor->generate_filename( 'TMP', $dest_path );
}
$saved = $editor->save( $dest_file );
if ( is_wp_error( $saved ) ) {
return $saved;
}
return $dest_file;
}
return false;
}