'', 'margin_right' => '', 'margin_bottom' => '', 'margin_left' => '', 'hide_on_mobile' => fusion_builder_default_visibility( 'string' ), 'class' => '', 'id' => '', 'category' => '', 'excerpt' => '35', 'layout' => 'attachments', 'lightbox' => 'yes', 'limit' => '3', 'post_id' => '', ]; } /** * Gets the query data for live preview. * * @static * @access public * @since 2.0.0 */ public static function query() { if ( isset( $_POST['params'] ) && isset( $_POST['params']['layout'] ) && ! apply_filters( 'fusion_builder_live_request', false ) ) { // phpcs:ignore WordPress.Security.NonceVerification $params = wp_unslash( $_POST['params'] ); // phpcs:ignore WordPress.Security $layout = sanitize_text_field( $params['layout'] ); add_filter( 'fusion_builder_live_request', '__return_true' ); $flex_slider = new FusionSC_Flexslider(); $flex_slider->args = $params; if ( 'attachments' === $layout ) { $return_data = $flex_slider->attachments_and_thumbnails( true ); } elseif ( 'posts' === $layout ) { $return_data = $flex_slider->posts( false, true ); } elseif ( 'posts-with-excerpt' === $layout ) { $return_data = $flex_slider->posts( true, true ); } if ( empty( $return_data ) ) { $return_data['placeholder'] = fusion_builder_placeholder( 'post_slider', 'posts' ); } echo wp_json_encode( $return_data ); } wp_die(); } /** * Render the shortcode * * @access public * @since 1.0 * @param array $args Shortcode parameters. * @param string $content Content between shortcode. * @return string HTML output. */ public function render( $args, $content = '' ) { $this->defaults = self::get_element_defaults(); $defaults = FusionBuilder::set_shortcode_defaults( $this->defaults, $args, 'fusion_postslider' ); $content = apply_filters( 'fusion_shortcode_content', $content, 'fusion_postslider', $args ); $this->args = $defaults; $this->args['margin_bottom'] = FusionBuilder::validate_shortcode_attr_value( $this->args['margin_bottom'], 'px' ); $this->args['margin_left'] = FusionBuilder::validate_shortcode_attr_value( $this->args['margin_left'], 'px' ); $this->args['margin_right'] = FusionBuilder::validate_shortcode_attr_value( $this->args['margin_right'], 'px' ); $this->args['margin_top'] = FusionBuilder::validate_shortcode_attr_value( $this->args['margin_top'], 'px' ); $slider = ''; if ( 'attachments' === $this->args['layout'] ) { $attachments_and_thumbnails = $this->attachments_and_thumbnails(); $slider = $attachments_and_thumbnails[0]; } elseif ( 'posts' === $this->args['layout'] ) { $slider = $this->posts( false ); } elseif ( 'posts-with-excerpt' === $this->args['layout'] ) { $slider = $this->posts( true ); } if ( empty( $slider ) ) { return fusion_builder_placeholder( 'post_slider', 'posts' ); } $slides_html = ''; $html = '
' . $slides_html . '
'; if ( 'attachments' === $this->args['layout'] ) { $html .= '
'; } $this->flex_counter++; $this->on_render(); return apply_filters( 'fusion_element_post_slider_content', $html, $args ); } /** * Creates the attachements and thumbnails HTML. * * @access public * @since 1.0 * @param bool $live_request Whether or not this is an ajax request. * @return array Holding the HTML for attachment list and thumbnails list. */ public function attachments_and_thumbnails( $live_request = false ) { $return_data = []; $html_attachments = ''; $html_thumbnails = ''; if ( ! $this->args['post_id'] ) { $this->args['post_id'] = get_the_ID(); } $query = fusion_cached_get_posts( [ 'post_type' => 'attachment', 'posts_per_page' => $this->args['limit'], 'post_status' => 'any', 'post_parent' => $this->args['post_id'], 'orderby' => 'menu_order', 'order' => 'ASC', 'post_mime_type' => 'image', 'exclude' => get_post_thumbnail_id(), ] ); if ( $query ) { foreach ( $query as $attachment ) { $image_data = fusion_library()->images->get_attachment_data_by_helper( $attachment->ID ); $thumb = wp_get_attachment_image_src( $attachment->ID, 'thumbnail' ); // We only need the data if a live request. if ( ! $live_request ) { $output = '' . esc_attr( $image_data['alt'] ) . ''; fusion_library()->images->set_grid_image_meta( [ 'layout' => 'large', 'columns' => '1', ] ); $output = fusion_add_responsive_image_markup( $output ); $output = fusion_library()->images->apply_lazy_loading( $output, null, $attachment->ID, 'full' ); fusion_library()->images->set_grid_image_meta( [] ); if ( 'yes' === $this->args['lightbox'] ) { $output = '' . $output . ''; } $html_attachments .= '
  • ' . $output . '
  • '; $html_thumbnails .= '
  • '; $html_thumbnails .= fusion_library()->images->apply_lazy_loading( '' . esc_attr( $image_data['alt'] ) . '', null, $attachment->ID, 'thumbnail' ); $html_thumbnails .= '
  • '; } else { $return_data['datasets'][] = [ 'image' => $image_data['url'], 'alt' => $image_data['alt'], 'caption' => $image_data['caption_attribute'], 'title' => $image_data['title_attribute'], 'thumb' => $thumb[0], ]; } } } wp_reset_query(); if ( ! $live_request ) { return [ $html_attachments, $html_thumbnails ]; } return $return_data; } /** * Get the posts HTML. * * @access public * @since 1.0 * @param bool $with_excerpts Flag deciding if posts should be returned with excerpt. * @param bool $live_request Whether or not this is an ajax request. * @return string HTML. */ public function posts( $with_excerpts = false, $live_request = false ) { $html = ''; $return_data = []; $args = [ 'posts_per_page' => $this->args['limit'], 'meta_query' => [ [ 'key' => '_thumbnail_id', ], ], ]; if ( $this->args['post_id'] ) { $post_ids = explode( ',', $this->args['post_id'] ); $args['post__in'] = $post_ids; } $cat_ids = ''; if ( '' !== $this->args['category'] ) { $categories = explode( ',', $this->args['category'] ); if ( isset( $categories ) && $categories ) { foreach ( $categories as $category ) { $id_obj = get_category_by_slug( $category ); if ( $id_obj ) { // @codingStandardsIgnoreLine $cat_ids .= ( 0 === strpos( $category, '-' ) ) ? '-' . $id_obj->cat_ID . ',' : $id_obj->cat_ID . ','; } } } } $args['cat'] = substr( $cat_ids, 0, -1 ); // Ajax returns protected posts, but we just want published. if ( $live_request ) { $args['post_status'] = 'publish'; } $query = fusion_cached_query( $args ); if ( $query->have_posts() ) { while ( $query->have_posts() ) { $query->the_post(); $post_thumbnail_id = get_post_thumbnail_id(); $image = wp_get_attachment_url( $post_thumbnail_id ); $alt = get_post_meta( $post_thumbnail_id, '_wp_attachment_image_alt', true ); if ( ! $live_request ) { $image_output = '' . esc_attr( $alt ) . ''; fusion_library()->images->set_grid_image_meta( [ 'layout' => 'large', 'columns' => '1', ] ); $image_output = fusion_add_responsive_image_markup( $image_output ); $image_output = fusion_library()->images->apply_lazy_loading( $image_output, null, $post_thumbnail_id, 'full' ); fusion_library()->images->set_grid_image_meta( [] ); $link_output = '' . $image_output . ''; $title = '

    ' . get_the_title() . '

    '; $content = $title; if ( $with_excerpts ) { $excerpt = fusion_builder_get_post_content( '', 'yes', $this->args['excerpt'], true ); $content = '
    ' . $title . $excerpt . '
    '; } $container = '
    ' . $content . '
    '; $html .= '
  • ' . $link_output . $container . '
  • '; } else { $return_data['datasets'][] = [ 'image' => $image, 'title_attribute' => the_title_attribute( [ 'echo' => false ] ), 'title' => get_the_title(), 'alt' => $alt, 'permalink' => get_permalink(), 'excerpt' => ( $with_excerpts ) ? fusion_get_content_data( 'fusion_postslider', false ) : '', ]; } } } wp_reset_query(); if ( ! $live_request ) { return $html; } return $return_data; } /** * Builds the attributes array. * * @access public * @since 1.0 * @return array */ public function attr() { $attr = [ 'class' => 'fusion-post-slider fusion-flexslider fusion-flexslider-loading flexslider-' . $this->args['layout'], 'style' => '', ]; $attr = fusion_builder_visibility_atts( $this->args['hide_on_mobile'], $attr ); if ( 'yes' === $this->args['lightbox'] && 'attachments' === $this->args['layout'] ) { $attr['class'] .= ' flexslider-lightbox'; } $attr['style'] .= Fusion_Builder_Margin_Helper::get_margins_style( $this->args ); if ( $this->args['class'] ) { $attr['class'] .= ' ' . $this->args['class']; } if ( $this->args['id'] ) { $attr['id'] = $this->args['id']; } return $attr; } /** * Builds the slider-container attributes array. * * @access public * @since 1.0 * @return array */ public function slides_container_attr() { return [ 'class' => 'slides', ]; } /** * Builds the caption attributes array. * * @access public * @since 1.0 * @return array */ public function caption_attr() { return [ 'class' => 'flex-caption', ]; } /** * Builds the title-container attributes array. * * @access public * @since 1.0 * @return array */ public function title_container_attr() { return [ 'class' => 'slide-excerpt', ]; } /** * Builds the thumbnails attributes array. * * @access public * @since 1.0 * @return array */ public function thumbnails_attr() { $attr = [ 'class' => 'flexslider', ]; if ( 'attachments' === $this->args['layout'] ) { $attr['class'] .= ' fat'; } return $attr; } /** * Sets the necessary scripts. * * @access public * @since 3.2 * @return void */ public function on_first_render() { Fusion_Dynamic_JS::enqueue_script( 'fusion-flexslider' ); } } } new FusionSC_Flexslider(); } /** * Map shortcode to Avada Builder * * @since 1.0 */ function fusion_element_post_slider() { $builder_status = function_exists( 'is_fusion_editor' ) && is_fusion_editor(); $post_cat = $builder_status ? fusion_builder_shortcodes_categories( 'category', false, false, 26 ) : []; $cat_include = [ 'type' => 'multiple_select', 'heading' => esc_attr__( 'Categories', 'fusion-builder' ), 'placeholder' => esc_attr__( 'Categories', 'fusion-builder' ), 'description' => esc_attr__( 'Select categories of posts to display or leave blank for all.', 'fusion-builder' ), 'param_name' => 'category', 'value' => $post_cat, 'default' => '', 'dependency' => [ [ 'element' => 'layout', 'value' => 'attachments', 'operator' => '!=', ], ], 'callback' => [ 'function' => 'fusion_post_slider_query', 'ajax' => true, ], ]; if ( count( $post_cat ) > 25 ) { $cat_include['type'] = 'ajax_select'; $cat_include['ajax'] = 'fusion_search_query'; $cat_include['value'] = []; $cat_include['ajax_params'] = [ 'taxonomy' => 'category', 'use_slugs' => true, ]; } fusion_builder_map( fusion_builder_frontend_data( 'FusionSC_Flexslider', [ 'name' => esc_attr__( 'Post Slider', 'fusion-builder' ), 'shortcode' => 'fusion_postslider', 'icon' => 'fusiona-layers-alt', 'preview' => FUSION_BUILDER_PLUGIN_DIR . 'inc/templates/previews/fusion-post-slider-preview.php', 'preview_id' => 'fusion-builder-block-module-post-slider-preview-template', 'help_url' => 'https://avada.com/documentation/post-slider-element/', 'params' => [ [ 'type' => 'select', 'heading' => esc_attr__( 'Layout', 'fusion-builder' ), 'description' => esc_attr__( 'Choose a layout style for Post Slider.', 'fusion-builder' ), 'param_name' => 'layout', 'value' => [ 'posts' => esc_attr__( 'Posts with Title', 'fusion-builder' ), 'posts-with-excerpt' => esc_attr__( 'Posts with Title and Excerpt', 'fusion-builder' ), 'attachments' => esc_attr__( 'Attachment Layout, Only Images Attached to Post/Page', 'fusion-builder' ), ], 'default' => 'posts', 'callback' => [ 'function' => 'fusion_post_slider_query', 'ajax' => true, ], ], [ 'type' => 'uploadattachment', 'heading' => esc_attr__( 'Attach Images to Post/Page Gallery', 'fusion-builder' ), 'description' => esc_attr__( 'To add images to this post or page for attachments layout, navigate to "Upload Files" tab in media manager and upload new images.', 'fusion-builder' ), 'param_name' => 'upload_attachments', 'value' => '', 'remove_from_atts' => true, 'dependency' => [ [ 'element' => 'layout', 'value' => 'attachments', 'operator' => '==', ], ], 'callback' => [ 'function' => 'fusion_post_slider_query', 'ajax' => true, ], ], [ 'type' => 'textfield', 'heading' => esc_attr__( 'Excerpt Number of Words', 'fusion-builder' ), 'description' => esc_attr__( 'Insert the number of words you want to show in the excerpt.', 'fusion-builder' ), 'param_name' => 'excerpt', 'value' => '35', 'dependency' => [ [ 'element' => 'layout', 'value' => 'posts-with-excerpt', 'operator' => '==', ], ], ], $cat_include, [ 'type' => 'textfield', 'heading' => esc_attr__( 'Number of Slides', 'fusion-builder' ), 'description' => esc_attr__( 'Select the number of slides to display.', 'fusion-builder' ), 'param_name' => 'limit', 'value' => '3', 'callback' => [ 'function' => 'fusion_post_slider_query', 'ajax' => true, ], ], [ 'type' => 'radio_button_set', 'heading' => esc_attr__( 'Image Lightbox', 'fusion-builder' ), 'description' => esc_attr__( 'Only works on attachment layout. Lightbox must be enabled in Global Options or the image will open up by in the same tab by itself.', 'fusion-builder' ), 'param_name' => 'lightbox', 'value' => [ 'yes' => esc_attr__( 'Yes', 'fusion-builder' ), 'no' => esc_attr__( 'No', 'fusion-builder' ), ], 'default' => 'yes', 'dependency' => [ [ 'element' => 'layout', 'value' => 'attachments', 'operator' => '==', ], ], ], 'fusion_margin_placeholder' => [ 'param_name' => 'margin', 'group' => esc_attr__( 'General', 'fusion-builder' ), 'value' => [ 'margin_top' => '', 'margin_right' => '', 'margin_bottom' => '', 'margin_left' => '', ], ], [ 'type' => 'checkbox_button_set', 'heading' => esc_attr__( 'Element Visibility', 'fusion-builder' ), 'param_name' => 'hide_on_mobile', 'value' => fusion_builder_visibility_options( 'full' ), 'default' => fusion_builder_default_visibility( 'array' ), 'description' => esc_attr__( 'Choose to show or hide the element on small, medium or large screens. You can choose more than one at a time.', 'fusion-builder' ), ], [ 'type' => 'textfield', 'heading' => esc_attr__( 'CSS Class', 'fusion-builder' ), 'description' => esc_attr__( 'Add a class to the wrapping HTML element.', 'fusion-builder' ), 'param_name' => 'class', 'value' => '', ], [ 'type' => 'textfield', 'heading' => esc_attr__( 'CSS ID', 'fusion-builder' ), 'description' => esc_attr__( 'Add an ID to the wrapping HTML element.', 'fusion-builder' ), 'param_name' => 'id', 'value' => '', ], ], 'callback' => [ 'function' => 'fusion_post_slider_query', 'ajax' => true, ], ] ) ); } add_action( 'fusion_builder_before_init', 'fusion_element_post_slider' );