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 ''; }); } /** * 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' => __( 'Please accept cookies to play this video. 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 player’s 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( __( 'Upgrade Pro 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 ); } } }