Files
SIGE-WEB-snapshot/wp-content/plugins/all-in-one-video-gallery/includes/helpers/functions.php

2617 lines
82 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
/**
* General helper functions.
*
* @link https://plugins360.com
* @since 1.0.0
*
* @package All_In_One_Video_Gallery
*/
// Exit if accessed directly
if ( ! defined( 'WPINC' ) ) {
die;
}
// If your PHP version is < 8
if ( ! function_exists( 'str_contains' ) ) {
/**
* Based on original work from the PHP Laravel framework.
*
* @since 3.5.0
* @param string $haystack The string to search in.
* @param string $needle The substring to search for in the haystack.
* @return boolean Returns true if needle is in haystack, false otherwise.
*/
function str_contains( $haystack, $needle ) {
return $needle !== '' && mb_strpos( $haystack, $needle ) !== false;
}
}
/**
* Adds extra code to a registered script.
*
* @since 3.0.0
* @deprecated 4.7.6 Pass player settings via the data-params HTML attribute on the <aiovg-video> element instead.
* @param string $handle Name of the script to add the inline script to.
* @param string $data String containing the JavaScript to be added.
* @param string $position Whether to add the inline script before the handle or after.
*/
function aiovg_add_inline_script( $handle, $data, $position = 'before' ) {
// $is_script_added = wp_add_inline_script( $handle, $data, $position );
add_action( 'wp_footer', function() use ( $data ) {
echo '<script type="text/javascript">' . $data . '</script>';
});
}
/**
* Allow iframe & script tags in the "Third-Party Player Code" field.
*
* @since 1.0.0
* @param array $allowed_tags Allowed HTML Tags.
* @return array Iframe & script tags included.
*/
function aiovg_allow_iframe_script_tags( $allowed_tags ) {
// Only change for users who has "unfiltered_html" capability
if ( ! current_user_can( 'unfiltered_html' ) ) return $allowed_tags;
// Allow script and the following attributes
$allowed_tags['script'] = array(
'type' => true,
'src' => true,
'width' => true,
'height' => true
);
// Allow iframes and the following attributes
$allowed_tags['iframe'] = array(
'src' => true,
'title' => true,
'width' => true,
'height' => true,
'name' => true,
'id' => true,
'class' => true,
'align' => true,
'style' => true,
'frameborder' => true,
'scrolling' => true,
'marginwidth' => true,
'marginheight' => true,
'allowfullscreen' => true
);
// Allow stream and the following attributes
$allowed_tags['stream'] = array(
'src' => true,
'controls' => true
);
return $allowed_tags;
}
/**
* Base64 decode a string.
*
* @since 3.8.4
* @param string $string The string to be decoded.
* @return string Decoded string.
*/
function aiovg_base64_decode( $string ) {
return base64_decode( str_replace( array( '-', '_', '.' ), array( '+', '/', '=' ), $string ) );
}
/**
* Base64 encode a string.
*
* @since 3.8.4
* @param string $string The string to be encoded.
* @return string Encoded string.
*/
function aiovg_base64_encode( $string ) {
return str_replace( array( '+', '/', '=' ), array( '-', '_', '.' ), base64_encode( $string ) );
}
/**
* Combine video attributes as a string.
*
* @since 2.0.0
* @param array $atts Array of video attributes.
* @param string Combined attributes string.
*/
function aiovg_combine_video_attributes( $atts ) {
$attributes = array();
foreach ( $atts as $key => $value ) {
if ( '' === $value ) {
$attributes[] = $key;
} else {
$attributes[] = sprintf( '%s="%s"', $key, $value );
}
}
return implode( ' ', $attributes );
}
/**
* Converts a timestamp string into seconds.
*
* This function takes a time string formatted as HH:MM:SS or MM:SS
* and converts it into the total number of seconds.
*
* @since 3.9.7
* @param string $time The timestamp string (HH:MM:SS or MM:SS).
* @return int The total time in seconds.
*/
function aiovg_convert_time_to_seconds( $time ) {
$parts = explode( ':', $time );
$parts = array_map( 'intval', $parts ); // Convert to integers
if ( count( $parts ) === 3 ) {
return $parts[0] * 3600 + $parts[1] * 60 + $parts[2]; // HH:MM:SS
} elseif ( count( $parts ) === 2 ) {
return $parts[0] * 60 + $parts[1]; // MM:SS
}
return (int) $time;
}
/**
* Create an attachment from the external image URL and return the attachment ID.
*
* @since 2.6.3
* @param string $image_url Image URL from external server.
* @param int $post_id Post ID.
* @return int WordPress attachment ID.
*/
function aiovg_create_attachment_from_external_image_url( $image_url, $post_id ) {
if ( empty( $image_url ) ) {
return 0;
}
$image_url_hash = md5( $image_url );
$attachment_id = get_post_meta( $post_id, $image_url_hash, true );
if ( ! empty( $attachment_id ) ) {
if ( wp_attachment_is( 'image', $attachment_id ) ) {
return $attachment_id;
} else {
delete_post_meta( $post_id, $image_url_hash );
}
}
// Validate file type
$allowed_mimes = array(
'jpg|jpeg|jpe' => 'image/jpeg',
'gif' => 'image/gif',
'png' => 'image/png'
);
$file_info = wp_check_filetype( basename( $image_url ), $allowed_mimes );
if ( $file_info['type'] == false ) {
$parsed_url = parse_url( $image_url );
// URLs from Vimeo/Dailymotion don't have a file extension. So, manually set the file info.
if ( strpos( $parsed_url['host'], '.vimeocdn.com' ) !== false || strpos( $parsed_url['host'], '.dmcdn.net' ) !== false ) {
$file_info = array(
'ext' => 'jpg',
'type' => 'image/jpeg'
);
}
// Hook for developers to set the file info for image URLs that don't have a file extension.
$file_info = apply_filters( 'aiovg_check_filetype', $file_info, $image_url, $post_id );
}
if ( $file_info['ext'] == false ) {
return 0;
}
$file_extension = strtolower( $file_info['ext'] );
if ( ! in_array( $file_extension, array( 'jpg', 'jpeg', 'png', 'gif' ) ) ) {
return 0;
}
// Validate remote URL accessibility using wp_remote_head
$response = wp_remote_head( $image_url, array(
'timeout' => 5,
'headers' => array(
'User-Agent' => 'Mozilla/5.0 (compatible; WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ) . ')'
)
) );
if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) !== 200 ) {
return 0;
}
// Check MIME type from the header
$mime_type = wp_get_image_mime( $image_url );
if ( $mime_type == false ) {
$content_type = wp_remote_retrieve_header( $response, 'content-type' );
if ( empty( $content_type ) || ! in_array( $content_type, array_values( $allowed_mimes ) ) ) {
return 0;
}
$mime_type = $content_type; // Use MIME type from the header
}
if ( ! in_array( $mime_type, array_values( $allowed_mimes ) ) ) {
return 0;
}
// Set upload folder
$wp_upload_dir = wp_upload_dir();
$upload_dir = $wp_upload_dir['basedir'];
if ( wp_mkdir_p( $wp_upload_dir['path'] ) ) {
$upload_dir = $wp_upload_dir['path'];
}
// Set file path & name
$unique_id = str_replace( '.', '-', uniqid() );
$unique_file_name = wp_unique_filename( $upload_dir, $unique_id . '.' . $file_extension ); // Generate unique name
$file_name = sanitize_file_name( basename( $unique_file_name ) ); // Create image file name
$file_path = $upload_dir . '/' . $file_name;
// Get image data using file_get_contents
$image_data = @file_get_contents( $image_url );
if ( false === $image_data ) {
return 0;
}
// Create the image file on the server
if ( false === @file_put_contents( $file_path, $image_data ) ) {
return 0;
}
// Create the attachment
require_once( ABSPATH . 'wp-admin/includes/image.php' );
$attachment = array(
'post_mime_type' => $mime_type,
'post_title' => $file_name,
'post_content' => '',
'post_status' => 'inherit'
);
$attachment_id = wp_insert_attachment( $attachment, $file_path, $post_id );
// Define attachment metadata
$attachment_data = wp_generate_attachment_metadata( $attachment_id, $file_path );
// Assign metadata to attachment
wp_update_attachment_metadata( $attachment_id, $attachment_data );
// And finally, store a reference to the attachment in the post
update_post_meta( $post_id, $image_url_hash, $attachment_id );
return $attachment_id;
}
/**
* Whether the current user has a specific capability.
*
* @since 1.0.0
* @param string $capability Capability name.
* @param int $post_id Optional. ID of the specific object to check against if
* `$capability` is a "meta" cap.
* @return bool True if the current user has the capability, false if not.
*/
function aiovg_current_user_can( $capability, $post_id = 0 ) {
$user_id = get_current_user_id();
// If playing a video
if ( 'play_aiovg_video' == $capability ) {
$has_access = aiovg_current_user_has_video_access( $post_id );
return apply_filters( 'aiovg_current_user_can', $has_access, $capability, $post_id );
}
// If editing, deleting, or reading a video, get the post and post type object
if ( 'edit_aiovg_video' == $capability || 'delete_aiovg_video' == $capability || 'read_aiovg_video' == $capability ) {
$post = get_post( $post_id );
$post_type = get_post_type_object( $post->post_type );
// If editing a video, assign the required capability
if ( 'edit_aiovg_video' == $capability ) {
if ( $user_id == $post->post_author ) {
$capability = 'edit_aiovg_videos';
} else {
$capability = 'edit_others_aiovg_videos';
}
}
// If deleting a video, assign the required capability
elseif ( 'delete_aiovg_video' == $capability ) {
if ( $user_id == $post->post_author ) {
$capability = 'delete_aiovg_videos';
} else {
$capability = 'delete_others_aiovg_videos';
}
}
// If reading a private video, assign the required capability
elseif ( 'read_aiovg_video' == $capability ) {
if ( 'private' != $post->post_status ) {
$capability = 'read';
} elseif ( $user_id == $post->post_author ) {
$capability = 'read';
} else {
$capability = 'read_private_aiovg_videos';
}
}
}
return current_user_can( $capability );
}
/**
* Checks if the current user has access to watch a specific video.
*
* This function verifies whether the current user has permission to view the
* given video based on role-based restrictions.
*
* @since 3.9.6
* @param int $post_id The ID of the video post.
* @return bool True if the current user has access, false otherwise.
*/
function aiovg_current_user_has_video_access( $post_id = 0 ) {
if ( 0 == $post_id ) {
return true;
}
if ( current_user_can( 'manage_aiovg_options' ) ) {
return true;
}
if ( aiovg_current_user_can( 'edit_aiovg_video', $post_id ) ) {
return true;
}
$restrictions_settings = aiovg_get_option( 'aiovg_restrictions_settings' );
if ( empty( $restrictions_settings['enable_restrictions'] ) ) {
return true;
}
$access_control = $restrictions_settings['access_control'];
$restricted_roles = $restrictions_settings['restricted_roles'];
if ( metadata_exists( 'post', $post_id, 'access_control' ) ) {
$__access_control = (int) get_post_meta( $post_id, 'access_control', true );
if ( $__access_control != -1 ) {
$access_control = $__access_control;
if ( $access_control == 2 ) {
$__restricted_roles = get_post_meta( $post_id, 'restricted_roles', true );
if ( ! empty( $__restricted_roles ) ) {
$restricted_roles = $__restricted_roles;
}
}
}
}
// Everyone
if ( $access_control == 0 ) {
return true;
}
// Logged out users only
if ( $access_control == 1 ) {
if ( ! is_user_logged_in() ) {
return true;
}
}
// Logged in users only
if ( $access_control == 2 ) {
if ( is_user_logged_in() ) {
$restricted_roles = (array) $restricted_roles;
$restricted_roles = array_filter( $restricted_roles );
if ( empty( $restricted_roles ) ) {
return true;
}
$current_user = wp_get_current_user();
$roles_matched = array_intersect( $current_user->roles, $restricted_roles );
if ( count( $roles_matched ) > 0 ) {
return true;
}
}
}
return false;
}
/**
* Delete category attachments.
*
* @since 1.0.0
* @param int $term_id Term ID.
*/
function aiovg_delete_category_attachments( $term_id ) {
$general_settings = aiovg_get_option( 'aiovg_general_settings' );
if ( ! empty( $general_settings['delete_media_files'] ) ) {
$image_id = get_term_meta( $term_id, 'image_id', true );
if ( ! empty( $image_id ) ) wp_delete_attachment( $image_id, true );
}
}
/**
* Delete video attachments.
*
* @since 1.0.0
* @param int $post_id Post ID.
*/
function aiovg_delete_video_attachments( $post_id ) {
$general_settings = aiovg_get_option( 'aiovg_general_settings' );
if ( ! empty( $general_settings['delete_media_files'] ) ) {
$mp4_id = get_post_meta( $post_id, 'mp4_id', true );
if ( ! empty( $mp4_id ) ) wp_delete_attachment( $mp4_id, true );
$webm_id = get_post_meta( $post_id, 'webm_id', true );
if ( ! empty( $webm_id ) ) wp_delete_attachment( $webm_id, true );
$ogv_id = get_post_meta( $post_id, 'ogv_id', true );
if ( ! empty( $ogv_id ) ) wp_delete_attachment( $ogv_id, true );
$image_id = get_post_meta( $post_id, 'image_id', true );
if ( ! empty( $image_id ) ) wp_delete_attachment( $image_id, true );
$sources = get_post_meta( $post_id, 'sources', true );
if ( ! empty( $sources ) && is_array( $sources ) ) {
foreach ( $sources as $source ) {
if ( ! empty( $source['src_id'] ) ) {
wp_delete_attachment( (int) $source['src_id'], true );
}
}
}
$tracks = get_post_meta( $post_id, 'track' );
if ( ! empty( $tracks ) ) {
foreach ( $tracks as $track ) {
if ( ! empty( $track['src_id'] ) ) {
wp_delete_attachment( (int) $track['src_id'], true );
}
}
}
$trailer_src_id = get_post_meta( $post_id, 'trailer_src_id', true );
if ( ! empty( $trailer_src_id ) ) wp_delete_attachment( $trailer_src_id, true );
}
}
/**
* Extracts chapters from a given string containing timestamps and titles.
*
* This function parses a structured string input, identifying timestamps and
* their corresponding chapter titles, then returns them as an array.
*
* @since 3.9.7
* @param string $string The input string containing timestamps and chapter titles.
* @return array An array of chapters, each containing 'title', and 'seconds'.
*/
function aiovg_extract_chapters_from_string( $string ) {
// Regex to match timestamps and titles
$pattern = '/((\d{1,2}:)?\d{1,2}:\d{2})\s+(.+)/';
$chapters = array();
if ( preg_match_all( $pattern, $string, $matches, PREG_SET_ORDER ) ) {
foreach ( $matches as $match ) {
$seconds = aiovg_convert_time_to_seconds( trim( $match[1] ) );
$label = isset( $match[3] ) ? ltrim( $match[3], '-' ) : '';
$chapters[ $seconds ] = array(
'time' => $seconds,
'label' => sanitize_text_field( trim( $label ) )
);
}
}
return $chapters;
}
/**
* Extract player attributes.
*
* @since 3.9.3
* @param array $attributes Array of attributes.
* @return array Filtered array of attributes.
*/
function aiovg_extract_player_attributes( $attributes = array() ) {
$player_settings = aiovg_get_option( 'aiovg_player_settings' );
$player_attributes = array(
'autoplay',
'loop',
'muted',
'playpause',
'current',
'progress',
'duration',
'tracks',
'chapters',
'speed',
'quality',
'volume',
'pip',
'fullscreen',
'share',
'embed',
'download'
);
$player_args = array();
foreach ( $player_attributes as $key ) {
if ( ! isset( $attributes[ 'player_' . $key ] ) ) {
continue;
}
$value = (int) $attributes[ 'player_' . $key ];
if ( 'autoplay' == $key || 'loop' == $key || 'muted' == $key ) {
$default = ! empty( $player_settings[ $key ] ) ? 1 : 0;
} else {
$default = isset( $player_settings['controls'][ $key ] ) ? 1 : 0;
}
if ( $value != $default ) {
$player_args[ $key ] = $value;
}
}
return $player_args;
}
/**
* Format a large numeric count (e.g., views, likes) in YouTube style and support translations.
*
* @since 1.0.0
* @param int|float $number The number to format.
* @return string Formatted number with localized suffix.
*/
function aiovg_format_count( $number ) {
$general_settings = aiovg_get_option( 'aiovg_general_settings' );
if ( isset( $general_settings['number_format'] ) && 'short' === $general_settings['number_format'] ) {
if ( $number >= 1000000000 ) {
$formatted = sprintf( _x( '%sB', 'billion short form', 'all-in-one-video-gallery' ), round( $number / 1000000000, 1 ) );
} elseif ( $number >= 1000000 ) {
$formatted = sprintf( _x( '%sM', 'million short form', 'all-in-one-video-gallery' ), round( $number / 1000000, 1 ) );
} elseif ( $number >= 1000 ) {
$formatted = sprintf( _x( '%sK', 'thousand short form', 'all-in-one-video-gallery' ), round( $number / 1000, 1 ) );
} else {
$formatted = number_format_i18n( $number );
}
} else {
$formatted = number_format_i18n( $number );
}
return apply_filters( 'aiovg_format_count', $formatted, $number );
}
/**
* Get attachment ID of the given URL.
*
* @since 1.0.0
* @param string $url Media file URL.
* @param string $media "image" or "video". Type of the media.
* @return int Attachment ID on success, 0 on failure.
* @deprecated Replaced by the WordPress core "attachment_url_to_postid" function.
*/
function aiovg_get_attachment_id( $url, $media = 'image' ) {
$attachment_id = 0;
if ( empty( $url ) ) {
return $attachment_id;
}
if ( 'image' == $media ) {
$dir = wp_upload_dir();
if ( false !== strpos( $url, $dir['baseurl'] . '/' ) ) { // Is URL in uploads directory?
$file = basename( $url );
$query_args = array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'fields' => 'ids',
'no_found_rows' => true,
'update_post_term_cache' => false,
'update_post_meta_cache' => false,
'meta_query' => array(
array(
'key' => '_wp_attachment_metadata',
'value' => $file,
'compare' => 'LIKE'
),
)
);
$query = new WP_Query( $query_args );
if ( $query->have_posts() ) {
foreach ( $query->posts as $post_id ) {
$meta = wp_get_attachment_metadata( $post_id );
$original_file = basename( $meta['file'] );
$cropped_image_files = wp_list_pluck( $meta['sizes'], 'file' );
if ( $original_file === $file || in_array( $file, $cropped_image_files ) ) {
$attachment_id = $post_id;
break;
}
}
}
}
} else {
$url = wp_make_link_relative( $url );
if ( ! empty( $url ) ) {
global $wpdb;
$query = $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE guid RLIKE %s", $url );
$attachment_id = $wpdb->get_var( $query );
}
}
return $attachment_id;
}
/**
* Retrieves the current page ID.
*
* @since 4.0.1
* @return int The current page ID if found, otherwise 0.
*/
function aiovg_get_current_page_id() {
global $wp_the_query;
if ( isset( $wp_the_query ) && is_object( $wp_the_query ) ) {
$post_id = $wp_the_query->get_queried_object_id();
// Ensure it's a valid post/page ID (avoid returning term IDs)
if ( is_singular() || is_front_page() ) {
return $post_id;
}
}
return 0; // Default to 0 if no valid page ID is found
}
/**
* Get the list of custom plugin pages.
*
* @since 1.6.5
* @return array $pages Array of pages.
*/
function aiovg_get_custom_pages_list() {
$pages = array(
'category' => array(
'title' => __( 'Video Category', 'all-in-one-video-gallery' ),
'content' => '[aiovg_category]'
),
'tag' => array(
'title' => __( 'Video Tag', 'all-in-one-video-gallery' ),
'content' => '[aiovg_tag]'
),
'search' => array(
'title' => __( 'Search Videos', 'all-in-one-video-gallery' ),
'content' => '[aiovg_search]'
),
'user_videos' => array(
'title' => __( 'User Videos', 'all-in-one-video-gallery' ),
'content' => '[aiovg_user_videos]'
),
'player' => array(
'title' => __( 'Player Embed', 'all-in-one-video-gallery' ),
'content' => ''
)
);
return apply_filters( 'aiovg_custom_pages_list', $pages );
}
/**
* Get the deeplink query parameter name.
*
* @since 4.5.2
* @return string The query parameter name for deeplink videos.
*/
function aiovg_get_deeplink_param() {
$param = apply_filters( 'aiovg_deeplink_param', 'video' );
return sanitize_key( $param );
}
/**
* Get deeplink video ID from URL.
*
* @since 4.5.2
* @return int $video_id The deeplink video ID.
*/
function aiovg_get_deeplink_video_id() {
$param = aiovg_get_deeplink_param();
if ( isset( $_GET[ $param ] ) ) {
return (int) $_GET[ $param ];
}
return 0;
}
/**
* Get default plugin settings.
*
* @since 1.5.3
* @return array $defaults Array of plugin settings.
*/
function aiovg_get_default_settings() {
static $defaults = null;
if ( null !== $defaults ) {
return $defaults;
}
$video_page_slug = 'aiovg_videos';
$slugs = array( 'video', 'watch' );
foreach ( $slugs as $slug ) {
$page = get_page_by_path( $slug );
if ( ! $page ) {
$video_page_slug = $slug;
break;
}
}
$defaults = array(
'aiovg_player_settings' => array(
'player' => 'videojs',
'theme' => 'default',
'force_js_initialization' => 0,
'width' => '',
'ratio' => 56.25,
'autoplay' => 0,
'loop' => 0,
'muted' => 0,
'preload' => 'auto',
'playsinline' => 1,
'quality_levels' => implode( "\n", array( '360p', '480p', '720p', '1080p' ) ),
'controls' => array(
'playpause' => 'playpause',
'current' => 'current',
'progress' => 'progress',
'duration' => 'duration',
'tracks' => 'tracks',
'chapters' => 'chapters',
'speed' => 'speed',
'quality' => 'quality',
'volume' => 'volume',
'fullscreen' => 'fullscreen'
),
'use_native_controls' => array(),
'hide_youtube_logo' => 0,
'cc_load_policy' => 0,
'hotkeys' => 0
),
'aiovg_email_capture_settings' => array(
'enable_email_capture' => 0,
'pre_roll' => 1,
'mid_roll' => '',
'post_roll' => 0,
'collect_name' => 0,
'collect_phone' => 0,
'allow_skip' => 0,
'header_text' => __( 'Enter your email to continue watching', 'all-in-one-video-gallery' ),
'footer_text' => '',
'button_label' => __( 'Submit', 'all-in-one-video-gallery' ),
'skip_text' => __( 'Skip', 'all-in-one-video-gallery' ),
'blocked_email_domains' => '',
),
'aiovg_socialshare_settings' => array(
'services' => array(
'facebook' => 'facebook',
'twitter' => 'twitter',
'linkedin' => 'linkedin',
'pinterest' => 'pinterest',
'tumblr' => 'tumblr',
'whatsapp' => 'whatsapp',
'email' => 'email'
),
'open_graph_tags' => 1,
'twitter_username' => ''
),
'aiovg_videos_settings' => array(
'template' => 'classic',
'columns' => 3,
'limit' => 10,
'orderby' => 'date',
'order' => 'desc',
'thumbnail_style' => 'standard',
'display' => array(
'title' => 'title',
'category' => 'category',
'tag' => 'tag',
'date' => 'date',
'views' => 'views',
'duration' => 'duration'
),
'title_length' => 0,
'excerpt_length' => 75
),
'aiovg_categories_settings' => array(
'template' => 'grid',
'columns' => 3,
'limit' => 0,
'orderby' => 'name',
'order' => 'asc',
'hierarchical' => 1,
'show_description' => 0,
'show_count' => 1,
'hide_empty' => 0,
'breadcrumbs' => 0
),
'aiovg_images_settings' => array(
'width' => '',
'ratio' => 56.25,
'size' => 'medium'
),
'aiovg_featured_images_settings' => array(
'enabled' => 0,
'download_external_images' => 1,
'hide_on_single_video_pages' => 1
),
'aiovg_likes_settings' => array(
'like_button' => 0,
'dislike_button' => 0,
'login_required_to_vote' => 0
),
'aiovg_pagination_settings' => array(
'ajax' => 0,
'mid_size' => 2
),
'aiovg_video_settings' => array(
'display' => array(
'category' => 'category',
'tag' => 'tag',
'views' => 'views',
'related' => 'related',
'share' => 'share'
),
'has_comments' => 1
),
'aiovg_related_videos_settings' => array(
'title' => __( 'Related Videos', 'all-in-one-video-gallery' ),
'columns' => 3,
'limit' => 10,
'orderby' => 'date',
'order' => 'desc',
'display' => array(
'pagination' => 'pagination'
)
),
'aiovg_permalink_settings' => array(
'video' => $video_page_slug,
'video_archive_page' => -1
),
'aiovg_restrictions_settings' => array(
'enable_restrictions' => 0,
'access_control' => 2,
'restricted_roles' => array(),
'restricted_message' => __( 'Sorry, but you do not have permission to view this video.', 'all-in-one-video-gallery' ),
'show_restricted_label' => 1,
'restricted_label_text' => __( 'Restricted', 'all-in-one-video-gallery' ),
'restricted_label_bg_color' => '#999',
'restricted_label_text_color' => '#fff'
),
'aiovg_trailer_settings' => array(
'enable_trailers' => 0,
'player_overlay_text' => '',
'player_overlay_link' => '',
'show_trailer_label' => 1,
'trailer_label_text' => __( 'Trailer', 'all-in-one-video-gallery' ),
'trailer_label_bg_color' => '#999',
'trailer_label_text_color' => '#fff'
),
'aiovg_privacy_settings' => array(
'show_consent' => 0,
'consent_message' => __( '<strong>Please accept cookies to play this video</strong>. By accepting you will be accessing content from a service provided by an external third party.', 'all-in-one-video-gallery' ),
'consent_button_label' => __( 'I Agree', 'all-in-one-video-gallery' ),
'disable_cookies' => array(
'aiovg_rand_seed' => 'aiovg_rand_seed'
)
),
'aiovg_general_settings' => array(
'primary_color' => '#3b82f6',
'force_load_assets' => array(
'css' => 'css'
),
'lazyloading' => 0,
'statistics' => 1,
'datetime_format' => '',
'number_format' => 'full',
'maybe_flush_rewrite_rules' => 0,
'delete_plugin_data' => 1,
'delete_media_files' => 1,
'custom_css' => ''
),
'aiovg_api_settings' => array(
'youtube_api_key' => '',
'vimeo_access_token' => '',
),
'aiovg_bunny_stream_settings' => array(
'enable_bunny_stream' => 0,
'api_key' => '',
'library_id' => '',
'cdn_hostname' => '',
'collection_id' => '',
'enable_token_authentication' => 0,
'token_authentication_key' => '',
'token_expiry' => 3600
),
'aiovg_page_settings' => aiovg_insert_custom_pages()
);
return $defaults;
}
/**
* Get the video excerpt.
*
* @since 1.0.0
* @param int $post_id Post ID.
* @param int $char_length Excerpt length.
* @param string $append String to append to the end of the excerpt.
* @param bool $allow_html Allow HTML in the excerpt.
* @return string $content Excerpt content.
*/
function aiovg_get_excerpt( $post_id = 0 , $char_length = 55, $append = '...', $allow_html = true ) {
$content = '';
if ( $post_id > 0 ) {
$post = get_post( $post_id );
} else {
global $post;
}
if ( ! empty( $post->post_excerpt ) ) {
$content = ( $allow_html == false ) ? wp_strip_all_tags( $post->post_excerpt, true ) : $post->post_excerpt;
} elseif ( ! empty( $post->post_content ) ) {
if ( 0 == $char_length ) {
$content = ( $allow_html == false ) ? wp_strip_all_tags( $post->post_content, true ) : $post->post_content;
} else {
$excerpt = wp_strip_all_tags( $post->post_content, true );
$char_length++;
if ( mb_strlen( $excerpt ) > $char_length ) {
$subex = mb_substr( $excerpt, 0, $char_length - 5 );
$exwords = explode( ' ', $subex );
$excut = - ( mb_strlen( $exwords[ count( $exwords ) - 1 ] ) );
if ( $excut < 0 ) {
$content = mb_substr( $subex, 0, $excut );
} else {
$content = $subex;
}
$content .= $append;
} else {
$content = $excerpt;
}
}
}
$content = trim( $content );
return apply_filters( 'aiovg_excerpt', $content, $post_id, $char_length, $append, $allow_html );
}
/**
* Get the file extension.
*
* @since 2.4.4
* @param string $url File URL.
* @param string $default Default file extension.
* @return string $ext File extension.
*/
function aiovg_get_file_ext( $url, $default = 'mp4' ) {
if ( $ext = pathinfo( $url, PATHINFO_EXTENSION ) ) {
return $ext;
}
return $default;
}
/**
* Get image data for the given object ID.
*
* @since 2.6.3
* @param int $object_id The ID of the object image is for.
* @param string $size Size of the image.
* @param string $object_type "post" or "term".
* @param bool $placeholder_image When the object has no image, returns a placeholder image if set to true.
* @return array The Image data.
*/
function aiovg_get_image( $object_id, $size = "large", $object_type = "post", $placeholder_image = false ) {
$image_data = array(
'src' => '',
'alt' => ''
);
$object_id = (int) $object_id;
$attach_id = 0;
if ( 'term' == $object_type ) {
// Get image from terms
if ( $attach_id = (int) get_term_meta( $object_id, 'image_id', true ) ) {
$attributes = wp_get_attachment_image_src( $attach_id, $size );
if ( ! empty( $attributes ) ) {
$image_data['src'] = $attributes[0];
$image_data['alt'] = get_post_meta( $attach_id, '_wp_attachment_image_alt', true );
} else {
$attach_id = 0;
}
}
if ( empty( $attach_id ) ) {
$image_url = get_term_meta( $object_id, 'image', true );
if ( ! empty( $image_url ) ) {
$image_data['src'] = $image_url;
}
}
} else {
// Get image from posts
if ( $attach_id = (int) get_post_meta( $object_id, 'image_id', true ) ) {
$attributes = wp_get_attachment_image_src( $attach_id, $size );
if ( ! empty( $attributes ) ) {
$image_data['src'] = $attributes[0];
$image_data['alt'] = get_post_meta( $attach_id, '_wp_attachment_image_alt', true );
} else {
$attach_id = 0;
}
}
if ( empty( $attach_id ) ) {
$image_url = get_post_meta( $object_id, 'image', true );
if ( ! empty( $image_url ) ) {
$image_data['src'] = $image_url;
} else {
if ( $attach_id = (int) get_post_meta( $object_id, '_thumbnail_id', true ) ) {
$attributes = wp_get_attachment_image_src( $attach_id, $size );
if ( ! empty( $attributes ) ) {
$image_data['src'] = $attributes[0];
$image_data['alt'] = get_post_meta( $attach_id, '_wp_attachment_image_alt', true );
}
}
}
}
// Set custom alt text if available
$image_alt = get_post_meta( $object_id, 'image_alt', true );
if ( ! empty( $image_alt ) ) {
$image_data['alt'] = $image_alt;
}
}
// Set default image
if ( empty( $image_data['src'] ) && ! empty( $placeholder_image ) ) {
$image_data['src'] = AIOVG_PLUGIN_PLACEHOLDER_IMAGE_URL;
}
// Return
return apply_filters( 'aiovg_get_image', $image_data, $object_id, $size, $object_type, $placeholder_image );
}
/**
* Get image URL using the attachment ID.
*
* @since 1.0.0
* @param int $id Attachment ID.
* @param string $size Size of the image.
* @param string $default Default image URL.
* @param string $type "gallery" or "player".
* @return string $url Image URL.
*/
function aiovg_get_image_url( $id, $size = "large", $default = '', $type = 'gallery' ) {
$url = '';
// Get image from attachment
if ( $id ) {
$attributes = wp_get_attachment_image_src( (int) $id, $size );
if ( ! empty( $attributes ) ) {
$url = $attributes[0];
}
}
// Set default image
if ( ! empty( $default ) ) {
$default = aiovg_make_url_absolute( $default );
} else {
if ( 'gallery' == $type ) {
$default = AIOVG_PLUGIN_PLACEHOLDER_IMAGE_URL;
}
}
if ( empty( $url ) ) {
$url = $default;
}
// Return image url
return apply_filters( 'aiovg_image_url', $url, $id, $size, $default, $type );
}
/**
* Get the client IP Address.
*
* @since 2.0.0
* @return string $ip_address The client IP Address.
*/
function aiovg_get_ip_address() {
// Whether ip is from share internet
if ( ! empty( $_SERVER['HTTP_CLIENT_IP'] ) ) {
$ip_address = $_SERVER['HTTP_CLIENT_IP'];
}
// Whether ip is from proxy
elseif ( ! empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
$ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
// Whether ip is from remote address
else {
$ip_address = $_SERVER['REMOTE_ADDR'];
}
return $ip_address;
}
/**
* Get message to display based on the $type input.
*
* @since 1.0.0
* @param string $msg_id Message Identifier.
* @return string $message Message to display.
*/
function aiovg_get_message( $msg_id ) {
$message = '';
switch ( $msg_id ) {
case 'videos_empty':
$message = __( 'No videos found', 'all-in-one-video-gallery' );
break;
case 'categories_empty':
$message = __( 'No categories found', 'all-in-one-video-gallery' );
break;
case 'tags_empty':
$message = __( 'No tags found', 'all-in-one-video-gallery' );
break;
case 'login_required':
$message = __( 'Sorry, you need to login to view this content.', 'all-in-one-video-gallery' );
break;
}
return $message;
}
/**
* Retrieve a plugin option with fallback to default settings.
*
* @since 4.5.2
* @param string $option The option name to retrieve.
* @return array The option value from the database or the default value.
*/
function aiovg_get_option( $option ) {
$settings = get_option( $option );
if ( ! is_array( $settings ) || empty( $settings ) ) {
$defaults = aiovg_get_default_settings();
$settings = isset( $defaults[ $option ] ) ? $defaults[ $option ] : array();
}
return $settings;
}
/**
* Get MySQL's RAND function seed value.
*
* @since 1.6.5
* @return string $seed Seed value.
*/
function aiovg_get_orderby_rand_seed( $paged = 'no_longer_required' ) {
$seed = wp_rand( 1, 999999 );
if ( isset( $_COOKIE['aiovg_rand_seed'] ) ) {
$seed = absint( $_COOKIE['aiovg_rand_seed'] );
}
return $seed;
}
/**
* Retrieves a page given its title.
*
* @since 4.6.2
* @param string $page_title Page title.
* @param string $output The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which correspond
* to a WP_Post object, an associative array, or a numeric array, respectively.
* @param string|array $post_type Optional. Post type or array of post types. Default 'page'.
* @return WP_Post|array|null WP_Post (or array) on success, or null on failure.
*/
function aiovg_get_page_by_title( $page_title, $output = OBJECT, $post_type = 'page' ) {
global $wpdb;
if ( is_array( $post_type ) ) {
$post_type = esc_sql( $post_type );
$post_type_in_string = "'" . implode( "','", $post_type ) . "'";
$sql = $wpdb->prepare(
"SELECT ID
FROM $wpdb->posts
WHERE post_title = %s
AND post_type IN ($post_type_in_string)",
$page_title
);
} else {
$sql = $wpdb->prepare(
"SELECT ID
FROM $wpdb->posts
WHERE post_title = %s
AND post_type = %s",
$page_title,
$post_type
);
}
$page = $wpdb->get_var( $sql );
if ( $page ) {
return get_post( $page, $output );
}
return null;
}
/**
* Get current page number.
*
* @since 1.0.0
* @return int $paged The current page number.
*/
function aiovg_get_page_number() {
global $paged;
if ( get_query_var( 'paged' ) ) {
$paged = get_query_var( 'paged' );
} elseif ( get_query_var( 'page' ) ) {
$paged = get_query_var( 'page' );
} else {
$paged = 1;
}
return absint( $paged );
}
/**
* Returns the base URL used for private masked media.
*
* @since 4.7.0
* @return string
*/
function aiovg_get_private_base_url() {
return untrailingslashit( get_site_url() ) . '/private/';
}
/**
* Get the sorting options for the search form.
*
* @since 3.8.4
* @return array $options Array of options.
*/
function aiovg_get_search_form_sort_options() {
$options = array(
'title-asc' => __( 'Title - Ascending', 'all-in-one-video-gallery' ),
'title-desc' => __( 'Title - Descending', 'all-in-one-video-gallery' ),
'date-desc' => __( 'Newest First', 'all-in-one-video-gallery' ),
'date-asc' => __( 'Oldest First', 'all-in-one-video-gallery' ),
'views-desc' => __( 'Most Viewed', 'all-in-one-video-gallery' )
);
$likes_settings = aiovg_get_option( 'aiovg_likes_settings' );
if ( ! empty( $likes_settings['like_button'] ) ) {
$options['likes-desc'] = __( 'Most Liked', 'all-in-one-video-gallery' );
}
return apply_filters( 'aiovg_search_form_sort_options', $options );
}
/**
* Get shortcode builder form fields.
*
* @since 1.5.7
*/
function aiovg_get_shortcode_fields() {
$defaults = aiovg_get_default_settings();
$categories_settings = array_merge( $defaults['aiovg_categories_settings'], aiovg_get_option( 'aiovg_categories_settings' ) );
$videos_settings = array_merge( $defaults['aiovg_videos_settings'], aiovg_get_option( 'aiovg_videos_settings' ) );
$player_settings = array_merge( $defaults['aiovg_player_settings'], aiovg_get_option( 'aiovg_player_settings' ) );
$images_settings = array_merge( $defaults['aiovg_images_settings'], aiovg_get_option( 'aiovg_images_settings' ) );
// Fields
$fields = array(
'video' => array(
'title' => __( 'Single Video', 'all-in-one-video-gallery' ),
'sections' => array(
'general' => array(
'title' => __( 'General', 'all-in-one-video-gallery' ),
'fields' => array(
array(
'name' => 'id',
'label' => __( 'Select Video', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'video',
'value' => 0
),
array(
'name' => 'type',
'label' => __( 'Source Type', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'select',
'options' => aiovg_get_video_source_types(),
'value' => 'default'
),
array(
'name' => 'mp4',
'label' => __( 'Video', 'all-in-one-video-gallery' ),
'description' => __( 'Enter your direct file URL in the textbox above (OR) upload your file using the "Upload File" link.', 'all-in-one-video-gallery' ),
'type' => 'media',
'value' => ''
),
array(
'name' => 'hls',
'label' => __( 'HLS', 'all-in-one-video-gallery' ),
'description' => sprintf( '%s: https://www.mysite.com/stream.m3u8', __( 'Example', 'all-in-one-video-gallery' ) ),
'type' => 'text',
'value' => ''
),
array(
'name' => 'dash',
'label' => __( 'MPEG-DASH', 'all-in-one-video-gallery' ),
'description' => sprintf( '%s: https://www.mysite.com/stream.mpd', __( 'Example', 'all-in-one-video-gallery' ) ),
'type' => 'text',
'value' => ''
),
array(
'name' => 'youtube',
'label' => __( 'YouTube', 'all-in-one-video-gallery' ),
'description' => sprintf( '%s: https://www.youtube.com/watch?v=twYp6W6vt2U', __( 'Example', 'all-in-one-video-gallery' ) ),
'type' => 'text',
'value' => ''
),
array(
'name' => 'vimeo',
'label' => __( 'Vimeo', 'all-in-one-video-gallery' ),
'description' => sprintf( '%s: https://vimeo.com/108018156', __( 'Example', 'all-in-one-video-gallery' ) ),
'type' => 'text',
'value' => ''
),
array(
'name' => 'dailymotion',
'label' => __( 'Dailymotion', 'all-in-one-video-gallery' ),
'description' => sprintf( '%s: https://www.dailymotion.com/video/x11prnt', __( 'Example', 'all-in-one-video-gallery' ) ),
'type' => 'text',
'value' => ''
),
array(
'name' => 'rumble',
'label' => __( 'Rumble', 'all-in-one-video-gallery' ),
'description' => sprintf( '%s: https://rumble.com/val8vm-how-to-use-rumble.html', __( 'Example', 'all-in-one-video-gallery' ) ),
'type' => 'text',
'value' => ''
),
array(
'name' => 'facebook',
'label' => __( 'Facebook', 'all-in-one-video-gallery' ),
'description' => sprintf( '%s: https://www.facebook.com/facebook/videos/10155278547321729', __( 'Example', 'all-in-one-video-gallery' ) ),
'type' => 'text',
'value' => ''
),
array(
'name' => 'poster',
'label' => __( 'Image', 'all-in-one-video-gallery' ),
'description' => __( 'Enter your direct file URL in the textbox above (OR) upload your file using the "Upload File" link.', 'all-in-one-video-gallery' ),
'type' => 'media',
'value' => ''
),
array(
'name' => 'width',
'label' => __( 'Width', 'all-in-one-video-gallery' ),
'description' => __( 'In pixels. Maximum width of the player. Leave this field empty to scale 100% of its enclosing container/html element.', 'all-in-one-video-gallery' ),
'type' => 'text',
'value' => ''
),
array(
'name' => 'ratio',
'label' => __( 'Height (Ratio)', 'all-in-one-video-gallery' ),
'description' => __( "In percentage. Calculates the players height based on the entered ratio.", 'all-in-one-video-gallery' ),
'type' => 'text',
'value' => $player_settings['ratio']
),
array(
'name' => 'autoplay',
'label' => __( 'Autoplay', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => $player_settings['autoplay']
),
array(
'name' => 'loop',
'label' => __( 'Loop', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => $player_settings['loop']
),
array(
'name' => 'muted',
'label' => __( 'Muted', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => $player_settings['muted']
)
)
),
'controls' => array(
'title' => __( 'Player Controls', 'all-in-one-video-gallery' ),
'fields' => array(
array(
'name' => 'playpause',
'label' => __( 'Play / Pause', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $player_settings['controls']['playpause'] )
),
array(
'name' => 'current',
'label' => __( 'Current Time', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $player_settings['controls']['current'] )
),
array(
'name' => 'progress',
'label' => __( 'Progressbar', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $player_settings['controls']['progress'] )
),
array(
'name' => 'duration',
'label' => __( 'Duration', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $player_settings['controls']['duration'] )
),
array(
'name' => 'tracks',
'label' => __( 'Subtitles', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $player_settings['controls']['tracks'] )
),
array(
'name' => 'chapters',
'label' => __( 'Chapters', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $player_settings['controls']['chapters'] )
),
array(
'name' => 'speed',
'label' => __( 'Speed Control', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $player_settings['controls']['speed'] )
),
array(
'name' => 'quality',
'label' => __( 'Quality Selector', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $player_settings['controls']['quality'] )
),
array(
'name' => 'volume',
'label' => __( 'Volume Button', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $player_settings['controls']['volume'] )
),
array(
'name' => 'pip',
'label' => __( 'Picture-in-Picture Button', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $player_settings['controls']['pip'] )
),
array(
'name' => 'fullscreen',
'label' => __( 'Fullscreen Button', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $player_settings['controls']['fullscreen'] )
),
array(
'name' => 'share',
'label' => __( 'Share Buttons', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $player_settings['controls']['share'] )
),
array(
'name' => 'embed',
'label' => __( 'Embed Button', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $player_settings['controls']['embed'] )
),
array(
'name' => 'download',
'label' => __( 'Download Button', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $player_settings['controls']['download'] )
)
)
)
)
),
'videos' => array(
'title' => __( 'Video Gallery', 'all-in-one-video-gallery' ),
'sections' => array(
'general' => array(
'title' => __( 'General', 'all-in-one-video-gallery' ),
'fields' => array(
array(
'name' => 'title',
'label' => __( 'Title', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'text',
'value' => ''
),
array(
'name' => 'template',
'label' => __( 'Select Template', 'all-in-one-video-gallery' ),
'description' => ( aiovg_fs()->is_not_paying() ? sprintf( __( '<a href="%s" target="_blank">Upgrade Pro</a> for more templates (Popup, Inline, Slider, Playlist, Compact, etc.)', 'all-in-one-video-gallery' ), esc_url( aiovg_fs()->get_upgrade_url() ) ) : '' ),
'type' => 'select',
'options' => aiovg_get_video_templates(),
'value' => $videos_settings['template']
),
array(
'name' => 'category',
'label' => __( 'Select Categories', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'categories',
'value' => array()
),
array(
'name' => 'tag',
'label' => __( 'Select Tags', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'tags',
'value' => array()
),
array(
'name' => 'include',
'label' => __( 'Include Video ID(s)', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'text',
'value' => ''
),
array(
'name' => 'exclude',
'label' => __( 'Exclude Video ID(s)', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'text',
'value' => ''
),
array(
'name' => 'orderby',
'label' => __( 'Order By', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'select',
'options' => array(
'title' => __( 'Title', 'all-in-one-video-gallery' ),
'date' => __( 'Date Added', 'all-in-one-video-gallery' ),
'views' => __( 'Views Count', 'all-in-one-video-gallery' ),
'likes' => __( 'Likes Count', 'all-in-one-video-gallery' ),
'dislikes' => __( 'Dislikes Count', 'all-in-one-video-gallery' ),
'rand' => __( 'Random', 'all-in-one-video-gallery' ),
'menu_order' => __( 'Menu Order', 'all-in-one-video-gallery' )
),
'value' => $videos_settings['orderby']
),
array(
'name' => 'order',
'label' => __( 'Order', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'select',
'options' => array(
'asc' => __( 'ASC', 'all-in-one-video-gallery' ),
'desc' => __( 'DESC', 'all-in-one-video-gallery' )
),
'value' => $videos_settings['order']
),
array(
'name' => 'featured',
'label' => __( 'Featured Only', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => 0
),
array(
'name' => 'related',
'label' => __( 'Follow URL', 'all-in-one-video-gallery' ) . ' (' . __( 'Related Videos', 'all-in-one-video-gallery' ) . ')',
'description' => '',
'type' => 'checkbox',
'value' => 0
),
)
),
'gallery' => array(
'title' => __( 'Gallery', 'all-in-one-video-gallery' ),
'fields' => array(
array(
'name' => 'ratio',
'label' => __( 'Height (Ratio)', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'text',
'value' => $images_settings['ratio']
),
array(
'name' => 'columns',
'label' => __( 'Columns', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'number',
'min' => 1,
'max' => 12,
'step' => 1,
'value' => $videos_settings['columns']
),
array(
'name' => 'limit',
'label' => __( 'Limit (per page)', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'number',
'min' => 0,
'max' => 500,
'step' => 1,
'value' => $videos_settings['limit']
),
array(
'name' => 'thumbnail_style',
'label' => __( 'Image Position', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'select',
'options' => array(
'standard' => __( 'Top', 'all-in-one-video-gallery' ),
'image-left' => __( 'Left', 'all-in-one-video-gallery' )
),
'value' => $videos_settings['thumbnail_style']
),
array(
'name' => 'display',
'label' => __( 'Show / Hide (Thumbnails)', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'header',
'value' => 0
),
array(
'name' => 'show_count',
'label' => __( 'Videos Count', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $videos_settings['display']['count'] )
),
array(
'name' => 'show_title',
'label' => __( 'Video Title', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $videos_settings['display']['title'] )
),
array(
'name' => 'show_category',
'label' => __( 'Category Name(s)', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $videos_settings['display']['category'] )
),
array(
'name' => 'show_tag',
'label' => __( 'Tag Name(s)', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $videos_settings['display']['tag'] )
),
array(
'name' => 'show_date',
'label' => __( 'Date Added', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $videos_settings['display']['date'] )
),
array(
'name' => 'show_user',
'label' => __( 'Author Name', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $videos_settings['display']['user'] )
),
array(
'name' => 'show_views',
'label' => __( 'Views Count', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $videos_settings['display']['views'] )
),
array(
'name' => 'show_likes',
'label' => __( 'Likes Count', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $videos_settings['display']['likes'] )
),
array(
'name' => 'show_dislikes',
'label' => __( 'Dislikes Count', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $videos_settings['display']['dislikes'] )
),
array(
'name' => 'show_comments',
'label' => __( 'Comments Count', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $videos_settings['display']['comments'] )
),
array(
'name' => 'show_duration',
'label' => __( 'Video Duration', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $videos_settings['display']['duration'] )
),
array(
'name' => 'show_excerpt',
'label' => __( 'Video Excerpt (Short Description)', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => isset( $videos_settings['display']['excerpt'] )
),
array(
'name' => 'title_length',
'label' => __( 'Title Length', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'number',
'value' => isset( $videos_settings['title_length'] ) ? $videos_settings['title_length'] : 0
),
array(
'name' => 'excerpt_length',
'label' => __( 'Excerpt Length', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'number',
'value' => $videos_settings['excerpt_length']
),
array(
'name' => 'show_pagination',
'label' => __( 'Pagination', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => 1
),
array(
'name' => 'show_more',
'label' => __( 'More Button', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => 0
),
array(
'name' => 'more_label',
'label' => __( 'More Button Label', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'text',
'value' => __( 'Show More', 'all-in-one-video-gallery' )
),
array(
'name' => 'more_link',
'label' => __( 'More Button Link', 'all-in-one-video-gallery' ),
'description' => __( 'Leave this field blank to use Ajax', 'all-in-one-video-gallery' ),
'type' => 'url',
'value' => ''
),
)
),
'filters' => array(
'title' => __( 'Filters & Search Form', 'all-in-one-video-gallery' ),
'fields' => array(
array(
'name' => 'filters_keyword',
'label' => __( 'Filter By Video Title, Description', 'all-in-one-video-gallery' ),
'description' => __( 'Enable keyword search that allows visitors to filter videos by matching words in the title or description.', 'all-in-one-video-gallery' ),
'type' => 'checkbox',
'value' => 0
),
array(
'name' => 'filters_category',
'label' => __( 'Filter By Categories', 'all-in-one-video-gallery' ),
'description' => __( 'Allow visitors to filter videos based on assigned categories.', 'all-in-one-video-gallery' ),
'type' => 'checkbox',
'value' => 0
),
array(
'name' => 'filters_tag',
'label' => __( 'Filter By Tags', 'all-in-one-video-gallery' ),
'description' => __( 'Allow visitors to filter videos based on assigned tags.', 'all-in-one-video-gallery' ),
'type' => 'checkbox',
'value' => 0
),
array(
'name' => 'filters_sort',
'label' => __( 'Sort By Dropdown', 'all-in-one-video-gallery' ),
'description' => __( 'Enable a dropdown to let visitors sort videos by options like date, title, or popularity.', 'all-in-one-video-gallery' ),
'type' => 'checkbox',
'value' => 0
),
array(
'name' => 'filters_reset_button',
'label' => __( 'Reset Button', 'all-in-one-video-gallery' ),
'description' => __( 'Show a reset button to allow visitors to clear all selected filters.', 'all-in-one-video-gallery' ),
'type' => 'checkbox',
'value' => 0
),
array(
'name' => 'filters_template',
'label' => __( 'Filters Template', 'all-in-one-video-gallery' ),
'description' => __( 'Choose how the filters will be displayed — vertically (stacked) or horizontally (inline).', 'all-in-one-video-gallery' ),
'type' => 'select',
'options' => array(
'vertical' => __( 'Vertical', 'all-in-one-video-gallery' ),
'horizontal' => __( 'Horizontal', 'all-in-one-video-gallery' )
),
'value' => 'horizontal'
),
array(
'name' => 'filters_mode',
'label' => __( 'Filters Mode', 'all-in-one-video-gallery' ),
'description' => __( 'How should the filter form behave when users interact with it?', 'all-in-one-video-gallery' ),
'type' => 'select',
'options' => array(
'live' => __( 'Live - Update instantly', 'all-in-one-video-gallery' ),
'ajax' => __( 'Ajax - Update instantly without page reload', 'all-in-one-video-gallery' ),
'search' => __( 'Search - Update on button click', 'all-in-one-video-gallery' )
),
'value' => 'live'
),
array(
'name' => 'filters_position',
'label' => __( 'Filters Position', 'all-in-one-video-gallery' ),
'description' => __( 'Decide where the filters should appear — above the gallery (Top), on the left, or on the right.', 'all-in-one-video-gallery' ),
'type' => 'select',
'options' => array(
'top' => __( 'Top', 'all-in-one-video-gallery' ),
'left' => __( 'Left', 'all-in-one-video-gallery' ),
'right' => __( 'Right', 'all-in-one-video-gallery' )
),
'value' => 'top'
)
)
)
)
),
'categories' => array(
'title' => __( 'Categories', 'all-in-one-video-gallery' ),
'sections' => array(
'general' => array(
'title' => __( 'General', 'all-in-one-video-gallery' ),
'fields' => array(
array(
'name' => 'title',
'label' => __( 'Title', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'text',
'value' => ''
),
array(
'name' => 'template',
'label' => __( 'Select Template', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'select',
'options' => array(
'grid' => __( 'Grid', 'all-in-one-video-gallery' ),
'list' => __( 'List', 'all-in-one-video-gallery' ),
'dropdown' => __( 'Dropdown', 'all-in-one-video-gallery' )
),
'value' => $categories_settings['template']
),
array(
'name' => 'id',
'label' => __( 'Select Parent', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'parent',
'options' => array(),
'value' => 0
),
array(
'name' => 'include',
'label' => __( 'Include Category ID(s)', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'text',
'value' => ''
),
array(
'name' => 'exclude',
'label' => __( 'Exclude Category ID(s)', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'text',
'value' => ''
),
array(
'name' => 'ratio',
'label' => __( 'Height (Ratio)', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'text',
'value' => $images_settings['ratio']
),
array(
'name' => 'columns',
'label' => __( 'Columns', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'number',
'min' => 1,
'max' => 12,
'step' => 1,
'value' => $categories_settings['columns']
),
array(
'name' => 'limit',
'label' => __( 'Limit (per page)', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'number',
'min' => 0,
'max' => 500,
'step' => 1,
'value' => $categories_settings['limit']
),
array(
'name' => 'orderby',
'label' => __( 'Order By', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'select',
'options' => array(
'id' => __( 'ID', 'all-in-one-video-gallery' ),
'count' => __( 'Count', 'all-in-one-video-gallery' ),
'name' => __( 'Name', 'all-in-one-video-gallery' ),
'slug' => __( 'Slug', 'all-in-one-video-gallery' ),
'menu_order' => __( 'Menu Order', 'all-in-one-video-gallery' )
),
'value' => $categories_settings['orderby']
),
array(
'name' => 'order',
'label' => __( 'Order', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'select',
'options' => array(
'asc' => __( 'ASC', 'all-in-one-video-gallery' ),
'desc' => __( 'DESC', 'all-in-one-video-gallery' )
),
'value' => $categories_settings['order']
),
array(
'name' => 'hierarchical',
'label' => __( 'Show Hierarchy', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => $categories_settings['hierarchical']
),
array(
'name' => 'show_description',
'label' => __( 'Show Description', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => $categories_settings['show_description']
),
array(
'name' => 'show_count',
'label' => __( 'Show Videos Count', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => $categories_settings['show_count']
),
array(
'name' => 'hide_empty',
'label' => __( 'Hide Empty Categories', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => $categories_settings['hide_empty']
),
array(
'name' => 'show_pagination',
'label' => __( 'Show Pagination', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => 1
)
)
)
)
),
'search_form' => array(
'title' => __( 'Search Form', 'all-in-one-video-gallery' ),
'sections' => array(
'general' => array(
'title' => __( 'General', 'all-in-one-video-gallery' ),
'fields' => array(
array(
'name' => 'template',
'label' => __( 'Select Template', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'select',
'options' => array(
'vertical' => __( 'Vertical', 'all-in-one-video-gallery' ),
'horizontal' => __( 'Horizontal', 'all-in-one-video-gallery' )
),
'value' => 'horizontal'
),
array(
'name' => 'keyword',
'label' => __( 'Search By Video Title, Description', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => 1
),
array(
'name' => 'category',
'label' => __( 'Search By Categories', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => 0
),
array(
'name' => 'tag',
'label' => __( 'Search By Tags', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => 0
),
array(
'name' => 'sort',
'label' => __( 'Sort By Dropdown', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => 0
),
array(
'name' => 'search_button',
'label' => __( 'Search Button', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => 1
),
array(
'name' => 'reset_button',
'label' => __( 'Reset Button', 'all-in-one-video-gallery' ),
'description' => '',
'type' => 'checkbox',
'value' => 1
),
array(
'name' => 'target',
'label' => __( 'Search Results Page', 'all-in-one-video-gallery' ),
'description' => __( 'The selected "Search Results Page" must include the [aiovg_search] shortcode, which will be replaced by the search results.', 'all-in-one-video-gallery' ),
'type' => 'select',
'options' => array(
'default' => __( "Use Plugin's Default Search Results Page", 'all-in-one-video-gallery' ),
'current' => __( 'Display Results on Current Page', 'all-in-one-video-gallery' )
),
'value' => 'default'
)
)
)
)
)
);
// Email Capture: only expose the field in the shortcode builder when globally enabled
$email_capture_settings = array_merge( $defaults['aiovg_email_capture_settings'], aiovg_get_option( 'aiovg_email_capture_settings' ) );
if ( ! empty( $email_capture_settings['enable_email_capture'] ) ) {
$fields['video']['sections']['email_capture'] = array(
'title' => __( 'Email & Lead Capture', 'all-in-one-video-gallery' ),
'fields' => array(
array(
'name' => 'email_capture',
'label' => __( 'Email Capture', 'all-in-one-video-gallery' ),
'description' => __( 'Show an email collection form on this video to capture leads.', 'all-in-one-video-gallery' ),
'type' => 'checkbox',
'value' => 1
)
)
);
}
return apply_filters( 'aiovg_shortcode_fields', $fields );
}
/**
* Get temporary file download ID.
*
* @since 2.6.1
* @param string $path File path.
* @return string Download ID.
*/
function aiovg_get_temporary_file_download_id( $path ) {
$transient_key = md5( $path );
delete_transient( $transient_key );
set_transient( $transient_key, $path, 1 * HOUR_IN_SECONDS );
return $transient_key;
}
/**
* Retrieves the date on which the video was added.
*
* @since 3.6.3
* @return string Date the current video was added.
*/
function aiovg_get_the_date() {
$general_settings = aiovg_get_option( 'aiovg_general_settings' );
if ( isset( $general_settings['datetime_format'] ) && ! empty( $general_settings['datetime_format'] ) ) {
$date = get_the_date( $general_settings['datetime_format'] );
} else {
$date = sprintf(
__( '%s ago', 'all-in-one-video-gallery' ),
human_time_diff( get_the_time( 'U' ), current_time( 'timestamp' ) )
);
}
return apply_filters( 'aiovg_get_the_date', $date );
}
/**
* Get unique ID.
*
* @since 1.5.7
* @return string Unique ID.
*/
function aiovg_get_uniqid() {
static $counter = 0;
return uniqid() . ++$counter;
}
/**
* Get video source types.
*
* @since 1.0.0
* @param bool $is_admin True if admin, false if not
* @return array Array of source types.
*/
function aiovg_get_video_source_types( $is_admin = false ) {
$types = array(
'default' => __( 'Video File (mp4, webm, ogv, m4v, mov)', 'all-in-one-video-gallery' ),
'adaptive' => __( 'HLS / MPEG-DASH', 'all-in-one-video-gallery' ),
'youtube' => __( 'YouTube', 'all-in-one-video-gallery' ),
'vimeo' => __( 'Vimeo', 'all-in-one-video-gallery' ),
'dailymotion' => __( 'Dailymotion', 'all-in-one-video-gallery' ),
'rumble' => __( 'Rumble', 'all-in-one-video-gallery' ),
'facebook' => __( 'Facebook', 'all-in-one-video-gallery' )
);
if ( $is_admin && current_user_can( 'unfiltered_html' ) ) {
$types['embedcode'] = __( 'Third-Party Player Code', 'all-in-one-video-gallery' );
}
return apply_filters( 'aiovg_video_source_types', $types );
}
/**
* Get video templates.
*
* @since 1.5.7
* @return array Array of video templates.
*/
function aiovg_get_video_templates() {
$templates = array(
'classic' => __( 'Classic', 'all-in-one-video-gallery' )
);
return apply_filters( 'aiovg_video_templates', $templates );
}
/**
* Get a list of user roles.
*
* @since 3.9.6
* @return array Array of user roles.
*/
function aiovg_get_user_roles() {
$roles = wp_roles()->get_names();
asort( $roles );
return $roles;
}
/**
* Inserts a new key/value after the key in the array.
*
* @since 1.0.0
* @param string $key The key to insert after.
* @param array $array An array to insert in to.
* @param array $new_array An array to insert.
* @return The new array if the key exists, FALSE otherwise.
*/
function aiovg_insert_array_after( $key, $array, $new_array ) {
if ( array_key_exists( $key, $array ) ) {
$new = array();
foreach ( $array as $k => $value ) {
$new[ $k ] = $value;
if ( $k === $key ) {
foreach ( $new_array as $new_key => $new_value ) {
$new[ $new_key ] = $new_value;
}
}
}
return $new;
}
return $array;
}
/**
* Insert required custom pages and return their IDs as array.
*
* @since 1.0.0
* @return array Array of created page IDs.
*/
function aiovg_insert_custom_pages() {
// Vars
$page_settings = get_option( 'aiovg_page_settings' );
if ( ! is_array( $page_settings ) || empty( $page_settings ) ) {
$pages = array();
$page_definitions = aiovg_get_custom_pages_list();
foreach ( $page_definitions as $slug => $page ) {
$page_check = aiovg_get_page_by_title( $page['title'] );
if ( ! isset( $page_check->ID ) ) {
$id = wp_insert_post(
array(
'post_title' => $page['title'],
'post_content' => $page['content'],
'post_status' => 'publish',
'post_author' => 1,
'post_type' => 'page',
'comment_status' => 'closed'
)
);
$pages[ $slug ] = $id;
} else {
$pages[ $slug ] = $page_check->ID;
}
}
} else {
$pages = $page_settings;
}
return $pages;
}
/**
* Insert missing custom pages.
*
* @since 2.4.3
*/
function aiovg_insert_missing_pages() {
$pages = aiovg_get_option( 'aiovg_page_settings' );
$page_definitions = aiovg_get_custom_pages_list();
foreach ( $page_definitions as $slug => $page ) {
if ( ! array_key_exists( $slug, $pages ) ) {
$page_check = aiovg_get_page_by_title( $page['title'] );
if ( ! isset( $page_check->ID ) ) {
$id = wp_insert_post(
array(
'post_title' => $page['title'],
'post_content' => $page['content'],
'post_status' => 'publish',
'post_author' => 1,
'post_type' => 'page',
'comment_status' => 'closed'
)
);
$pages[ $slug ] = $id;
} else {
$pages[ $slug ] = $page_check->ID;
}
}
}
update_option( 'aiovg_page_settings', $pages );
}
/**
* Check whether the current post/page uses Gutenberg editor.
*
* @since 1.6.2
* @return bool True if the post/page uses Gutenberg, false if not.
*/
function aiovg_is_gutenberg_page() {
if ( function_exists( 'is_gutenberg_page' ) && is_gutenberg_page() ) {
// The Gutenberg plugin is on
return true;
}
$current_screen = get_current_screen();
if ( method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() ) {
// Gutenberg page on 5+
return true;
}
return false;
}
/**
* Check if Yoast or the Rank Math SEO plugin is active.
*
* @since 3.9.5
* @return bool True if active, false if not.
*/
function aiovg_is_yoast_or_rank_math_active() {
$active_plugins = apply_filters( 'active_plugins', get_option( 'active_plugins' ) );
// Check if Yoast SEO plugin is active
if ( in_array( 'wordpress-seo/wp-seo.php', $active_plugins ) || in_array( 'wordpress-seo-premium/wp-seo-premium.php', $active_plugins ) ) {
return true;
}
// Check if Rank Math SEO plugin is active
if ( in_array( 'seo-by-rank-math/rank-math.php', $active_plugins ) ) {
return true;
}
return false;
}
/**
* Convert relative file paths into absolute URLs.
*
* @since 3.8.4
* @param string $url Input file URL.
* @return string $url Absolute file URL.
*/
function aiovg_make_url_absolute( $url ) {
if ( empty( $url ) ) {
return $url;
}
// Trim any unnecessary whitespaces
$url = trim( $url );
// If there's no host, it's likely a relative URL
$host = parse_url( $url, PHP_URL_HOST );
if ( empty( $host ) ) {
// Prepend the site URL to make it absolute
$url = get_site_url( null, $url );
}
return $url;
}
/**
* Prepares shortcode attributes for AJAX requests.
*
* This function removes unwanted attributes from the shortcode attributes array
* before passing it as JSON parameters in AJAX requests.
*
* @since 4.0.1
* @param array $attributes Shortcode attributes.
* @return array Filtered attributes suitable for AJAX requests.
*/
function aiovg_prepare_attributes_for_ajax( $attributes ) {
$exclude_attributes = array(
'display',
'filters',
'filters_keyword',
'filters_category',
'filters_tag',
'filters_sort',
'filters_template',
'filters_mode',
'filters_position'
);
foreach ( $exclude_attributes as $attribute ) {
unset( $attributes[ $attribute ] );
}
return $attributes;
}
/**
* Removes an item or list from the query string.
*
* @since 1.0.0
* @param string|array $key Query key or keys to remove.
* @param bool|string $query When false uses the $_SERVER value. Default false.
* @return string New URL query string.
*/
function aiovg_remove_query_arg( $key, $query = false ) {
if ( is_array( $key ) ) { // removing multiple keys
foreach ( $key as $k ) {
$query = str_replace( '#038;', '&', $query );
$query = add_query_arg( $k, false, $query );
}
return $query;
}
return add_query_arg( $key, false, $query );
}
/**
* Remove 'unfiltered_html' capability from editors.
*
* @since 4.4.1
*/
function aiovg_remove_unfiltered_html_capability_from_editors() {
// Get the Editor role
$editor = get_role( 'editor' );
// Remove the unfiltered_html capability if it exists
if ( $editor && $editor->has_cap( 'unfiltered_html' ) ) {
$editor->remove_cap( 'unfiltered_html' );
}
}
/**
* Convert relative file paths into absolute URLs.
*
* @since 2.4.0
* @deprecated 3.8.4 Use aiovg_make_url_absolute() instead.
* @param string $url Input file URL.
* @return string Absolute file URL.
*/
function aiovg_resolve_url( $url ) {
return aiovg_make_url_absolute( $url );
}
/**
* Sanitize the array inputs.
*
* @since 1.0.0
* @param array $value Input array.
* @return array Sanitized array.
*/
function aiovg_sanitize_array( $value ) {
return ! empty( $value ) ? array_map( 'sanitize_text_field', $value ) : array();
}
/**
* Sanitize the integer inputs, accepts empty values.
*
* @since 1.0.0
* @param string|int $value Input value.
* @return string|int Sanitized value.
*/
function aiovg_sanitize_int( $value ) {
$value = intval( $value );
return ( 0 == $value ) ? '' : $value;
}
/**
* Sanitize the URLs. Accepts relative file paths, spaces.
*
* @since 2.4.0
* @param string $value Input value.
* @return string Sanitized value.
*/
function aiovg_sanitize_url( $value ) {
if ( ! empty( $value ) ) {
$value = trim( $value );
}
return sanitize_url( $value );
}
/**
* Trims text to a certain number of characters.
*
* @since 2.5.8
* @param string $text Text to be trimmed.
* @param int $char_length Character length.
* @param string $append String to append to the end of the trimmed content.
* @return string $text Trimmed text.
*/
function aiovg_truncate( $text, $char_length = 55, $append = '...' ) {
if ( empty( $char_length ) ) {
return $text;
}
$text = strip_tags( $text );
if ( $char_length > 0 && strlen( $text ) > $char_length ) {
$tmp = substr( $text, 0, $char_length );
$tmp = substr( $tmp, 0, strrpos( $tmp, ' ' ) );
if ( strlen( $tmp ) >= $char_length - 3 ) {
$tmp = substr( $tmp, 0, strrpos( $tmp, ' ' ) );
}
$text = $tmp . '...';
}
return $text;
}
/**
* Update video views count.
*
* @since 1.0.0
* @param int $post_id Post ID
*/
function aiovg_update_views_count( $post_id ) {
$general_settings = aiovg_get_option( 'aiovg_general_settings' );
$can_update_views_count = apply_filters(
'aiovg_can_update_views_count',
isset( $general_settings['statistics'] ) ? (int) $general_settings['statistics'] : 1,
$post_id
);
if ( ! $can_update_views_count ) {
return;
}
$privacy_settings = aiovg_get_option( 'aiovg_privacy_settings' );
if ( isset( $privacy_settings['disable_cookies'] ) && isset( $privacy_settings['disable_cookies']['aiovg_videos_views'] ) ) {
$count = (int) get_post_meta( $post_id, 'views', true );
update_post_meta( $post_id, 'views', ++$count );
} else {
$visited = array();
if ( isset( $_COOKIE['aiovg_videos_views'] ) ) {
$visited = explode( '|', $_COOKIE['aiovg_videos_views'] );
$visited = array_map( 'intval', $visited );
}
if ( ! in_array( $post_id, $visited ) ) {
$count = (int) get_post_meta( $post_id, 'views', true );
update_post_meta( $post_id, 'views', ++$count );
// SetCookie
$visited[] = $post_id;
setcookie( 'aiovg_videos_views', implode( '|', $visited ), time() + ( 86400 * 30 ), COOKIEPATH, COOKIE_DOMAIN );
}
}
}