widget_slug = 'aiovg-widget-videos'; $this->fields = aiovg_get_shortcode_fields(); $this->excluded_fields = array( 'ratio', 'title_length', 'excerpt_length' ); $this->defaults = $this->get_defaults(); parent::__construct( $this->widget_slug, __( 'AIOVG - Video Gallery', 'all-in-one-video-gallery' ), array( 'classname' => $this->widget_slug, 'description' => __( 'Display a video gallery.', 'all-in-one-video-gallery' ) ) ); } /** * Outputs the content of the widget. * * @since 1.0.0 * @param array $args The array of form elements. * @param array $instance The current instance of the widget. */ public function widget( $args, $instance ) { // Merge incoming $instance array with $defaults if ( count( $instance ) ) { foreach ( $this->excluded_fields as $excluded_field ) { if ( isset( $instance[ $excluded_field ] ) ) { unset( $instance[ $excluded_field ] ); // Always get this value from the global settings } } $attributes = array_merge( $this->defaults, $instance ); } else { $attributes = $this->defaults; } $attributes = $this->prepare_attributes( $attributes ); $orderby = sanitize_text_field( $attributes['orderby'] ); $order = sanitize_text_field( $attributes['order'] ); if ( 'classic' == $attributes['template'] ) $attributes['deeplinking'] = 0; $deeplink_video_id = ! empty( $attributes['deeplinking'] ) ? (int) $attributes['deeplink_video'] : 0; // Added for backward compatibility (version < 1.5.7) if ( isset( $instance['image_position'] ) && 'left' == $instance['image_position'] ) { $attributes['thumbnail_style'] = 'image-left'; } // Define the query global $post; $query = array( 'post_type' => 'aiovg_videos', 'posts_per_page' => ! empty( $attributes['limit'] ) ? (int) $attributes['limit'] : -1, 'post_status' => array( 'publish' ) ); if ( isset( $attributes['search_query'] ) && ! empty( $attributes['search_query'] ) ) { // Search $query['s'] = sanitize_text_field( $attributes['search_query'] ); } if ( isset( $attributes['exclude'] ) ) { // Exclude video IDs $exclude = is_array( $attributes['exclude'] ) ? array_map( 'intval', $attributes['exclude'] ) : array_map( 'intval', explode( ',', $attributes['exclude'] ) ); $exclude = array_filter( $exclude ); if ( ! empty( $exclude ) ) { $query['post__not_in'] = $exclude; } } // Taxonomy Parameters $tax_queries = array(); if ( isset( $attributes['category'] ) ) { // Category $categories = is_array( $attributes['category'] ) ? array_map( 'intval', $attributes['category'] ) : array_map( 'intval', explode( ',', $attributes['category'] ) ); $categories = array_filter( $categories ); if ( ! empty( $categories ) ) { $tax_queries[] = array( 'taxonomy' => 'aiovg_categories', 'field' => 'term_id', 'terms' => $categories, 'include_children' => false ); } } if ( isset( $attributes['category_exclude'] ) ) { // Exclude categories $category_exclude = is_array( $attributes['category_exclude'] ) ? array_map( 'intval', $attributes['category_exclude'] ) : array_map( 'intval', explode( ',', $attributes['category_exclude'] ) ); $category_exclude = array_filter( $category_exclude ); if ( ! empty( $category_exclude ) ) { $tax_queries[] = array( 'taxonomy' => 'aiovg_categories', 'field' => 'term_id', 'terms' => $category_exclude, 'include_children' => false, 'operator' => 'NOT IN' ); } } if ( isset( $attributes['tag'] ) ) { // Tag $tags = is_array( $attributes['tag'] ) ? array_map( 'intval', $attributes['tag'] ) : array_map( 'intval', explode( ',', $attributes['tag'] ) ); $tags = array_filter( $tags ); if ( ! empty( $tags ) ) { $tax_queries[] = array( 'taxonomy' => 'aiovg_tags', 'field' => 'term_id', 'terms' => $tags, 'include_children' => false ); } } $count_tax_queries = count( $tax_queries ); if ( $count_tax_queries ) { $tax_relation = ! empty( $attributes['related'] ) ? 'OR' : 'AND'; $query['tax_query'] = ( $count_tax_queries > 1 ) ? array_merge( array( 'relation' => $tax_relation ), $tax_queries ) : $tax_queries; } // Custom Field (post meta) Parameters $meta_queries = array(); if ( 'likes' == $orderby ) { // Likes $meta_queries['likes'] = array( 'relation' => 'OR', array( 'key' => 'likes', 'compare' => 'NOT EXISTS' ), array( 'key' => 'likes', 'compare' => 'EXISTS' ) ); } if ( 'dislikes' == $orderby ) { // Dislikes $meta_queries['dislikes'] = array( 'key' => 'dislikes', 'value' => 0, 'compare' => '>' ); } if ( 'views' == $orderby ) { // Views $meta_queries['views'] = array( 'relation' => 'OR', array( 'key' => 'views', 'compare' => 'NOT EXISTS' ), array( 'key' => 'views', 'compare' => 'EXISTS' ) ); } if ( ! empty( $attributes['featured'] ) ) { $meta_queries['featured'] = array( 'key' => 'featured', 'value' => 1, 'compare' => '=' ); } $count_meta_queries = count( $meta_queries ); if ( $count_meta_queries ) { $query['meta_query'] = ( $count_meta_queries > 1 ) ? array_merge( array( 'relation' => 'AND' ), $meta_queries ) : $meta_queries; } // Order & Orderby Parameters switch ( $orderby ) { case 'likes': $query['orderby'] = 'meta_value_num'; $query['order'] = $order; break; case 'dislikes': $query['meta_key'] = $orderby; $query['orderby'] = 'meta_value_num'; $query['order'] = $order; break; case 'views': $query['orderby'] = 'meta_value_num'; $query['order'] = $order; break; case 'rand': $seed = aiovg_get_orderby_rand_seed(); $query['orderby'] = 'RAND(' . $seed . ')'; break; default: $query['orderby'] = $orderby; $query['order'] = $order; } // Deeplinking: Add the filter if conditions are met $deeplink_video_callback = function( $orderby_sql, $query ) use ( $deeplink_video_id ) { if ( $query->get('post_type') !== 'aiovg_videos' ) { return $orderby_sql; } global $wpdb; return "CASE {$wpdb->posts}.ID WHEN {$deeplink_video_id} THEN 0 ELSE 1 END, " . $orderby_sql; }; if ( ! empty( $deeplink_video_id ) ) { add_filter( 'posts_orderby', $deeplink_video_callback, 10, 2 ); } $query = apply_filters( 'aiovg_query_args', $query, $attributes ); $aiovg_query = new WP_Query( $query ); // Deeplinking: Remove the filter if conditions were met if ( ! empty( $deeplink_video_id ) ) { remove_filter( 'posts_orderby', $deeplink_video_callback, 10 ); } // Enqueue dependencies wp_enqueue_style( AIOVG_PLUGIN_SLUG . '-public' ); // Process output echo $args['before_widget']; if ( ! empty( $instance['title'] ) ) { echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title']; } if ( $aiovg_query->have_posts() ) { unset( $attributes['title'] ); ob_start(); include apply_filters( 'aiovg_load_template', AIOVG_PLUGIN_DIR . 'public/templates/videos-template-classic.php', $attributes ); $content = ob_get_clean(); } else { $content = sprintf( '
%s
', esc_html( aiovg_get_message( 'videos_empty' ) ) ); } $content = aiovg_wrap_with_filters( $content, $attributes ); echo $content; echo $args['after_widget']; } /** * Processes the widget's options to be saved. * * @since 1.0.0 * @param array $new_instance The new instance of values to be generated via the update. * @param array $old_instance The previous instance of values before the update. */ public function update( $new_instance, $old_instance ) { $instance = $old_instance; foreach ( $this->fields['videos']['sections'] as $section ) { foreach ( $section['fields'] as $field ) { $field_name = $field['name']; if ( in_array( $field_name, $this->excluded_fields ) ) { continue; } if ( 'categories' == $field['type'] ) { $instance['category'] = isset( $new_instance['category'] ) ? array_map( 'intval', $new_instance['category'] ) : array(); } elseif ( 'tags' == $field['type'] ) { $instance['tag'] = isset( $new_instance['tag'] ) ? array_map( 'intval', $new_instance['tag'] ) : array(); } elseif ( 'number' == $field['type'] ) { if ( ! empty( $new_instance[ $field_name ] ) ) { $instance[ $field_name ] = false === strpos( $new_instance[ $field_name ], '.' ) ? (int) $new_instance[ $field_name ] : (float) $new_instance[ $field_name ]; } else { $instance[ $field_name ] = 0; } } elseif ( 'url' == $field['type'] ) { $instance[ $field_name ] = ! empty( $new_instance[ $field_name ] ) ? aiovg_sanitize_url( $new_instance[ $field_name ] ) : ''; } elseif ( 'checkbox' == $field['type'] ) { $instance[ $field_name ] = isset( $new_instance[ $field_name ] ) ? (int) $new_instance[ $field_name ] : 0; } else { $instance[ $field_name ] = ! empty( $new_instance[ $field_name ] ) ? sanitize_text_field( $new_instance[ $field_name ] ) : ''; } } } return $instance; } /** * Generates the administration form for the widget. * * @since 1.0.0 * @param array $instance The array of keys and values for the widget. */ public function form( $instance ) { // Parse incoming $instance into an array and merge it with $defaults $instance = wp_parse_args( (array) $instance, $this->defaults ); // Added for backward compatibility (version < 1.5.7) if ( isset( $instance['image_position'] ) && 'left' == $instance['image_position'] ) { $instance['thumbnail_style'] = 'image-left'; } // Display the admin form include AIOVG_PLUGIN_DIR . 'widgets/forms/videos.php'; } /** * Prepares and processes the complete attributes array for the widget. * * @since 4.0.1 * @param array $attributes Raw widget attributes. * @return array Fully prepared attributes array, ready for use. */ public function prepare_attributes( $attributes ) { $attributes['uid'] = aiovg_get_uniqid(); $attributes['show_count'] = 0; // Related if ( ! empty( $attributes['related'] ) ) { if ( is_singular( 'aiovg_videos' ) ) { global $wp_the_query; $post_id = $wp_the_query->get_queried_object_id(); $categories = wp_get_object_terms( $post_id, 'aiovg_categories', array( 'fields' => 'ids' ) ); $attributes['category'] = ! empty( $categories ) ? $categories : ''; $tags = wp_get_object_terms( $post_id, 'aiovg_tags', array( 'fields' => 'ids' ) ); $attributes['tag'] = ! empty( $tags ) ? $tags : ''; $attributes['exclude'] = array( $post_id ); } else { // Category page if ( $term_slug = get_query_var( 'aiovg_category' ) ) { $term = get_term_by( 'slug', sanitize_text_field( $term_slug ), 'aiovg_categories' ); $attributes['category'] = $term->term_id; } // Tag page if ( $term_slug = get_query_var( 'aiovg_tag' ) ) { $term = get_term_by( 'slug', sanitize_text_field( $term_slug ), 'aiovg_tags' ); $attributes['tag'] = $term->term_id; } } } // Search if ( ! empty( $attributes['filters_keyword'] ) || ! empty( $attributes['filters_category'] ) || ! empty( $attributes['filters_tag'] ) || ! empty( $attributes['filters_sort'] ) ) { $search_query = isset( $_GET['vi'] ) ? sanitize_text_field( $_GET['vi'] ) : ''; if ( ! empty( $search_query ) ) { $attributes['search_query'] = $search_query; } $categories = isset( $_GET['ca'] ) ? (array) $_GET['ca'] : array(); $categories = array_map( 'intval', $categories ); $categories = array_filter( $categories ); if ( ! empty( $categories ) ) { $attributes['category'] = $categories; } else { $categories_excluded = get_terms( array( 'taxonomy' => 'aiovg_categories', 'hide_empty' => false, 'fields' => 'ids', 'meta_key' => 'exclude_search_form', 'meta_value' => 1 ) ); if ( ! empty( $categories_excluded ) && ! is_wp_error( $categories_excluded ) ) { $attributes['category_exclude'] = $categories_excluded; } } $tags = isset( $_GET['ta'] ) ? (array) $_GET['ta'] : array(); $tags = array_map( 'intval', $tags ); $tags = array_filter( $tags ); if ( ! empty( $tags ) ) { $attributes['tag'] = $tags; } $sort = isset( $_GET['sort'] ) ? sanitize_key( $_GET['sort'] ) : ''; if ( ! empty( $sort ) ) { $sort = array_filter( array_map( 'trim', explode( '-', $sort ) ) ); if ( ! empty( $sort ) ) { $attributes['orderby'] = $sort[0]; if ( count( $sort ) > 1 ) { $attributes['order'] = $sort[1]; } } } } // Pagination if ( empty( $attributes['more_label'] ) ) { $attributes['more_label'] = __( 'Show More', 'all-in-one-video-gallery' ); } if ( 'ajax' == $attributes['filters_mode'] ) { $attributes['pagination_ajax'] = 1; } return $attributes; } /** * Get the default attribute values. * * @since 1.0.0 * @return array An associative array of attributes. */ public function get_defaults() { $pagination_settings = aiovg_get_option( 'aiovg_pagination_settings' ); $defaults = array(); foreach ( $this->fields['videos']['sections'] as $section ) { foreach ( $section['fields'] as $field ) { $defaults[ $field['name'] ] = $field['value']; } } foreach ( $this->fields['categories']['sections']['general']['fields'] as $field ) { if ( 'orderby' == $field['name'] || 'order' == $field['name'] ) { $defaults[ 'categories_' . $field['name'] ] = $field['value']; } } foreach ( $this->fields['video']['sections']['general']['fields'] as $field ) { if ( 'autoplay' == $field['name'] || 'loop' == $field['name'] || 'muted' == $field['name'] ) { $defaults[ 'player_' . $field['name'] ] = $field['value']; } } foreach ( $this->fields['video']['sections']['controls']['fields'] as $field ) { $defaults[ 'player_' . $field['name'] ] = $field['value']; } $defaults['filters_keyword'] = 0; $defaults['filters_category'] = 0; $defaults['filters_tag'] = 0; $defaults['filters_sort'] = 0; $defaults['filters_template'] = 'horizontal'; $defaults['filters_mode'] = 'live'; $defaults['filters_position'] = 'top'; $defaults['source'] = 'videos'; $defaults['count'] = 0; $defaults['paged'] = 1; $defaults['pagination_ajax'] = isset( $pagination_settings['ajax'] ) && ! empty( $pagination_settings['ajax'] ) ? 1 : 0; $defaults['deeplink_video'] = aiovg_get_deeplink_video_id(); $defaults['show_player_category'] = 0; $defaults['show_player_tag'] = 0; $defaults = array_merge( $defaults, array( 'title' => __( 'Video Gallery', 'all-in-one-video-gallery' ), 'columns' => 1, 'thumbnail_style' => 'image-left', 'ratio' => ! empty( $defaults['ratio'] ) ? (float) $defaults['ratio'] . '%' : '56.25%', 'show_pagination' => 0 ) ); return $defaults; } }