| 1 |
<?php |
| 2 |
/** |
| 3 |
* Media component for the settings page |
| 4 |
*/ |
| 5 |
|
| 6 |
$key_option = sanitize_key( $data['name'] ); |
| 7 |
|
| 8 |
if( isset( $key_option, $_POST[ $key_option ] ) ) { |
| 9 |
update_option( $key_option, sanitize_text_field( $_POST[ $key_option ] ) ); |
| 10 |
} |
| 11 |
|
| 12 |
wp_enqueue_media(); |
| 13 |
$is_multiple = isset( $data['multiple'] ) && $data['multiple'] === true ? 'true' : 'false'; |
| 14 |
$image_preview_template = '<img src="%s" title="%s" class="media-preview-image">'; |
| 15 |
|
| 16 |
$medias_string = isset( $key_option ) ? get_option( $key_option, '' ) : ''; |
| 17 |
$medias = $medias_string ? explode( ',', $medias_string ) : array(); |
| 18 |
?> |
| 19 |
<div class="quickwebp-media-input-container"> |
| 20 |
<div id="<?php echo esc_attr( $key_option ?? '' ); ?>_is_empty" class="quickwebp-media-input--is-empty" style="display: <?php echo !empty($medias) ? 'none' : 'block'; ?>"> |
| 21 |
<?php _e( 'No image selected', QUICKWEBP_TEXT_DOMAIN ); ?> |
| 22 |
</div> |
| 23 |
<input |
| 24 |
type="hidden" |
| 25 |
name="<?php echo esc_attr( $key_option ?? '' ); ?>" |
| 26 |
id="<?php echo esc_attr( $key_option ?? '' ); ?>" |
| 27 |
value="<?php echo esc_attr( $medias_string ); ?>" |
| 28 |
> |
| 29 |
<div id="<?php echo esc_attr( $key_option ?? '' ); ?>_medias-selected" class="quickwebp-medias-selected-container"> |
| 30 |
<?php |
| 31 |
foreach( $medias as $media_id ) { |
| 32 |
$media = get_post( $media_id ); |
| 33 |
if( $media ) { |
| 34 |
if( wp_attachment_is_image( $media_id ) ) { |
| 35 |
echo wp_kses_post( sprintf( $image_preview_template, wp_get_attachment_image_url( $media_id, 'thumbnail' ), $media->post_title ) ); |
| 36 |
} else { |
| 37 |
echo wp_kses_post( sprintf( $image_preview_template, wp_mime_type_icon( $media->post_mime_type ), $media->post_title ) ); |
| 38 |
} |
| 39 |
} |
| 40 |
} |
| 41 |
?> |
| 42 |
</div> |
| 43 |
<input type="button" |
| 44 |
name="<?php echo esc_attr( $key_option ?? '' ); ?>_button" |
| 45 |
id="<?php echo esc_attr( $key_option ?? '' ); ?>_button" |
| 46 |
class="button button-secondary" |
| 47 |
value="<?php echo esc_attr( $data['button_text'] ?? __( 'Select media', QUICKWEBP_TEXT_DOMAIN ) ); ?>" |
| 48 |
> |
| 49 |
<input type="button" |
| 50 |
name="<?php echo esc_attr( $key_option ?? '' ); ?>_remove_button" |
| 51 |
id="<?php echo esc_attr( $key_option ?? '' ); ?>_remove_button" |
| 52 |
class="button button-secondary button-remove-media" |
| 53 |
value="<?php echo esc_attr( $data['remove_button_text'] ?? __( 'Remove medias', QUICKWEBP_TEXT_DOMAIN ) ); ?>" |
| 54 |
<?php echo empty( $medias ) ? 'disabled' : ''; ?> |
| 55 |
> |
| 56 |
</div> |
| 57 |
|
| 58 |
<script type="text/javascript"> |
| 59 |
jQuery(document).ready(function($){ |
| 60 |
const id = '<?php echo esc_attr( $key_option ?? '' ); ?>'; |
| 61 |
const media_template_preview = '<?php echo wp_kses_post($image_preview_template); ?>'; |
| 62 |
jQuery( "#" + id + "_button" ).click(function(e) { |
| 63 |
e.preventDefault(); |
| 64 |
var image = wp.media({ |
| 65 |
title: '<?php echo esc_attr( $data['button_text'] ?? __( 'Select media', QUICKWEBP_TEXT_DOMAIN ) ); ?>', |
| 66 |
multiple: <?php echo esc_attr( $is_multiple ); ?> |
| 67 |
}) |
| 68 |
|
| 69 |
image.on('select', function(e){ |
| 70 |
const medias = image.state().get('selection').toJSON(); |
| 71 |
let selected_medias_preview = ''; |
| 72 |
let medias_ids = ''; |
| 73 |
medias.forEach( media => { |
| 74 |
medias_ids = medias_ids === '' ? media.id : medias_ids + ',' + media.id; |
| 75 |
let preview_image = ''; |
| 76 |
if( media.type === 'image' ) { |
| 77 |
preview_image = media.sizes.thumbnail.url; |
| 78 |
} else { |
| 79 |
preview_image = media.icon; |
| 80 |
} |
| 81 |
selected_medias_preview += media_template_preview.replace( '%s', preview_image ).replace( '%s', media.title ); |
| 82 |
}); |
| 83 |
jQuery( "#" + id + "_medias-selected" ).html( selected_medias_preview ); |
| 84 |
jQuery( "#" + id ).val( medias_ids ); |
| 85 |
|
| 86 |
jQuery( "#" + id + "_remove_button" ).prop( 'disabled', false ); |
| 87 |
jQuery( '#' + id + "_is_empty" ).hide(); |
| 88 |
}); |
| 89 |
|
| 90 |
image.on('open', function(e){ |
| 91 |
const medias_ids = jQuery( "#" + id ).val(); |
| 92 |
if( medias_ids !== '' ) { |
| 93 |
const medias = medias_ids.split(','); |
| 94 |
const selection = image.state().get('selection'); |
| 95 |
medias.forEach( media_id => { |
| 96 |
const media = wp.media.attachment( media_id ); |
| 97 |
media.fetch(); |
| 98 |
selection.add( media ? [ media ] : [] ); |
| 99 |
}); |
| 100 |
} |
| 101 |
}); |
| 102 |
|
| 103 |
image.open(); |
| 104 |
|
| 105 |
}); |
| 106 |
|
| 107 |
jQuery( "#" + id + "_remove_button" ).click(function(e) { |
| 108 |
e.preventDefault(); |
| 109 |
jQuery( "#" + id + "_medias-selected" ).html( '' ); |
| 110 |
jQuery( "#" + id ).val( '' ); |
| 111 |
|
| 112 |
jQuery( "#" + id + "_remove_button" ).attr( 'disabled', 'disabled' ); |
| 113 |
jQuery( '#' + id + "_is_empty" ).show(); |
| 114 |
}); |
| 115 |
}); |
| 116 |
</script> |