| Server IP : 104.21.74.147 / Your IP : 216.73.217.154 Web Server : nginx/1.24.0 System : Linux wordpress-sites 6.8.0-134-generic #134-Ubuntu SMP PREEMPT_DYNAMIC Fri Jun 26 18:43:11 UTC 2026 x86_64 User : www-data ( 33) PHP Version : 8.1.34 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /var/www/rebeccaone.com/wp-content/plugins/envira-gallery/src/Functions/ |
Upload File : |
<?php
/**
* Envira Gallery Functions.
*
* @since 1.7.0
*
* @package Envira_Gallery
* @author Envira Gallery Team <[email protected]>
*/
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Get the Gallery Object.
*
* @since 1.7.0
*
* @access public
* @param mixed $gallery_id Gallery ID.
* @param boolean $flush_cache Flush Cache.
* @return array
*/
function envira_get_gallery( $gallery_id, $flush_cache = false ) {
$gallery = get_transient( '_eg_cache_' . $gallery_id );
// Attempt to return the transient first, otherwise generate the new query to retrieve the data.
if ( true === $flush_cache || false === $gallery ) {
$gallery = _envira_get_gallery( $gallery_id );
if ( $gallery ) {
$expiration = envira_get_transient_expiration_time();
set_transient( '_eg_cache_' . $gallery_id, $gallery, $expiration );
}
}
// Return the gallery data.
return $gallery;
}
/**
* Internal method that returns a gallery based on ID.
*
* @since 1.7.0
*
* @param int $gallery_id The gallery ID used to retrieve a gallery.
* @return array|bool Array of gallery data or false if none found.
*/
function _envira_get_gallery( $gallery_id ) {
$meta = get_post_meta( $gallery_id, '_eg_gallery_data', true );
/**
* Version 1.2.1+: Check if $meta has a value - if not, we may be using a Post ID but the gallery
* has moved into the Envira CPT
*/
if ( empty( $meta ) ) {
$gallery_id = get_post_meta( $gallery_id, '_eg_gallery_id', true );
$meta = get_post_meta( $gallery_id, '_eg_gallery_data', true );
}
return $meta;
}
/**
* Envira_get_gallery_by_slug function.
*
* @since 1.7.0
*
* @access public
* @param string $slug Gallery Slug.
* @return array
*/
function envira_get_gallery_by_slug( $slug ) {
// Attempt to return the transient first, otherwise generate the new query to retrieve the data.
$gallery = get_transient( '_eg_cache_' . $slug );
if ( false === $gallery ) {
$gallery = _envira_get_gallery_by_slug( $slug );
if ( $gallery ) {
$expiration = envira_get_transient_expiration_time();
set_transient( '_eg_cache_' . $slug, $gallery, $expiration );
}
}
// Return the gallery data.
return $gallery;
}
/**
* _envira_get_gallery_by_slug function.
*
* @since 1.7.0
*
* @access private
* @param string $slug Gallery Slug.
* @return boolean
*/
function _envira_get_gallery_by_slug( $slug ) {
// Get Envira CPT by slug.
$galleries = new WP_Query(
[
'post_type' => 'envira',
'name' => $slug,
'fields' => 'ids',
'posts_per_page' => 1,
]
);
if ( $galleries->posts ) {
return get_post_meta( $galleries->posts[0], '_eg_gallery_data', true );
}
// Get Envira CPT by meta-data field (yeah this is an edge case dealing with slugs in shortcode and modified slug in the misc tab of the gallery).
$galleries = new WP_Query(
[
'post_type' => 'envira',
'meta_key' => 'envira_gallery_slug',
'meta_value' => $slug, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
'fields' => 'ids',
'posts_per_page' => 1,
]
);
if ( $galleries->posts ) {
return get_post_meta( $galleries->posts[0], '_eg_gallery_data', true );
}
// If nothing found, get Envira CPT by _eg_gallery_old_slug.
// This covers Galleries migrated from Pages/Posts --> Envira CPTs.
$galleries = new WP_Query(
[
'post_type' => 'envira',
'no_found_rows' => true,
'cache_results' => false,
'fields' => 'ids',
'meta_query' => [ // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
[
'key' => '_eg_gallery_old_slug',
'value' => $slug,
],
],
'posts_per_page' => 1,
]
);
if ( $galleries->posts ) {
return get_post_meta( $galleries->posts[0], '_eg_gallery_data', true );
}
// No galleries found.
return false;
}
/**
* Envira Get Galleries function.
*
* @since 1.7.0
*
* @access public
* @param bool $skip_empty (default: true).
* @param bool $ignore_cache (default: false).
* @param string $search_terms (default: '').
* @return array
*/
function envira_get_galleries( $skip_empty = true, $ignore_cache = false, $search_terms = '' ) {
$galleries = get_transient( '_eg_cache_all' );
// Attempt to return the transient first, otherwise generate the new query to retrieve the data.
if ( $ignore_cache || ! empty( $search_terms ) || false === $galleries ) {
$galleries = _envira_get_galleries( $skip_empty, $search_terms );
// Cache the results if we're not performing a search and we have some results.
if ( $galleries && empty( $search_terms ) ) {
$expiration = envira_get_transient_expiration_time();
set_transient( '_eg_cache_all', $galleries, $expiration );
}
}
// Return the gallery data.
return $galleries;
}
/**
* Envira Get Galleries function but just the title and ids.
*
* @since 1.7.0
*
* @access public
* @param bool $skip_empty (default: true).
* @param bool $ignore_cache (default: false).
* @param string $search_terms (default: '').
* @return array
*/
function envira_get_galleries_title_id( $skip_empty = true, $ignore_cache = false, $search_terms = '' ) {
$galleries = get_transient( '_eg_cache_title_id' );
// Attempt to return the transient first, otherwise generate the new query to retrieve the data.
if ( $ignore_cache || ! empty( $search_terms ) || false === $galleries ) {
$galleries_temp = _envira_get_galleries( $skip_empty, $search_terms );
// Cache the results if we're not performing a search and we have some results.
if ( $galleries_temp && empty( $search_terms ) ) {
$galleries = [];
foreach ( $galleries_temp as $key => $gallery ) {
if ( isset( $gallery['id'], $gallery['config']['title'] ) ) {
$galleries[ $gallery['id'] ] = $gallery['config']['title'];
}
}
// order galleries by title.
natcasesort( $galleries );
$expiration = envira_get_transient_expiration_time();
set_transient( '_eg_cache_title_id', $galleries, $expiration );
}
}
// Return the gallery data.
return $galleries;
}
/**
* Envira Get Galleries function.
*
* @since 1.7.0
*
* @access public
* @param bool $skip_empty (default: true).
* @param string $search_terms (default: '').
* @param int $posts_per_page (default: 99).
* @param string $orderby (default: post_date).
* @param string $order (default: DESC).
* @return $ret array Gallery data.
*/
function _envira_get_galleries( $skip_empty = true, $search_terms = '', $posts_per_page = 99, $orderby = 'post_date', $order = 'DESC' ) {
// Build WP_Query arguments.
$args = [
'post_type' => 'envira',
'post_status' => 'publish',
'posts_per_page' => $posts_per_page,
'no_found_rows' => true,
'fields' => 'ids',
'orderby' => $orderby,
'order' => $order,
'meta_query' => [ // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
[
'key' => '_eg_gallery_data',
'compare' => 'EXISTS',
],
],
];
// If search terms exist, add a search parameter to the arguments.
if ( ! empty( $search_terms ) ) {
$args['s'] = $search_terms;
}
// Run WP_Query.
$galleries = new WP_Query( $args );
if ( ! isset( $galleries->posts ) || empty( $galleries->posts ) ) {
return false;
}
// Now loop through all the galleries found and only use galleries that have images in them.
$ret = [];
foreach ( $galleries->posts as $id ) {
$data = get_post_meta( $id, '_eg_gallery_data', true );
// Skip empty galleries.
if ( $skip_empty && empty( $data['gallery'] ) ) {
continue;
}
// Skip default/dynamic gallery types.
$type = envira_get_config( 'type', $data );
if ( 'defaults' === $type || 'dynamic' === $type ) {
continue;
}
// Add title.
if ( isset( $data['config'] ) && is_array( $data['config'] ) ) {
$data['config']['title'] = get_the_title( $id );
}
// Add gallery to array of galleries.
$ret[ "$id" ] = $data;
}
// Return the gallery data.
return $ret;
}
/**
* Gallery image count function.
*
* @since 1.7.0
*
* @access public
* @param mixed $gallery_id Gallery Id.
* @return int
*/
function envira_get_gallery_image_count( $gallery_id ) {
$data = get_post_meta( $gallery_id, '_eg_gallery_data', true );
$gallery = apply_filters( 'envira_images_pre_data', $data, $gallery_id, false );
return ( isset( $gallery['gallery'] ) ? count( $gallery['gallery'] ) : 0 );
}
/**
* Returns full Gallery Config defaults to json object.
*
* @since 1.7.1
*
* @access public
* @param mixed $gallery_id Gallery Id.
* @param boolean $raw Raw.
* @param array $data Gallery Data.
* @param boolean $is_mobile Is mobile.
* @return string
*/
function envira_get_gallery_config( $gallery_id, $raw = false, $data = null, $is_mobile = false ) {
if ( ! isset( $gallery_id ) ) {
return false;
}
$images = [];
if ( ! empty( $data ) && ( 'dynamic' === $data['config']['type'] || 'default' === $data['config']['type'] ) ) {
$data = $data;
$original_data = $data;
} else {
$data = envira_get_gallery( $gallery_id );
$original_data = $data;
// temp hack: preserve keyboard and mousewheel settings (see 1980).
$keyboard = isset( $data['config']['keyboard'] ) ? $data['config']['keyboard'] : 1;
$mousewheel = isset( $data['config']['mousewheel'] ) ? $data['config']['mousewheel'] : 1;
// below filter makes keyboard 0 and makes mousewheel reappear as 0.
$data['config']['keyboard'] = $keyboard;
$data['config']['mousewheel'] = $mousewheel;
$data = apply_filters( 'envira_gallery_pre_data', $data, $gallery_id );
}
if ( ! isset( $data['config']['gallery_id'] ) && isset( $data['id'] ) ) {
$data['config']['gallery_id'] = $data['id'];
}
if ( $raw ) {
return $data['config'];
}
// Santitize Description.
if ( ! empty( $data['config']['description'] ) ) {
$data['config']['description'] = envira_santitize_description( $data['config']['description'] );
}
// Santitize Options
// Todo - create black/white list of options to santitize?
foreach ( $data['config'] as $key => $value ) {
$data['config'][ $key ] = envira_santitize_config_setting( $value, $key );
}
// This is a work-around for an edge case where mobile lightbox is enabled.
if ( 1 === intval( $is_mobile ) && 1 === intval( $data['config']['mobile_lightbox'] ) ) {
$data['config']['lightbox_enabled'] = 1;
}
// Add filter here for custom (or blocking) santitizing from addons.
$data = apply_filters( 'envira_get_gallery_config', $data, $original_data, $is_mobile );
// Disable/Remove FullScreen if Fullscreen addon is not present.
if ( ! class_exists( 'Envira_Fullscreen' ) ) {
if ( isset( $data['config']['open_fullscreen'] ) ) {
unset( $data['config']['open_fullscreen'] );
}
}
// Remove the download password if its set.
if ( isset( $data['config']['password_protection_download'] ) ) {
unset( $data['config']['password_protection_download'] );
}
// Disable/Remove Proofing if proofing addon is not present OR proofing isn't even activated.
if ( ! class_exists( 'Envira_Proofing' ) || empty( $data['config']['proofing'] ) || 0 === $data['config']['proofing'] ) {
foreach ( $data['config'] as $key => $value ) {
if ( strtolower( substr( $key, 0, 8 ) ) === 'proofing' ) {
unset( $data['config'][ $key ] );
}
}
if ( isset( $data['config']['proofing_submitted_message'] ) ) {
unset( $data['config']['proofing_submitted_message'] );
}
if ( isset( $data['config']['proofing_email_message'] ) ) {
unset( $data['config']['proofing_email_message'] );
}
if ( isset( $data['config']['proofing_email_subject'] ) ) {
unset( $data['config']['proofing_email_subject'] );
}
}
// Disable/Remove FullScreen if CSS addon is not present.
if ( ! function_exists( 'envira_custom_css_plugins_loaded' ) && isset( $data['config']['custom_css'] ) ) {
unset( $data['config']['custom_css'] );
}
// Auto Thumbnail Size Check.
$data = envira_maybe_set_thumbnail_size_auto( $data );
return wp_json_encode( $data['config'] );
}
/**
* General santitization of configuration settings
*
* @since 1.8.3
*
* @access public
* @param string $value The value.
* @param string $key The key.
* @return array
*/
function envira_santitize_config_setting( $value, $key ) {
/* at the moment we are only processing strings, either on their own or in arrays */
if ( 'custom_css' === $key ) {
/* Remove comments, updated for PHP 7.3 */
$regex = [
"`^([\t\s]+)`ism" => '',
'`^\/\*(.+?)\*\/`ism' => '',
'`(\A|[\n;]+)/\*.+?\*/`s' => '$1',
'`(\A|[;\s]+)//.+\R`' => "$1\n",
"`(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+`ism" => "\n",
];
$value = preg_replace( array_keys( $regex ), $regex, $value );
}
if ( gettype( $value ) === 'array' && ! empty( $value ) ) {
foreach ( $value as $array_key => $array_value ) {
if ( gettype( $array_value ) === 'string' ) {
$value[ $array_key ] = htmlentities( $array_value, ENT_QUOTES );
}
}
return $value;
}
if ( gettype( $value ) !== 'string' ) {
return $value;
}
return htmlentities( $value, ENT_QUOTES );
}
/**
* Main santitization function
*
* @since 1.8.3
*
* @access public
* @param string $value String value.
* @return array
*/
function envira_santitize_value( $value ) {
return htmlentities( $value, ENT_QUOTES );
}
/**
* Determine if lightbox width and height settings should be set to auto
*
* @since 1.8.3
*
* @access public
* @param array $data Gallery data.
* @return array
*/
function envira_maybe_set_thumbnail_size_auto( $data ) {
if ( isset( $data['config']['thumbnails_custom_size'] ) && 0 === $data['config']['thumbnails_custom_size'] ) {
$data['config']['thumbnails_width'] = 'auto';
$data['config']['thumbnails_height'] = 'auto';
}
// if this value 'thumbnails_custom_size' isn't set/exists, then this is a gallery created/updated before 1.8.3 so the width/height values should be honored.
return $data;
}
/**
* Santitize Gallery Captions As They Are Requested
* (This function has been depreciated)
*
* @since 1.7.1
*
* @access public
* @param string $caption The caption.
* @return string
*/
function envira_santitize_caption( $caption ) {
if ( empty( $caption ) ) {
return '';
}
return envira_santitize_everything( $caption );
}
/**
* Replace line breaks.
*
* @since 1.8.9.3
*
* @access public
* @param string $caption The caption.
* @return string
*/
function envira_replace_linebreaks_with_brs( $caption ) {
$caption = str_replace( [ "\r\n", "\r", "\n" ], '<br/>', $caption );
$caption = preg_replace( '/\<br\b[^>]*>/i', ' ', $caption );
return $caption;
}
/**
* Replacement for mb_detect_encoding if it doesn't exist
*
* @since 1.8.4.2
*
* @access public
*
* @param string $string_encoded Incoming string.
* @param string $enc Encoding.
* @param string $ret Return.
*
* @return result
*/
function envira_detect_encoding( $string_encoded, $enc = null, $ret = null ) {
static $enclist = [
'UTF-8',
'ASCII',
'ISO-8859-1',
'ISO-8859-2',
'ISO-8859-3',
'ISO-8859-4',
'ISO-8859-5',
'ISO-8859-6',
'ISO-8859-7',
'ISO-8859-8',
'ISO-8859-9',
'ISO-8859-10',
'ISO-8859-13',
'ISO-8859-14',
'ISO-8859-15',
'ISO-8859-16',
'Windows-1251',
'Windows-1252',
'Windows-1254',
];
$result = false;
foreach ( $enclist as $item ) {
$sample = iconv( $item, $item, $string_encoded );
if ( md5( $sample ) === md5( $string_encoded ) ) {
if ( null === $ret ) {
$result = $item;
} else {
$result = true; }
break;
}
}
return $result;
}
/**
* Santitize Lightbox Captions As They Are Requested
* (This function has been depreciated)
*
* @since 1.7.1
*
* @access public
* @param string $lightbox_caption Caption.
* @param string $context Context.
* @return string
*/
function envira_santitize_lightbox_caption( $lightbox_caption, $context = false ) {
if ( empty( $lightbox_caption ) ) {
return false;
}
return envira_santitize_everything( $lightbox_caption, 'envira_santitize_lightbox_caption_' . $context );
}
/**
* Santitize Gallery Titles As They Are Requested
*
* @since 1.7.1
*
* @access public
* @param array $meta_data Meta Data.
* @return void
*/
function envira_santitize_metadata( $meta_data ) {
if ( ! $meta_data ) {
return;
}
if ( is_array( $meta_data ) && ! empty( $meta_data ) ) {
foreach ( $meta_data as $key => $data ) {
$meta_data[ $key ] = envira_santitize_title( $data );
}
} else {
$meta_data = envira_santitize_title( $meta_data );
}
return $meta_data;
}
/**
* Santitize Gallery Titles As They Are Requested
* (This function has been depreciated)
*
* @since 1.7.1
*
* @access public
* @param string $title Gallery title.
* @return string
*/
function envira_santitize_title( $title ) {
if ( empty( $title ) || is_array( $title ) ) {
return;
}
return envira_santitize_everything( $title );
}
/**
* Santitize Gallery Titles As They Are Requested
*
* @since 1.7.1
*
* @access public
*
* @param string $text String.
* @param string $type The type.
* @param boolean $for_albums The context.
*
* @return string
*/
function envira_santitize_everything( $text, $type = 'title', $for_albums = false ) {
if ( empty( $text ) || is_array( $text ) ) {
return;
}
$encoding = ( function_exists( 'mb_detect_encoding' ) && mb_detect_encoding( $text ) !== 'ASCII' ) ? mb_detect_encoding( $text ) : 'utf-8';
$filtered_string = $text;
if ( 'envira_santitize_lightbox_caption_shortcode' === $type || 'opts-caption' === $type || 'title' === $type || 'alt' === $type || 'item-caption' === $type ) {
$filtered_string = ( htmlentities( $text, ENT_QUOTES, $encoding ) );
}
if ( 'title' === $type ) {
$filtered_string = str_replace( '"', '"', $filtered_string );
if ( $for_albums ) {
$filtered_string = str_replace( '"', '"', $filtered_string ); // album fails if quotes in title no matter what.
$filtered_string = str_replace( "'", ''', $filtered_string ); // album fails if quotes in title no matter what.
$filtered_string = str_replace( '#', '£', $filtered_string ); // album fails if quotes in title no matter what.
$filtered_string = str_replace( '?', '?', $filtered_string ); // album fails if quotes in title no matter what.
// Remove not allowed tags to prevent vulnerabilities.
$filtered_string = wp_kses( htmlentities( $filtered_string ), envira_get_allowed_tags() );
}
}
if ( 'opts-caption' === $type || 'item-caption' === $type || 'gallery-description' === $type ) {
$filtered_string = str_replace( '"', '"', $filtered_string );
if ( false === $for_albums ) {
$filtered_string = str_replace( '"', '"', $filtered_string ); // album fails if quotes in title no matter what.
}
$filtered_string = str_replace( "'", ''', $filtered_string ); // album fails if quotes in title no matter what.
$filtered_string = str_replace( '#', '£', $filtered_string ); // album fails if quotes in title no matter what.
$filtered_string = str_replace( '?', '?', $filtered_string ); // album fails if quotes in title no matter what.
$filtered_string = str_replace( '&£039;', ''', $filtered_string ); // album fails if quotes in title no matter what.
}
if ( strpos( $type, 'image_meta' ) !== false ) {
$filtered_string = str_replace( '"', '"', $filtered_string ); // album fails if quotes in title no matter what.
$filtered_string = str_replace( "'", ''', $filtered_string ); // album fails if quotes in title no matter what.
$filtered_string = str_replace( '#', '£', $filtered_string ); // album fails if quotes in title no matter what.
}
if ( 'alt' === $type ) {
$filtered_string = str_replace( '"', '"', $filtered_string );
}
// notes:.
// - converting " to "e breaks captions (meta-data) in albums lightbox https://testing.enviragallery.com/envira_album/ellie-kennard-album/
// - no matter what form (" or /" or anything) quotes in title breaks album lightbox https://testing.enviragallery.com/envira_album/ellie-kennard-album/
return $filtered_string;
}
/**
* Santitize Gallery Fields As They Are Requested
* (This function has been depreciated)
*
* @since 1.7.1
*
* @access public
* @param string $description Gallery description.
* @return string
*/
function envira_santitize_description( $description ) {
return envira_santitize_everything( $description, 'gallery-description' );
}
/**
* Returns All Gallery Images defaults to json object.
*
* @since 1.7.1
*
* @access public
*
* @param mixed $gallery_id Gallery id.
* @param bool $raw (default: false).
* @param array $data (default: null).
* @param array $return_sort_ids (default: false).
* @param boolean $for_albums (default: false).
* @param string $gallery_type Type.
* @param boolean $cache Enable cache.
*
* @return array
*/
function envira_get_gallery_images( $gallery_id, $raw = false, $data = null, $return_sort_ids = false, $for_albums = false, $gallery_type = false, $cache = true ) {
if ( ! empty( $data ) && isset( $data['config']['sort_order'] ) && '1' === $data['config']['sort_order'] ) {
$data = envira_insure_random_gallery( $data, $gallery_id, $cache );
} else {
/* if this isn't random sorting, then let's use transient caching */
$cache = ( ! is_envira_debug_on() && true === $cache ) ? get_transient( '_eg_fragment_json_' . $gallery_id ) : false;
if ( 'gutenberg' === $gallery_type ) {
$data = envira_sort_gallery( $data, $data['config']['sort_order'], $data['config']['sorting_direction'] );
}
if ( $cache ) {
if ( $raw ) {
return json_decode( $cache['gallery_images'], true );
} elseif ( false === $return_sort_ids ) {
return $cache['gallery_images'];
} else {
return $cache;
}
}
}
if ( ! isset( $gallery_id ) ) {
return false;
}
$images = [];
$sizes = get_intermediate_image_sizes();
$sizes[] = 'full';
// make sure to get the album data because we need to check settings for title/caption override.
$album_data = ( $for_albums && ! empty( $data ) ) ? $data : false;
$is_dynamic = ! empty( $data ) && ( 'dynamic' === $data['config']['type'] || ! empty( $data['dynamic_id'] ) );
if ( ! $is_dynamic ) {
$data = envira_get_gallery( $gallery_id );
}
// Make sure it gets filtered.
$i = 0;
$id_array = [];
if ( isset( $data['gallery'] ) && is_array( $data['gallery'] ) ) {
foreach ( (array) $data['gallery'] as $id => $item ) {
// If the item isn't an array, bail. GH 2779.
if ( ! is_array( $item ) ) {
continue;
}
// Skip over images that are pending (ignore if in Preview mode).
if ( isset( $item['status'] ) && 'pending' === $item['status'] && ! is_preview() ) {
continue;
}
if ( is_numeric( $id ) && isset( $data['config']['type'] ) && 'instagram' !== $data['config']['type'] && 'fc' !== $data['config']['type'] ) {
$image_size = envira_get_config( 'lightbox_image_size', $data );
$image_data = wp_get_attachment_metadata( $id );
$src = wp_get_attachment_image_src( $id, $image_size );
if ( class_exists( 'Envira_Exif_Parser' ) ) {
$parser_data = Envira_Exif_Parser::get_instance()->get_exif_data( $id );
} else {
$parser_data = [];
}
// check and see if this gallery as image_meta.
if ( isset( $image_data['image_meta'] ) ) {
// santitize image_meta.
$image_data['image_meta']['caption'] = isset( $image_data['image_meta']['caption'] ) && ! empty( $image_data['image_meta']['caption'] ) && 'null' !== $image_data['image_meta']['caption'] ? envira_santitize_everything( $image_data['image_meta']['caption'], 'image_meta-caption', $for_albums ) : '';
$image_data['image_meta']['title'] = isset( $image_data['image_meta']['title'] ) && ! empty( $image_data['image_meta']['title'] ) && 'null' !== $image_data['image_meta']['title'] ? envira_santitize_everything( $image_data['image_meta']['title'], 'image_meta-title', $for_albums ) : '';
if ( isset( $image_data['image_meta']['keywords'] ) && is_array( $image_data['image_meta']['keywords'] ) && ! empty( $image_data['image_meta']['keywords'] ) ) {
foreach ( $image_data['image_meta']['keywords'] as $index => $keyword ) {
$image_data['image_meta']['keywords'][ $index ] = envira_santitize_everything( $keyword, 'image_meta-keyword', $for_albums );
}
}
if ( is_array( $image_data['image_meta'] ) && ! empty( $image_data['image_meta'] ) ) {
foreach ( $image_data['image_meta'] as $image_meta_id => $image_meta_data ) {
if ( 'caption' === $image_meta_id || 'title' === $image_meta_id ) {
continue;
}
$image_data['image_meta'][ $image_meta_id ] = envira_santitize_everything( $image_data['image_meta'][ $image_meta_id ], 'image_meta-' . $image_meta_id, $for_albums );
}
}
// Set meta if Exif parser data is available or use exiting meta.
if ( empty( $parser_data ) ) {
$item['meta'] = $image_data['image_meta'];
} else {
$item['meta'] = $parser_data;
}
}
/* album specific info */
if ( $for_albums ) {
$src = isset( $album_data['config']['lightbox_image_size'] ) && ! empty( $album_data['config']['lightbox_image_size'] ) ? wp_get_attachment_image_src( $id, $album_data['config']['lightbox_image_size'] ) : wp_get_attachment_image_src( $id, 'full' );
}
// assign src, but give non-scaled if full size image requested.
$item['src'] = ! empty( $src[0] ) ? $src[0] : false;
$new_full_sized_url = false;
if ( 'full' === $image_size ) {
$full_image = wp_get_attachment_image_url( $id, $image_size );
$full_image_filename = basename( $full_image );
$new_full_sized_url = false;
if ( false !== strpos( $full_image_filename, '-scaled.' ) ) {
// if WordPress 5.3 has considered full image 'scaled' we can undo this.
$oringial_image_name = isset( $image_data['original_image'] ) && ! empty( $image_data['original_image'] ) ? $image_data['original_image'] : false;
if ( $oringial_image_name ) {
$new_full_sized_url = str_replace( $full_image_filename, $oringial_image_name, $full_image );
} else {
// if the oringial metadata isn't there...
$oringial_image_name = str_replace( '-scaled.', '.', $full_image_filename );
$new_full_sized_url = str_replace( $full_image_filename, $oringial_image_name, $full_image );
// TODO: Check and see if file exists?
}
}
}
$item['src'] = ( ! empty( $new_full_sized_url ) ) ? $new_full_sized_url : $item['src'];
foreach ( $sizes as $size ) {
$size_url = wp_get_attachment_image_src( $id, $size );
$item[ $size ] = isset( $size_url[0] ) && false !== $size_url[0] ? $size_url[0] : false;
}
}
$dimensions = envira_get_thumbnail_dimensions( $data );
$thumb_args = [
'position' => envira_get_config( 'crop_position', $data ),
'width' => $dimensions['width'],
'height' => $dimensions['height'],
'quality' => 100,
'retina' => false,
];
$src = ( isset( $item['src'] ) && ! empty( trim( $item['src'] ) ) ) ? ( $item['src'] ) : false;
// TODO refactor. In some cases we've resized the image before getting here. Explore further.
$thumb = envira_resize_image( $src, $thumb_args['width'], $thumb_args['height'], true, envira_get_config( 'crop_position', $data ), $thumb_args['quality'], $thumb_args['retina'], $data );
$item['title'] = ( isset( $item['title'] ) && ! empty( trim( $item['title'] ) ) ) ? envira_santitize_everything( $item['title'], 'title', $for_albums ) : '';
$item['index'] = $i;
$item['id'] = $id;
$item['thumb'] = $thumb;
$item['video'] = isset( $item['video_in_gallery'] ) ? true : false;
$caption = envira_get_config( 'lightbox_title_caption', $data ) === 'title' ? envira_santitize_everything( $item['title'], 'captiontitle' ) : envira_santitize_everything( $item['title'], 'captioncaption' );
$the_data = ( false !== $album_data ) ? $album_data : $data;
$item['opts'] = [
'caption' => ( isset( $item['caption'] ) && ! empty( trim( $item['caption'] ) ) ) ? envira_santitize_everything( $item['caption'], 'opts-caption', $for_albums ) : '',
'thumb' => $thumb,
'title' => ( isset( $item['title'] ) && ! empty( trim( $item['title'] ) ) ) ? envira_santitize_everything( $item['title'], 'opts-title' ) : '',
];
$item['alt'] = ( isset( $item['alt'] ) && ! empty( trim( $item['alt'] ) ) ) ? envira_santitize_everything( $item['alt'], 'alt' ) : '';
$item['gallery_id'] = $gallery_id;
$item['caption'] = ( isset( $item['caption'] ) && ! empty( trim( $item['caption'] ) ) ) ? envira_santitize_everything( $item['caption'], 'item-caption', $for_albums ) : false;
/* album specific info */
if ( $for_albums ) {
$item['gallery_title'] = envira_get_config( 'title', $data ) ? envira_santitize_everything( envira_get_config( 'title', $data ), 'gallery-title' ) : envira_santitize_everything( get_the_title( $gallery_id ), 'gallery-title' );
}
$item = apply_filters( 'envira_gallery_output_item_data', $item, $id, $data, $i );
$images[ $id ] = $item;
$id_array[] = $id;
++$i;
}
}
// this holds all data, which we will store in transient - so that we can pull out what we need from the cache (see above).
$full_data = [
'gallery_images' => wp_json_encode( $images, JSON_UNESCAPED_UNICODE ),
'sorted_ids' => wp_json_encode( $id_array, JSON_UNESCAPED_UNICODE ),
];
// set the transient.
$transient = set_transient( '_eg_fragment_json_' . $gallery_id, $full_data, WEEK_IN_SECONDS );
if ( $raw ) {
return $images;
}
if ( false === $return_sort_ids ) {
return wp_json_encode( $images, JSON_UNESCAPED_UNICODE );
} else {
return ( $full_data );
}
}
/**
* Obtains thumbnail dimensions according to config.
*
* @param array $data Gallery data.
*
* @return array{width: numeric, height: numeric}
*/
function envira_get_thumbnail_dimensions( $data ) {
$thumbnails_custom_size = envira_get_config( 'thumbnails_custom_size', $data );
$thumbnails_height = envira_get_config( 'thumbnails_height', $data );
$thumbnails_height_default = envira_get_config_default( 'thumbnails_height' );
$thumbnails_width = envira_get_config( 'thumbnails_width', $data );
$thumbnails_width_default = envira_get_config_default( 'thumbnails_width' );
return [
'width' => $thumbnails_custom_size ? $thumbnails_width : $thumbnails_width_default,
'height' => $thumbnails_custom_size ? $thumbnails_height : $thumbnails_height_default,
];
}
/**
* Helper method for setting default config values.
*
* @since 1.7.0
*
* @param string $key The default config key to retrieve.
* @return string Key value on success, false on failure.
*/
function envira_get_config_default( $key ) {
// Get the current post ID. If ajax, grab it from the $_POST variable.
// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Nonce verification is handled in ajax.
if ( defined( 'DOING_AJAX' ) && DOING_AJAX && isset( $_POST['post_id'] ) ) {
// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Nonce verification is handled in ajax.
$post_id = absint( $_POST['post_id'] );
} else {
$post_id = get_the_ID();
}
// Prepare default values.
$defaults = envira_get_config_defaults( $post_id );
// Return the key specified.
return isset( $defaults[ $key ] ) ? $defaults[ $key ] : false;
}
/**
* Helper method for retrieving config values.
*
* @since 1.0.0
*
* @param string $key The config key to retrieve.
* @param array $data Gallery data.
* @param string $default_value A default value to use.
*
* @return mixed Key value on success, empty string on failure.
*/
function envira_get_config( $key, $data, $default_value = null ) {
if ( ! is_array( $data ) ) {
return envira_get_config_default( $key );
}
$is_mobile_keys = [];
// If we are on a mobile device, some config keys have mobile equivalents, which we need to check instead.
if ( envira_mobile_detect()->isMobile() ) {
$is_mobile_keys = [
'lightbox_enabled' => 'mobile_lightbox',
'gallery_link_enabled' => 'mobile_gallery_link_enabled',
'arrows' => 'mobile_arrows',
'toolbar' => 'mobile_toolbar',
'thumbnails' => 'mobile_thumbnails',
'thumbnails_width' => 'mobile_thumbnails_width',
'thumbnails_height' => 'mobile_thumbnails_height',
'additional_copy_automatic_title' => 'additional_copy_automatic_title_mobile',
'additional_copy_automatic_caption' => 'additional_copy_automatic_caption_mobile',
'gallery_automatic_title_caption' => 'gallery_automatic_title_caption_mobile',
'additional_copy_title' => 'additional_copy_title_mobile',
'additional_copy_caption' => 'additional_copy_caption_mobile',
'gallery_column_title_caption' => 'gallery_column_title_caption_mobile',
];
if ( isset( $data['config']['mobile'] ) && false !== $data['config']['mobile'] ) {
$is_mobile_keys['crop_width'] = 'mobile_width';
$is_mobile_keys['crop_height'] = 'mobile_height';
}
$is_mobile_keys = apply_filters( 'envira_gallery_get_config_mobile_keys', $is_mobile_keys );
if ( array_key_exists( $key, $is_mobile_keys ) ) {
// Use the mobile array key to get the config value.
$key = $is_mobile_keys[ $key ];
}
// If the user hasn't overrided lightbox thumbnails with custom sizes, make sure these are set to auto.
} elseif ( ( 'thumbnails_height' === $key || 'thumbnails_width' === $key ) && ( ! isset( $data['config']['thumbnails_custom_size'] ) || false === $data['config']['thumbnails_custom_size'] ) ) {
$data['config'][ $key ] = 'auto';
}
// The toolbar is not needed for base dark so lets disable it.
if ( 'toolbar' === $key && isset( $data['config']['lightbox_theme'] ) && 'base_dark' === $data['config']['lightbox_theme'] ) {
$data['config'][ $key ] = 0;
}
// Disable/Remove FullScreen if Fullscreen addon is not present.
if ( ! class_exists( 'Envira_Fullscreen' ) ) {
if ( isset( $data['config']['open_fullscreen'] ) ) {
unset( $data['config']['open_fullscreen'] );
}
}
if ( isset( $data['config'] ) ) {
$data['config'] = apply_filters( 'envira_gallery_get_config', $data['config'], $key );
} else {
$data['config'][ $key ] = false;
}
$default_value = null !== $default_value ? $default_value : envira_get_config_default( $key );
return isset( $data['config'][ $key ] ) ? $data['config'][ $key ] : $default_value;
}
/**
* Envira Get Gallery Data function.
*
* @access public
* @param mixed $gallery_id The gallery id.
* @return $data
*/
function envira_get_gallery_data( $gallery_id ) {
// If no ID is set create a new gallery.
if ( ! isset( $gallery_id ) ) {
return false;
}
$data = get_post_meta( $gallery_id, '_eg_gallery_data', true );
return $data;
}
/**
* Helper function to prepare the metadata for an image in a gallery.
*
* @since 1.7.0
*
* @param array $gallery_data Array of data for the gallery.
* @param int $id The attachment ID to prepare data for.
* @param array $image Attachment image. Populated if inserting from the Media Library.
* @return array $gallery_data Amended gallery data with updated image metadata.
*/
function envira_prepare_gallery_data( $gallery_data, $id, $image = false ) {
// Get attachment.
$attachment = get_post( $id );
// Add this image to the start or end of the gallery, depending on the setting.
$media_position = envira_get_setting( 'media_position' );
// Depending on whether we're inserting from the Media Library or not, prepare the image array.
if ( ! $image ) {
$url = wp_get_attachment_image_src( $id, 'full' );
$alt_text = get_post_meta( $id, '_wp_attachment_image_alt', true );
$new_image = [
'status' => 'active',
'src' => isset( $url[0] ) ? esc_url( $url[0] ) : '',
'title' => get_the_title( $id ),
'link' => ( isset( $url[0] ) ? esc_url( $url[0] ) : '' ),
'alt' => ! empty( $alt_text ) ? $alt_text : '',
'caption' => ! empty( $attachment->post_excerpt ) ? $attachment->post_excerpt : '',
'thumb' => '',
];
} else {
$new_image = [
'status' => 'active',
'src' => ( isset( $image['src'] ) ? $image['src'] : $image['url'] ),
'title' => $image['title'],
'link' => $image['link'],
'alt' => $image['alt'],
'caption' => $image['caption'],
'thumb' => '',
];
}
// Allow Addons to possibly add metadata now.
$image = apply_filters( 'envira_gallery_ajax_prepare_gallery_data_item', $new_image, $image, $id, $gallery_data );
// If gallery data is not an array (i.e. we have no images), just add the image to the array.
if ( ! isset( $gallery_data['gallery'] ) || ! is_array( $gallery_data['gallery'] ) ) {
$gallery_data['gallery'] = [];
$gallery_data['gallery'][ $id ] = $image;
} else {
switch ( $media_position ) {
case 'before':
// Add image to start of images array
// Store copy of images, reset gallery array and rebuild.
$images = $gallery_data['gallery'];
$gallery_data['gallery'] = [];
$gallery_data['gallery'][ $id ] = $image;
foreach ( $images as $old_image_id => $old_image ) {
$gallery_data['gallery'][ $old_image_id ] = $old_image;
}
break;
case 'after':
default:
// Add image, this will default to the end of the array.
$gallery_data['gallery'][ $id ] = $image;
break;
}
}
// Filter and return.
$gallery_data = apply_filters( 'envira_gallery_ajax_item_data', $gallery_data, $attachment, $id, $image );
return $gallery_data;
}
/**
* Random transient cache suffix
*
* @param string $gallery_id Gallery ID.
* @return string
*/
function envira_get_random_transient_suffix( $gallery_id ) {
return apply_filters( 'envira_get_random_transient_suffix', $gallery_id );
}
add_filter( 'envira_gallery_pre_data', 'envira_insure_random_gallery', 10, 3 );
add_filter( 'envira_images_pre_data', 'envira_insure_random_gallery', 10, 3 );
/**
* Helper function to ensure random galleries bypass cache and are displayed randomly on the front end
*
* @since 1.7.0
*
* @param array $data Array of data for the gallery.
* @param int $gallery_id The attachment ID to prepare data for.
* @param boolean $should_cache_default Flush the transient or not.
* @return array $data Updated gallery data
*/
function envira_insure_random_gallery( $data, $gallery_id, $should_cache_default = null ) {
if ( ! $data || ! isset( $data['config']['sort_order'] ) || '1' !== $data['config']['sort_order'] ) {
return $data;
}
if ( null === $should_cache_default ) {
$should_cache_default = false;
}
$should_cache = apply_filters( 'envira_gallery_should_cache', $should_cache_default, $data );
// Store transient, but check and see if there's one already.
$gallery_data = get_transient( '_eg_fragment_gallery_random_sort_' . envira_get_random_transient_suffix( $data['id'] ) );
// Attempt to return the transient first, otherwise generate the new query to retrieve the data.
if ( false === $gallery_data || false === $should_cache ) {
$expiration = DAY_IN_SECONDS; // envira_get_transient_expiration_time could also be used here.
$gallery_data = envira_sort_gallery( $data, '1', 'DESC' ); // '1' = random
set_transient( '_eg_fragment_gallery_random_sort_' . envira_get_random_transient_suffix( $data['id'] ), $gallery_data, $expiration );
}
return $gallery_data;
}
add_filter( 'envira_gallery_get_transient_markup', 'envira_maybe_clear_cache_random', 10, 2 );
/**
* Helper function to ensure random galleries bypass cache and are displayed randomly on the front end
*
* @since 1.7.0
*
* @param array $transient Transient.
* @param int $data Array of data for the gallery.
* @return boolean Allow cache or not.
*/
function envira_maybe_clear_cache_random( $transient, $data ) {
if ( ! $data || ! isset( $data['config']['sort_order'] ) || 1 !== $data['config']['sort_order'] ) {
return $transient;
} else {
return false;
}
}
/**
* Helper method to get the version the gallery was updated or created.
*
* @since 1.7.1
*
* @access public
* @param mixed $gallery_id Gallery ID.
* @return bool|intenger
*/
function envira_get_gallery_version( $gallery_id ) {
if ( empty( $gallery_id ) ) {
return false;
}
$version = get_post_meta( $gallery_id, '_eg_version', true );
if ( ! empty( $version ) ) {
return $version;
}
return false;
}
/**
* Maybe update the gallery, check the version.
*
* @since 1.7.1
*
* @access public
* @param mixed $gallery_id Gallery id.
* @return boolean
*/
function envira_maybe_update_gallery( $gallery_id ) {
$version = envira_get_gallery_version( $gallery_id );
if ( ! isset( $version ) || version_compare( $version, '1.8.0', '<' ) ) {
return true;
}
return false;
}
// Conditionally load the template tag.
if ( ! function_exists( 'envira_gallery' ) ) {
/**
* Primary template tag for outputting Envira galleries in templates.
*
* @since 1.0.0
*
* @param int $id The ID of the gallery to load.
* @param string $type The type of field to query.
* @param array $args Associative array of args to be passed.
* @param bool $result Flag to echo or return the gallery HTML.
*/
function envira_gallery( $id, $type = 'id', $args = [], $result = false ) {
// If we have args, build them into a shortcode format.
$args_string = ! empty( $args ) ? ' ' . str_replace( '=', '="', http_build_query( $args, null, '" ', PHP_QUERY_RFC3986 ) ) . '" ' : false;
// Build the shortcode.
$shortcode = ! empty( $args_string ) ? '[envira-gallery ' . $type . '="' . $id . '"' . $args_string . ']' : '[envira-gallery ' . $type . '="' . $id . '"]';
// Return or echo the shortcode output.
if ( $result ) {
return do_shortcode( $shortcode );
} else {
echo do_shortcode( $shortcode );
}
}
}