319 lines
12 KiB
PHP
319 lines
12 KiB
PHP
<?php
|
|
/* Prohibit direct script loading */
|
|
defined('ABSPATH') || die('No direct script access allowed!');
|
|
|
|
/**
|
|
* Class WpmfSingleLightbox
|
|
* This class that holds most of the single lightbox functionality for Media Folder.
|
|
*/
|
|
class WpmfSingleLightbox
|
|
{
|
|
|
|
/**
|
|
* Wpmf_Single_Lightbox constructor.
|
|
*/
|
|
public function __construct()
|
|
{
|
|
add_action('wp_enqueue_media', array($this, 'loadScript'));
|
|
add_action('wp_enqueue_scripts', array($this, 'enqueueScript'));
|
|
add_action('enqueue_block_editor_assets', array($this, 'addEditorAssets'));
|
|
add_filter('attachment_fields_to_edit', array($this, 'attachmentFieldsToEdit'), 10, 2);
|
|
add_filter('attachment_fields_to_save', array($this, 'attachmentFieldsToSave'), 10, 2);
|
|
add_filter('image_send_to_editor', array($this, 'imageLightboxSendToEditor'), 10, 8);
|
|
add_action('print_media_templates', array($this, 'printMediaTemplates'));
|
|
add_action('wp_ajax_wpmf_get_thumb_image', array($this, 'getThumbImage'));
|
|
}
|
|
|
|
/**
|
|
* Enqueue styles and scripts for gutenberg
|
|
*
|
|
* @return void
|
|
*/
|
|
public function addEditorAssets()
|
|
{
|
|
wp_enqueue_script(
|
|
'wpmf_lightbox_blocks',
|
|
WPMF_PLUGIN_URL . 'assets/js/blocks/image_lightbox/block.js',
|
|
array('wp-blocks', 'wp-i18n', 'wp-element', 'wp-data', 'wp-block-editor'),
|
|
WPMF_VERSION
|
|
);
|
|
|
|
$sizes = apply_filters('image_size_names_choose', array(
|
|
'thumbnail' => __('Thumbnail', 'wpmf'),
|
|
'medium' => __('Medium', 'wpmf'),
|
|
'large' => __('Large', 'wpmf'),
|
|
'full' => __('Full Size', 'wpmf'),
|
|
));
|
|
$params = array(
|
|
'l18n' => array(
|
|
'block_image_lightbox_title' => __('WP Media Folder Image Lightbox', 'wpmf'),
|
|
),
|
|
'vars' => array(
|
|
'sizes' => $sizes
|
|
)
|
|
);
|
|
|
|
wp_localize_script('wpmf_lightbox_blocks', 'wpmf_lightbox_blocks', $params);
|
|
}
|
|
|
|
/**
|
|
* Add script to footer
|
|
*
|
|
* @return void
|
|
*/
|
|
public function adminFooterImagelightbox()
|
|
{
|
|
?>
|
|
<script type="text/javascript">
|
|
jQuery(function ($) {
|
|
if (wp && wp.media && wp.media.events) {
|
|
wp.media.events.on('editor:image-edit', function (data) {
|
|
data.metadata.wpmf_image_lightbox =
|
|
data.editor.dom.getAttrib(data.image, 'data-wpmf_image_lightbox');
|
|
data.metadata.wpmf_size_lightbox =
|
|
data.editor.dom.getAttrib(data.image, 'data-wpmf_size_lightbox');
|
|
data.metadata.wpmflightbox = data.editor.dom.getAttrib(data.image, 'data-wpmflightbox');
|
|
});
|
|
wp.media.events.on('editor:image-update', function (data) {
|
|
if (data.metadata.link === 'file' && data.metadata.wpmf_size_lightbox !== 'none') {
|
|
data.editor.dom.setAttrib(data.image, 'data-wpmflightbox', 1);
|
|
} else {
|
|
data.editor.dom.setAttrib(data.image, 'data-wpmflightbox', 0);
|
|
}
|
|
$.ajax({
|
|
url: ajaxurl,
|
|
method: 'POST',
|
|
dataType: 'json',
|
|
data: {
|
|
action: "wpmf_get_thumb_image",
|
|
attachment_id: data.metadata.attachment_id,
|
|
size: data.metadata.wpmf_size_lightbox,
|
|
wpmf_nonce: wpmf.vars.wpmf_nonce
|
|
},
|
|
success: function (res) {
|
|
if (res.status) {
|
|
data.editor.dom.setAttrib(data.image, 'data-wpmf_image_lightbox', res.url_thumb);
|
|
data.editor.dom.setAttrib(
|
|
data.image,
|
|
'data-wpmf_size_lightbox',
|
|
data.metadata.wpmf_size_lightbox
|
|
);
|
|
}
|
|
}
|
|
});
|
|
});
|
|
}
|
|
});
|
|
</script>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Add script to footer
|
|
*
|
|
* @return void
|
|
*/
|
|
public function loadScript()
|
|
{
|
|
wp_enqueue_script(
|
|
'wpmf-singleimage-lightbox',
|
|
plugins_url('/assets/js/single_image_lightbox/image_lightbox.js', dirname(__FILE__)),
|
|
array('jquery'),
|
|
WPMF_VERSION
|
|
);
|
|
add_action('admin_footer', array($this, 'adminFooterImagelightbox'), 11);
|
|
add_action('wp_footer', array($this, 'adminFooterImagelightbox'), 11);
|
|
}
|
|
|
|
/**
|
|
* Load styles and scripts
|
|
*
|
|
* @return void
|
|
*/
|
|
public function enqueueScript()
|
|
{
|
|
wp_enqueue_script(
|
|
'wpmf-gallery-popup',
|
|
plugins_url('/assets/js/display-gallery/jquery.magnific-popup.min.js', dirname(__FILE__)),
|
|
array('jquery'),
|
|
'0.9.9',
|
|
true
|
|
);
|
|
wp_enqueue_script(
|
|
'wpmf-singleimage-lightbox',
|
|
plugins_url('/assets/js/single_image_lightbox/single_image_lightbox.js', dirname(__FILE__)),
|
|
array('jquery'),
|
|
WPMF_VERSION
|
|
);
|
|
wp_enqueue_style(
|
|
'wpmf-singleimage-popup-style',
|
|
plugins_url('/assets/css/display-gallery/magnific-popup.css', dirname(__FILE__)),
|
|
array(),
|
|
'0.9.9'
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Ajax get thumbnail for image
|
|
*
|
|
* @return void
|
|
*/
|
|
public function getThumbImage()
|
|
{
|
|
if (empty($_POST['wpmf_nonce'])
|
|
|| !wp_verify_nonce($_POST['wpmf_nonce'], 'wpmf_nonce')) {
|
|
die();
|
|
}
|
|
|
|
if (isset($_POST['attachment_id']) && isset($_POST['size'])) {
|
|
$image_src = wp_get_attachment_image_src($_POST['attachment_id'], $_POST['size']);
|
|
$url_image = $image_src[0];
|
|
wp_send_json(array('status' => true, 'url_thumb' => $url_image));
|
|
}
|
|
wp_send_json(array('status' => false));
|
|
}
|
|
|
|
/**
|
|
* Add media templates
|
|
*
|
|
* @return void
|
|
*/
|
|
public function printMediaTemplates()
|
|
{
|
|
// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- No action, nonce is not required
|
|
if (isset($_GET['action']) && $_GET['action'] === 'elementor') {
|
|
return;
|
|
}
|
|
?>
|
|
|
|
<script type="text/html" id="tmpl-image-wpmf">
|
|
<label class="setting wpmf_size_lightbox">
|
|
<span><?php esc_html_e('Lightbox size', 'wpmf'); ?></span>
|
|
<select class="wpmf_size_lightbox" name="wpmf_size_lightbox" data-setting="wpmf_size_lightbox">
|
|
<option value="none"><?php esc_html_e('None', 'wpmf') ?></option>
|
|
<?php
|
|
$sizes = apply_filters('image_size_names_choose', array(
|
|
'none' => __('None', 'wpmf'),
|
|
'thumbnail' => __('Thumbnail', 'wpmf'),
|
|
'medium' => __('Medium', 'wpmf'),
|
|
'large' => __('Large', 'wpmf'),
|
|
'full' => __('Full Size', 'wpmf'),
|
|
));
|
|
?>
|
|
|
|
<?php foreach ($sizes as $k => $v) : ?>
|
|
<option value="<?php echo esc_html($k) ?>"><?php echo esc_html($v) ?></option>
|
|
<?php endforeach; ?>
|
|
|
|
</select>
|
|
</label>
|
|
</script>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Filters the image HTML markup to send to the editor when inserting an image.
|
|
*
|
|
* @param string $html The image HTML markup to send.
|
|
* @param integer $id The attachment id.
|
|
* @param string $caption The image caption.
|
|
* @param string $title The image title.
|
|
* @param string $align The image alignment.
|
|
* @param string $url The image source URL.
|
|
* @param string|array $size Size of image. Image size or array of width and height values
|
|
* @param string $alt The image alternative, or alt, text.
|
|
*
|
|
* @return string $html
|
|
*/
|
|
public function imageLightboxSendToEditor($html, $id, $caption, $title, $align, $url, $size, $alt = '')
|
|
{
|
|
if (isset($url) && $url !== '') {
|
|
$url_attachment = wp_get_attachment_url($id);
|
|
$lightbox_size = get_post_meta($id, 'wpmf_image_lightbox', true);
|
|
if (empty($lightbox_size)) {
|
|
$lightbox_size = 'large';
|
|
}
|
|
|
|
// check link to option, if value not empty do set attribute
|
|
if ($url_attachment !== $url || $size === 'none') {
|
|
return $html;
|
|
}
|
|
|
|
$lightbox_url = wp_get_attachment_image_url($id, $lightbox_size);
|
|
$html_array = array();
|
|
$arrs = explode('<img ', $html);
|
|
$html_array[] = $arrs[0];
|
|
$html_array[] = '<img';
|
|
$html_array[] = 'data-wpmf_image_lightbox="'. $lightbox_url .'"';
|
|
$html_array[] = 'data-wpmf_size_lightbox="'. $size .'"';
|
|
$html_array[] = 'data-wpmflightbox="1"';
|
|
$html_array[] = $arrs[1];
|
|
$html = implode(' ', $html_array);
|
|
$html = str_replace($url, $lightbox_url, $html);
|
|
$html = str_replace('wp-image-'. $id, 'wp-image-'. $id .' wpmf_image_lightbox', $html);
|
|
}
|
|
|
|
return $html;
|
|
}
|
|
|
|
/**
|
|
* Create lightbox size field
|
|
* Based on /wp-admin/includes/media.php
|
|
*
|
|
* @param array $form_fields An array of attachment form fields.
|
|
* @param WP_Post $post The WP_Post attachment object.
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public function attachmentFieldsToEdit($form_fields, $post)
|
|
{
|
|
$value = get_post_meta($post->ID, 'wpmf_image_lightbox', true);
|
|
if (empty($value)) {
|
|
$value = 'large';
|
|
}
|
|
$sizes = apply_filters('image_size_names_choose', array(
|
|
'thumbnail' => __('Thumbnail', 'wpmf'),
|
|
'medium' => __('Medium', 'wpmf'),
|
|
'large' => __('Large', 'wpmf'),
|
|
'full' => __('Full Size', 'wpmf'),
|
|
));
|
|
$option = '';
|
|
$option .= '<option value="none">' . __('None', 'wpmf') . '</option>';
|
|
foreach ($sizes as $k => $v) {
|
|
if ($value === $k) {
|
|
$option .= '<option selected value="' . $k . '">' . $v . '</option>';
|
|
} else {
|
|
$option .= '<option value="' . $k . '">' . $v . '</option>';
|
|
}
|
|
}
|
|
$form_fields['wpmf_image_lightbox'] = array(
|
|
'label' => __('Lightbox size', 'wpmf'),
|
|
'input' => 'html',
|
|
'html' => '
|
|
<select name="attachments[' . $post->ID . '][wpmf_image_lightbox]"
|
|
id="attachments[' . $post->ID . '][wpmf_image_lightbox]">
|
|
' . $option . '
|
|
</select>'
|
|
);
|
|
|
|
return $form_fields;
|
|
}
|
|
|
|
/**
|
|
* Save lightbox size field
|
|
* Based on /wp-admin/includes/media.php
|
|
*
|
|
* @param array $post An array of post data.
|
|
* @param array $attachment An array of attachment metadata.
|
|
*
|
|
* @return mixed $post
|
|
*/
|
|
public function attachmentFieldsToSave($post, $attachment)
|
|
{
|
|
if (isset($attachment['wpmf_image_lightbox'])) {
|
|
update_post_meta($post['ID'], 'wpmf_image_lightbox', $attachment['wpmf_image_lightbox']);
|
|
}
|
|
return $post;
|
|
}
|
|
}
|