File: /var/www/html/triad-infosec/wp-content/plugins/fusion-builder/shortcodes/fusion-post-slider.php
<?php
/**
* Add an element to fusion-builder.
*
* @package fusion-builder
* @since 1.0
*/
if ( fusion_is_element_enabled( 'fusion_postslider' ) ) {
if ( ! class_exists( 'FusionSC_Flexslider' ) ) {
/**
* Shortcode class.
*
* @since 1.0
*/
class FusionSC_Flexslider extends Fusion_Element {
/**
* The flex counter.
*
* @access private
* @since 1.0
* @var int
*/
private $flex_counter = 1;
/**
* Constructor.
*
* @access public
* @since 1.0
*/
public function __construct() {
parent::__construct();
add_filter( 'fusion_attr_flexslider-shortcode', [ $this, 'attr' ] );
add_filter( 'fusion_attr_flexslider-shortcode-slides-container', [ $this, 'slides_container_attr' ] );
add_filter( 'fusion_attr_flexslider-shortcode-caption', [ $this, 'caption_attr' ] );
add_filter( 'fusion_attr_flexslider-shortcode-title-container', [ $this, 'title_container_attr' ] );
add_filter( 'fusion_attr_flexslider-shortcode-thumbnails', [ $this, 'thumbnails_attr' ] );
add_shortcode( 'fusion_flexslider', [ $this, 'render' ] );
add_shortcode( 'fusion_postslider', [ $this, 'render' ] );
// Ajax mechanism for query related part.
add_action( 'wp_ajax_get_fusion_post_slider', [ $this, 'query' ] );
}
/**
* Gets the default values.
*
* @static
* @access public
* @since 2.0.0
* @return array
*/
public static function get_element_defaults() {
return [
'margin_top' => '',
'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 = '<ul ' . FusionBuilder::attributes( 'flexslider-shortcode-slides-container' ) . '>' . $slider . '</ul>';
$html = '<div ' . FusionBuilder::attributes( 'flexslider-shortcode' ) . '>' . $slides_html . '</div>';
if ( 'attachments' === $this->args['layout'] ) {
$html .= '<div ' . FusionBuilder::attributes( 'flexslider-shortcode-thumbnails' ) . '></div>';
}
$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 = '<img class="wp-image-' . $attachment->ID . '" src="' . $image_data['url'] . '" alt="' . 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 = '<a href="' . $image_data['url'] . '" data-title="' . esc_attr( $image_data['title_attribute'] ) . '" title="' . esc_attr( $image_data['title_attribute'] ) . '" data-caption="' . esc_attr( $image_data['caption_attribute'] ) . '" data-rel="prettyPhoto[flex_' . $this->flex_counter . ']">' . $output . '</a>';
}
$html_attachments .= '<li data-thumb="' . $thumb[0] . '">' . $output . '</li>';
$html_thumbnails .= '<li>';
$html_thumbnails .= fusion_library()->images->apply_lazy_loading( '<img src="' . $thumb[0] . '" alt="' . esc_attr( $image_data['alt'] ) . '" />', null, $attachment->ID, 'thumbnail' );
$html_thumbnails .= '</li>';
} 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 = '<img class="wp-image-' . $post_thumbnail_id . '" src="' . $image . '" alt="' . 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 = '<a href="' . get_permalink() . '" aria-label="' . the_title_attribute( [ 'echo' => false ] ) . '">' . $image_output . '</a>';
$title = '<h2><a href="' . get_permalink() . '">' . get_the_title() . '</a></h2>';
$content = $title;
if ( $with_excerpts ) {
$excerpt = fusion_builder_get_post_content( '', 'yes', $this->args['excerpt'], true );
$content = '<div ' . FusionBuilder::attributes( 'excerpt-container' ) . '>' . $title . $excerpt . '</div>';
}
$container = '<div ' . FusionBuilder::attributes( 'flexslider-shortcode-title-container' ) . '>' . $content . '</div>';
$html .= '<li>' . $link_output . $container . '</li>';
} 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' );