Files
medicalalert-web-reloaded/wp/wp-content/plugins/imagify/inc/functions/admin-ui.php
Tony Volpe 4eb982d7a8 Merged in feature/from-pantheon (pull request #16)
code from pantheon

* code from pantheon
2024-01-10 17:03:02 +00:00

530 lines
16 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
defined( 'ABSPATH' ) || die( 'Cheatin uh?' );
/**
* Get the optimization data list for a specific media.
*
* @since 1.0
* @since 1.9 Function signature changed.
* @author Jonathan Buttigieg
*
* @param ProcessInterface $process The optimization process object.
* @return string The output to print.
*/
function get_imagify_attachment_optimization_text( $process ) {
if ( ! $process->is_valid() ) {
return '';
}
$is_media_page = Imagify_Views::get_instance()->is_media_page();
$is_library_page = Imagify_Views::get_instance()->is_wp_library_page();
$output = $is_media_page ? '' : '<ul class="imagify-datas-list">';
$output_before = $is_media_page ? '' : '<li class="imagify-data-item">';
$output_after = $is_media_page ? '<br/>' : '</li>';
$reoptimize_link = get_imagify_attachment_reoptimize_link( $process );
$reoptimize_link .= get_imagify_attachment_optimize_missing_thumbnails_link( $process );
$reoptimize_link .= get_imagify_attachment_generate_webp_versions_link( $process );
$reoptimize_link .= get_imagify_attachment_delete_webp_versions_link( $process );
$reoptimize_output = $reoptimize_link ? $reoptimize_link : '';
$reoptimize_output_before = '<div class="imagify-datas-actions-links">';
$reoptimize_output_after = '</div><!-- .imagify-datas-actions-links -->';
$error = get_imagify_attachment_error_text( $process );
$media = $process->get_media();
if ( $error ) {
if ( ! $is_media_page && $reoptimize_link && $media->has_backup() ) {
$reoptimize_output .= '<span class="attachment-has-backup hidden"></span>';
}
$reoptimize_output = $reoptimize_output_before . $reoptimize_output . $reoptimize_output_after;
return $is_media_page ? $output_before . $error . $reoptimize_output . $output_after : $error . $reoptimize_output;
}
$data = $process->get_data();
$optimized_data = $data->get_optimization_data();
$attachment_id = $media->get_id();
$optimization_level = imagify_get_optimization_level_label( $data->get_optimization_level() );
if ( ! $is_media_page ) {
$output .= $output_before . '<span class="data">' . __( 'New Filesize:', 'imagify' ) . '</span> <strong class="big">' . $data->get_optimized_size() . '</strong>' . $output_after;
}
if ( key_exists( 'message', $optimized_data ) && $optimized_data['message'] ) {
$output .= $output_before . '<span class="data">' . __( 'Convert:', 'imagify' ) . '</span> <strong class="big">' . $optimized_data['message'] . '</strong>' . $output_after;
}
$chart = '';
if ( ! $is_media_page ) {
if ( ! $is_library_page ) {
// No need to print this on the library page, the event whould be triggered before the handler is attached (the JS file is loaded in the footer).
$chart = '<script type="text/javascript">jQuery( window ).trigger( "canvasprinted.imagify", [ ".imagify-consumption-chart-' . $attachment_id . '" ] ); </script>';
}
$chart = '<span class="imagify-chart">
<span class="imagify-chart-container">
<canvas class="imagify-consumption-chart imagify-consumption-chart-' . $attachment_id . '" width="15" height="15"></canvas>
' . $chart . '
</span>
</span>';
}
$output .= $output_before;
$output .= '<span class="data">' . __( 'Original Saving:', 'imagify' ) . '</span> ';
$output .= '<strong>' . $chart . '<span class="imagify-chart-value">' . $data->get_saving_percent() . '</span>%</strong>';
$output .= $output_after;
// More details section.
if ( ! $is_media_page ) {
// New list.
$output .= '</ul>';
$output .= '<p class="imagify-datas-more-action">';
$output .= '<a href="#imagify-view-details-' . $attachment_id . '" data-close="' . __( 'Close details', 'imagify' ) . '" data-open="' . __( 'View details', 'imagify' ) . '">';
$output .= '<span class="the-text">' . __( 'View details', 'imagify' ) . '</span>';
$output .= '<span class="dashicons dashicons-arrow-down-alt2"></span>';
$output .= '</a>';
$output .= '</p>';
$output .= '<ul id="imagify-view-details-' . $attachment_id . '" class="imagify-datas-list imagify-datas-details">';
// Not in metabox.
$output .= $output_before . '<span class="data">' . __( 'Original Filesize:', 'imagify' ) . '</span> <strong class="original">' . $data->get_original_size() . '</strong>' . $output_after;
}
$output .= $output_before . '<span class="data">' . __( 'Level:', 'imagify' ) . '</span> <strong>' . $optimization_level . '</strong>' . $output_after;
if ( $media->is_image() ) {
$has_webp = $process->has_webp() ? __( 'Yes', 'imagify' ) : __( 'No', 'imagify' );
if ( $process->has_webp() ) {
$has_webp = $process->is_full_webp() ? __( 'Yes', 'imagify' ) : __( 'Partially', 'imagify' );
}
$output .= $output_before . '<span class="data">' . __( 'WebP generated:', 'imagify' ) . '</span> <strong class="big">' . esc_html( $has_webp ) . '</strong>' . $output_after;
$total_optimized_thumbnails = $data->get_optimized_sizes_count();
if ( $total_optimized_thumbnails ) {
$output .= $output_before . '<span class="data">' . __( 'Thumbnails Optimized:', 'imagify' ) . '</span> <strong>' . $total_optimized_thumbnails . '</strong>' . $output_after;
$output .= $output_before . '<span class="data">' . __( 'Overall Saving:', 'imagify' ) . '</span> <strong>' . $data->get_overall_saving_percent() . '%</strong>' . $output_after;
}
}
// End of list.
$output .= $is_media_page ? '' : '</ul>';
// Actions section.
$output .= $is_media_page ? $output_before : '';
$output .= $reoptimize_output_before;
$output .= $reoptimize_output;
if ( $media->has_backup() ) {
$url = get_imagify_admin_url( 'restore', [
'attachment_id' => $attachment_id,
'context' => $media->get_context(),
] );
$output .= Imagify_Views::get_instance()->get_template( 'button/restore', [
'url' => $url,
'atts' => [
'class' => $is_media_page ? '' : null,
],
] );
if ( ! $is_library_page ) {
$output .= '<input id="imagify-original-src" type="hidden" value="' . esc_url( $media->get_backup_url() ) . '">';
$output .= '<input id="imagify-original-size" type="hidden" value="' . $data->get_original_size() . '">';
$output .= '<input id="imagify-full-src" type="hidden" value="' . esc_url( $media->get_fullsize_url() ) . '">';
if ( $media->is_image() ) {
$dimensions = $media->get_dimensions();
$output .= '<input id="imagify-full-width" type="hidden" value="' . $dimensions['width'] . '">';
$output .= '<input id="imagify-full-height" type="hidden" value="' . $dimensions['height'] . '">';
}
}
}
$output .= $reoptimize_output_after;
return $output;
}
/**
* Get the error message for a specific attachment.
*
* @since 1.0
* @since 1.9 Function signature changed.
* @author Jonathan Buttigieg
*
* @param ProcessInterface $process The optimization process object.
* @return string The output to print.
*/
function get_imagify_attachment_error_text( $process ) {
if ( ! $process->is_valid() ) {
return '';
}
$data = $process->get_data()->get_optimization_data();
if ( ! isset( $data['sizes']['full']['success'] ) || $data['sizes']['full']['success'] ) {
return '';
}
$class = 'button';
$media = $process->get_media();
$url = get_imagify_admin_url( 'optimize', [
'attachment_id' => $media->get_id(),
'context' => $media->get_context(),
] );
if ( ! Imagify_Views::get_instance()->is_media_page() ) {
$class .= ' button-imagify-optimize';
}
return Imagify_Views::get_instance()->get_template( 'button/retry-optimize', [
'url' => $url,
'error' => $data['sizes']['full']['error'],
'atts' => [
'class' => $class,
],
] );
}
/**
* Get the re-optimize link for a specific attachment.
*
* @since 1.0
* @since 1.9 Function signature changed.
* @author Jonathan Buttigieg
*
* @param ProcessInterface $process The optimization process object.
* @return string The output to print.
*/
function get_imagify_attachment_reoptimize_link( $process ) {
if ( ! $process->is_valid() ) {
return '';
}
$data = $process->get_data();
if ( ! $data->get_optimization_status() ) {
// Not optimized yet.
return '';
}
// Stop the process if the API key isn't valid.
if ( ! Imagify_Requirements::is_api_key_valid() ) {
return '';
}
$is_already_optimized = $data->is_already_optimized();
$media = $process->get_media();
$can_reoptimize = $is_already_optimized || $media->has_backup();
// Don't display anything if there is no backup or the image has been optimized.
if ( ! $can_reoptimize ) {
return '';
}
$output = '';
$views = Imagify_Views::get_instance();
$media_level = $data->get_optimization_level();
$data = [];
$url_args = [
'attachment_id' => $media->get_id(),
'context' => $media->get_context(),
];
if ( Imagify_Views::get_instance()->is_media_page() ) {
$data['atts'] = [
'class' => '',
];
}
if ( $media_level < 1 ) {
$url_args['optimization_level'] = 2;
$data['optimization_level'] = 2;
$data['url'] = get_imagify_admin_url( 'manual-reoptimize', $url_args );
$output .= $views->get_template( 'button/re-optimize', $data );
} elseif ( $media_level > 0 ) {
$url_args['optimization_level'] = 0;
$data['optimization_level'] = 0;
$data['url'] = get_imagify_admin_url( 'manual-reoptimize', $url_args );
$output .= $views->get_template( 'button/re-optimize', $data );
}
return $output;
}
/**
* Get the link to optimize missing thumbnail sizes for a specific attachment.
*
* @since 1.6.10
* @since 1.9 Function signature changed.
* @author Grégory Viguier
*
* @param ProcessInterface $process The optimization process object.
* @return string The output to print.
*/
function get_imagify_attachment_optimize_missing_thumbnails_link( $process ) {
if ( ! $process->is_valid() ) {
return '';
}
$media = $process->get_media();
if ( ! $media->is_image() || ! Imagify_Requirements::is_api_key_valid() || ! $media->has_backup() ) {
return '';
}
$context = $media->get_context();
/**
* Allow to not display the "Optimize missing thumbnails" link.
*
* @since 1.6.10
* @since 1.9 The $attachment object is replaced by a $process object.
* @author Grégory Viguier
*
* @param bool $display True to display the link. False to not display it.
* @param ProcessInterface $process The optimization process object.
* @param string $context The context.
*/
$display = apply_filters( 'imagify_display_missing_thumbnails_link', true, $process, $context );
// Stop the process if the filter is false.
if ( ! $display ) {
return '';
}
$missing_sizes = $process->get_missing_sizes();
if ( ! $missing_sizes || is_wp_error( $missing_sizes ) ) {
return '';
}
$url = get_imagify_admin_url( 'optimize-missing-sizes', [
'attachment_id' => $media->get_id(),
'context' => $context,
] );
return Imagify_Views::get_instance()->get_template( 'button/optimize-missing-sizes', [
'url' => $url,
'count' => count( $missing_sizes ),
] );
}
/**
* Get the link to generate WebP versions if they are missing.
*
* @since 1.9
* @author Grégory Viguier
*
* @param ProcessInterface $process The optimization process object.
* @return string The output to print.
*/
function get_imagify_attachment_generate_webp_versions_link( $process ) {
if ( ! $process->is_valid() ) {
return '';
}
if ( ! get_imagify_option( 'convert_to_webp' ) ) {
return '';
}
$media = $process->get_media();
if ( ! $media->is_image() || ! Imagify_Requirements::is_api_key_valid() || ! $media->has_backup() ) {
return '';
}
if ( 'image/webp' === $media->get_mime_type() ) {
return '';
}
$data = $process->get_data();
if ( ! $data->is_optimized() && ! $data->is_already_optimized() ) {
return '';
}
if ( $process->has_webp() ) {
return '';
}
$context = $media->get_context();
/**
* Allow to not display the "Generate WebP versions" link.
*
* @since 1.9
* @author Grégory Viguier
*
* @param bool $display True to display the link. False to not display it.
* @param ProcessInterface $process The optimization process object.
* @param string $context The context.
*/
$display = apply_filters( 'imagify_display_generate_webp_versions_link', true, $process, $context );
// Stop the process if the filter is false.
if ( ! $display ) {
return '';
}
$url = get_imagify_admin_url( 'generate-webp-versions', [
'attachment_id' => $media->get_id(),
'context' => $context,
] );
$output = Imagify_Views::get_instance()->get_template( 'button/generate-webp', [
'url' => $url,
] );
return $output . '<br/>';
}
/**
* Get the link to delete WebP versions when the status is "already_optimized".
*
* @since 1.9.6
* @author Grégory Viguier
*
* @param ProcessInterface $process The optimization process object.
* @return string The output to print.
*/
function get_imagify_attachment_delete_webp_versions_link( $process ) {
if ( ! $process->is_valid() ) {
return '';
}
$media = $process->get_media();
$context = $media->get_context();
$media_id = $media->get_id();
if ( ! imagify_get_context( $context )->current_user_can( 'manual-restore', $media_id ) ) {
imagify_die();
}
$data = $process->get_data();
if ( ! $data->is_already_optimized() || ! $process->has_webp() ) {
return '';
}
$class = '';
$url = get_imagify_admin_url( 'delete-webp-versions', [
'attachment_id' => $media_id,
'context' => $context,
] );
if ( ! Imagify_Views::get_instance()->is_media_page() ) {
$class .= 'button-imagify-delete-webp';
}
return Imagify_Views::get_instance()->get_template( 'button/delete-webp', [
'url' => $url,
'atts' => [
'class' => $class,
],
] );
}
/**
* Get all data to diplay for a specific media.
*
* @since 1.2
* @since 1.9 Function signature changed.
* @author Jonathan Buttigieg
*
* @param ProcessInterface $process The optimization process object.
* @param bool $with_container Set to false to not return the HTML container.
* @return string The output to print.
*/
function get_imagify_media_column_content( $process, $with_container = true ) {
if ( ! $process->is_valid() ) {
return __( 'This media is not valid.', 'imagify' );
}
if ( ! $process->current_user_can( 'manual-optimize' ) ) {
return __( 'You are not allowed to optimize this file.', 'imagify' );
}
$media = $process->get_media();
// Check if the media is supported.
if ( ! $media->is_supported() ) {
return __( 'This media is not supported.', 'imagify' );
}
// Check if the media has the required WP data.
if ( ! $media->has_required_media_data() ) {
return __( 'This media lacks the required metadata and cannot be optimized.', 'imagify' );
}
$data = $process->get_data();
// Check if the API key is valid.
if ( ! Imagify_Requirements::is_api_key_valid() && ! $data->is_optimized() ) {
$output = __( 'Invalid API key', 'imagify' );
$output .= '<br/>';
$output .= '<a href="' . esc_url( get_imagify_admin_url() ) . '">' . __( 'Check your Settings', 'imagify' ) . '</a>';
return $output;
}
$media_id = $media->get_id();
$context = $media->get_context();
$views = Imagify_Views::get_instance();
$is_locked = $process->is_locked();
if ( $is_locked ) {
switch ( $is_locked ) {
case 'optimizing':
$lock_label = __( 'Optimizing...', 'imagify' );
break;
case 'restoring':
$lock_label = __( 'Restoring...', 'imagify' );
break;
default:
$lock_label = __( 'Processing...', 'imagify' );
}
if ( ! $with_container ) {
return $views->get_template( 'button/processing', [ 'label' => $lock_label ] );
}
return $views->get_template( 'container/data-actions', [
'media_id' => $media_id,
'context' => $context,
'content' => $views->get_template( 'button/processing', [ 'label' => $lock_label ] ),
] );
}
// Check if the image was optimized.
if ( ! $data->get_optimization_status() ) {
$output = Imagify_Views::get_instance()->get_template( 'button/optimize', [
'url' => get_imagify_admin_url( 'manual-optimize', [
'attachment_id' => $media_id,
'context' => $context,
] ),
] );
if ( $media->has_backup() ) {
$output .= '<span class="attachment-has-backup hidden"></span>';
}
} else {
$output = get_imagify_attachment_optimization_text( $process );
}
if ( ! $with_container ) {
return $output;
}
return $views->get_template( 'container/data-actions', [
'media_id' => $media_id,
'context' => $context,
'content' => $output,
] );
}