File: /var/www/html/triad-infosec/wp-content/plugins/fusion-builder/shortcodes/fusion-post-cards.php
<?php
/**
* Add an element to fusion-builder.
*
* @package fusion-builder
* @since 3.3
*/
if ( fusion_is_element_enabled( 'fusion_post_cards' ) ) {
if ( ! class_exists( 'FusionSC_PostCards' ) ) {
/**
* Shortcode class.
*
* @since 3.3
*/
class FusionSC_PostCards extends Fusion_Element {
/**
* The one, true instance of this object.
*
* @static
* @access private
* @since 3.3
* @var object
*/
private static $instance;
/**
* The counter.
*
* @access private
* @since 3.3
* @var int
*/
private $element_counter = 1;
/**
* Shortcode name.
*
* @access public
* @since 3.3
* @var string
*/
public $shortcode_name;
/**
* Post types.
*
* @access public
* @since 3.3
* @var mixed
*/
public $post_types = null;
/**
* Supported taxonomies.
*
* @access public
* @since 3.3
* @var mixed
*/
public $taxonomies = null;
/**
* Map taxonomies to post types.
*
* @access public
* @since 3.3
* @var mixed
*/
public $taxonomy_map = [];
/**
* The term ID, in case post cards are used to display terms.
*
* @access public
* @since 3.5
* @var string
*/
public $term_id = '';
/**
* The post ID, in case post cards are used to display post.
*
* @access public
* @since 3.9
* @var string
*/
public $post_id = '';
/**
* Whether we are requesting from editor.
*
* @access protected
* @since 3.3
* @var array
*/
protected $live_request = false;
/**
* Query args.
*
* @var WP_Query
*/
public $query = null;
/**
* Constructor.
*
* @access public
* @since 1.0
*/
public function __construct() {
parent::__construct();
$this->shortcode_name = 'fusion_post_cards';
add_filter( 'fusion_attr_post-cards-shortcode', [ $this, 'attr' ] );
add_filter( 'fusion_attr_post-cards-shortcode-posts', [ $this, 'attr_posts' ] );
add_filter( 'fusion_attr_post-cards-shortcode-filter-link', [ $this, 'filter_link_attr' ] );
add_shortcode( $this->shortcode_name, [ $this, 'render' ] );
// Ajax mechanism for query related part.
add_action( 'wp_ajax_get_fusion_post_cards', [ $this, 'ajax_query' ] );
add_action( 'pre_get_posts', [ $this, 'alter_shop_loop' ], 20 );
}
/**
* Creates or returns an instance of this class.
*
* @static
* @access public
* @since 3.3
*/
public static function get_instance() {
// If an instance hasn't been created and set to $instance create an instance and set it to $instance.
if ( null === self::$instance ) {
self::$instance = new FusionSC_PostCards();
}
return self::$instance;
}
/**
* Gets the default values.
*
* @static
* @access public
* @since 3.3
* @return array
*/
public static function get_element_defaults() {
$fusion_settings = awb_get_fusion_settings();
return [
'animation_direction' => 'left',
'animation_offset' => $fusion_settings->get( 'animation_offset' ),
'animation_speed' => '',
'animation_type' => '',
'animation_delay' => 0,
'animation_color' => '',
'hide_on_mobile' => fusion_builder_default_visibility( 'string' ),
'class' => '',
'id' => '',
'fusion_font_family_filters_font' => '',
'fusion_font_variant_filters_font' => '',
'filters_font_size' => '',
'filters_text_transform' => 'none',
'filters_line_height' => '',
'filters_letter_spacing' => '',
'filters_color' => $fusion_settings->get( 'link_color' ),
'filters_height' => '',
'filters_border_top' => '1px',
'filters_border_right' => '0px',
'filters_border_bottom' => '1px',
'filters_border_left' => '0px',
'filters_border_color' => $fusion_settings->get( 'sep_color' ),
'filters_alignment' => 'flex-start',
'filters_alignment_medium' => '',
'filters_alignment_small' => '',
'filters_hover_color' => $fusion_settings->get( 'link_hover_color' ),
'filters_active_color' => $fusion_settings->get( 'primary_color' ),
'active_filter_border_size' => '',
'active_filter_border_color' => $fusion_settings->get( 'primary_color' ),
'columns' => '4',
'columns_medium' => '0',
'columns_small' => '0',
'column_spacing' => '40',
'row_spacing' => '40',
'layout' => 'grid',
'margin_bottom' => '',
'margin_left' => '',
'margin_right' => '',
'margin_top' => '',
'filters' => 'no',
'filter_price_type' => 'both',
'number_posts' => '0',
'offset' => '',
'order' => 'DESC',
'orderby' => 'date',
'orderby_custom_field_name' => '',
'orderby_custom_field_type' => 'CHAR',
'orderby_term' => 'name',
'upcoming_events_only' => 'yes',
'featured_events_only' => 'no',
'post_card' => '0',
'post_card_archives' => false,
'post_card_list_view' => '0',
'post_status' => '',
'post_type' => 'post',
'posts_by' => 'all',
'ignore_sticky_posts' => 'no',
'scrolling' => 'pagination',
'source' => 'posts',
'terms_by' => '',
'flex_align_items' => 'flex-start',
'out_of_stock' => 'include',
'show_hidden' => 'no',
'custom_field_name' => '',
'custom_field_comparison' => 'exists',
'custom_field_value' => '',
'acf_repeater_field' => '',
'acf_relationship_field' => '',
// Load More button.
'load_more_btn_color' => '',
'load_more_btn_bg_color' => '',
'load_more_btn_hover_color' => '',
'load_more_btn_hover_bg_color' => '',
// Carousel.
'scroll_items' => '',
'mouse_scroll' => 'no',
'autoplay' => 'no',
'loop' => 'yes',
'show_nav' => 'yes',
'prev_icon' => 'awb-icon-angle-left',
'next_icon' => 'awb-icon-angle-right',
'arrow_box_width' => '',
'arrow_box_height' => '',
'arrow_position_vertical' => '',
'arrow_position_horizontal' => '',
'arrow_size' => $fusion_settings->get( 'slider_arrow_size' ),
'arrow_border_radius_top_left' => '',
'arrow_border_radius_top_right' => '',
'arrow_border_radius_bottom_right' => '',
'arrow_border_radius_bottom_left' => '',
'arrow_bgcolor' => $fusion_settings->get( 'carousel_nav_color' ),
'arrow_color' => '#fff',
'arrow_hover_bgcolor' => $fusion_settings->get( 'carousel_hover_color' ),
'arrow_hover_color' => '#fff',
'arrow_border_hover_color' => '',
'dots_position' => 'bottom',
'dots_spacing' => '4',
'dots_margin_top' => '',
'dots_margin_bottom' => '',
'dots_align' => '',
'dots_size' => '8',
'dots_color' => $fusion_settings->get( 'carousel_hover_color' ),
'dots_active_size' => '8',
'dots_active_color' => $fusion_settings->get( 'carousel_nav_color' ),
'mouse_pointer' => 'default',
'cursor_color_mode' => 'auto',
'cursor_color' => '',
// Slider.
'slider_animation' => 'fade',
// Separator styles.
'separator_style_type' => 'none',
'separator_sep_color' => '',
'separator_width' => '',
'separator_alignment' => '',
'separator_border_size' => '',
'parent_term' => '',
];
}
/**
* Maps settings to param variables.
*
* @static
* @access public
* @since 3.9
* @return array
*/
public static function settings_to_params() {
return [
'slider_arrow_size' => 'arrow_size',
];
}
/**
* Used to set any other variables for use on front-end editor template.
*
* @static
* @access public
* @since 3.3
* @return array
*/
public static function get_element_extras() {
$fusion_settings = awb_get_fusion_settings();
$is_builder = ( function_exists( 'fusion_is_preview_frame' ) && fusion_is_preview_frame() ) || ( function_exists( 'fusion_is_builder_frame' ) && fusion_is_builder_frame() );
$extras = [
'load_more_text' => apply_filters( 'avada_load_more_item_name', esc_attr__( 'Load More Items', 'fusion-builder' ) ),
'pagination_global' => apply_filters( 'fusion_builder_blog_pagination', '' ),
'pagination_range_global' => apply_filters( 'fusion_pagination_size', $fusion_settings->get( 'pagination_range' ) ),
'pagination_start_end_range_global' => apply_filters( 'fusion_pagination_start_end_size', $fusion_settings->get( 'pagination_start_end_range' ) ),
'visibility_medium' => $fusion_settings->get( 'visibility_medium' ),
'visibility_small' => $fusion_settings->get( 'visibility_small' ),
];
if ( $is_builder ) {
$post_types = fusion_post_cards()->fetch_post_types();
if ( is_array( $post_types ) ) {
foreach ( $post_types as $post_type ) {
/* translators: %s: "Post type label". */
$extras[ 'load_more_text_' . $post_type->name ] = apply_filters( 'avada_load_more_' . $post_type->name . '_name', sprintf( esc_attr__( 'Load More %s', 'fusion-builder' ), $post_type->label ) );
}
}
}
return $extras;
}
/**
* Gets the query data.
*
* @static
* @access public
* @since 3.3
* @param array $defaults An array of defaults.
* @return void
*/
public function ajax_query( $defaults ) {
check_ajax_referer( 'fusion_load_nonce', 'fusion_load_nonce' );
add_filter( 'parse_query', [ $this, 'set_is_home_var' ] );
$this->query( $defaults );
removefilter( 'parse_query', [ $this, 'set_is_home_var' ] );
}
/**
* Changes the is_home variable of the WordPress query.
*
* @static
* @access public
* @since 3.11.12
* @param WP_QUERY $query The WordPress query.
* @return The altered query.
*/
public function set_is_home_var( $query ) {
// $this->is_admin was removed from the conditional.
if ( ! ( $query->is_singular || $query->is_archive || $query->is_search || $query->is_feed
|| ( wp_is_serving_rest_request() && $query->is_main_query() )
|| $query->is_trackback || $query->is_404 || $query->is_robots || $query->is_favicon ) ) {
$query->is_home = true;
}
return $query;
}
/**
* Gets the query data.
*
* @static
* @access public
* @since 3.3
* @param array $defaults The default args.
* @return array|Object
*/
public function query( $defaults ) {
// Return if there's a query override.
$query_override = apply_filters( 'fusion_post_cards_shortcode_query_override', null, $defaults );
if ( $query_override ) {
return $query_override;
}
// From Ajax Request.
if ( isset( $_POST['model'] ) && ! apply_filters( 'fusion_builder_live_request', false ) ) { // phpcs:ignore WordPress.Security.NonceVerification
$defaults = wp_unslash( $_POST['model']['params'] ); // phpcs:ignore WordPress.Security
$return_data = [];
$this->live_request = true;
add_filter( 'fusion_builder_live_request', '__return_true' );
}
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
if ( is_front_page() || is_home() ) {
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : ( ( get_query_var( 'page' ) ) ? get_query_var( 'page' ) : 1 );
}
$defaults['paged'] = $paged;
if ( 'terms' === $defaults['source'] ) {
$posts = $this->term_query( $defaults, $this->live_request );
} else {
$posts = $this->post_query( $defaults, $this->live_request );
}
if ( ! $this->live_request ) {
return $posts;
}
$this->args = $defaults;
// post_card_archives should be a boolean value.
$this->args['post_card_archives'] = filter_var( $this->args['post_card_archives'], FILTER_VALIDATE_BOOLEAN );
// Check for post card design choice.
if ( 0 === (int) $defaults['post_card'] ) {
$return_data['placeholder'] = $this->get_placeholder();
echo wp_json_encode( $return_data );
wp_die();
}
// Ensure ajax column CSS does not conflict.
$cid = isset( $_POST['cid'] ) ? sanitize_text_field( wp_unslash( $_POST['cid'] ) ) : $defaults['post_card']; // phpcs:ignore WordPress.Security.NonceVerification.Missing
FusionBuilder()->set_global_shortcode_parent( $cid );
if ( 'acf_repeater' === $defaults['source'] && class_exists( 'ACF' ) ) {
$is_builder = ( function_exists( 'fusion_is_preview_frame' ) && fusion_is_preview_frame() ) || ( function_exists( 'fusion_is_builder_frame' ) && fusion_is_builder_frame() );
// Prefixed options page fields.
if ( 'awb_acfop_' === substr( $defaults['acf_repeater_field'], 0, 10 ) ) {
$post_id = 'option';
if ( 1 === preg_match( '/awb_acfop_.+__/', $defaults['acf_repeater_field'], $check ) ) {
$post_id = trim( str_replace( 'awb_acfop_', '', $check[0] ), '__' );
}
$defaultsargs['acf_repeater_field'] = str_replace( 'awb_acfop_', '', $defaults['acf_repeater_field'] );
} else {
$target_post = ( $is_builder || isset( $_GET['awb-studio-content'] ) ) && function_exists( 'Fusion_Template_Builder' ) ? Fusion_Template_Builder()->get_dynamic_content_selection() : false; // phpcs:ignore WordPress.Security
$post_id = $target_post ? $target_post->ID : Fusion_Dynamic_Data_Callbacks::get_post_id();
}
$post_id = isset( $_POST['post_id'] ) ? $_POST['post_id'] : $post_id; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput, WordPress.Security.NonceVerification.Missing
ob_start();
if ( have_rows( $defaults['acf_repeater_field'], $post_id ) ) {
$count = 1;
while ( have_rows( $defaults['acf_repeater_field'], $post_id ) ) {
the_row();
$this->render_custom();
$count++;
if ( $defaults['number_posts'] && -1 !== (int) $defaults['number_posts'] && $count > $defaults['number_posts'] ) {
break;
}
}
}
$return_data['loop_product'] = ob_get_clean();
$return_data['args'] = $defaults;
$return_data['max_num_pages'] = 1;
$return_data['paged'] = 1;
echo wp_json_encode( $return_data );
wp_die();
}
// Either we have terms or posts depending on what we want.
$have_posts = ( 'terms' === $defaults['source'] && ! empty( $posts ) ) || ( in_array( $defaults['source'], [ 'posts', 'related', 'up_sells', 'cross_sells', 'featured_products', 'acf_relationship' ], true ) && $posts->have_posts() );
if ( ! $have_posts ) {
$return_data['placeholder'] = $this->get_placeholder( 'empty' );
echo wp_json_encode( $return_data );
wp_die();
}
$return_data['paged'] = $paged;
$return_data['max_num_pages'] = '';
if ( $have_posts ) {
if ( in_array( $this->args['source'], [ 'posts', 'related', 'up_sells', 'cross_sells', 'featured_products', 'acf_relationship' ], true ) ) {
ob_start();
while ( $posts->have_posts() ) {
$posts->the_post();
$this->post_id = get_the_ID();
$this->render_custom();
}
$return_data['loop_product'] = ob_get_clean();
$return_data['max_num_pages'] = $posts->max_num_pages;
} else {
ob_start();
foreach ( $posts as $term ) {
$GLOBALS['wp_query']->is_tax = true;
$GLOBALS['wp_query']->is_archive = true;
$GLOBALS['wp_query']->is_post_type_archive = false;
$GLOBALS['wp_query']->queried_object = $term;
$this->term_id = $term->term_taxonomy_id;
$this->render_custom();
}
$return_data['loop_product'] = ob_get_clean();
$this->term_id = '';
}
$return_data['filters'] = $this->post_cards_filters();
}
echo wp_json_encode( $return_data );
wp_die();
}
/**
* Get the terms.
*
* @static
* @access public
* @since 3.3
* @param array $defaults The default args.
* @param bool $live_request Whether this is a live editor request.
* @return array|Object
*/
public function term_query( $defaults, $live_request = false ) {
if ( '0' == $defaults['offset'] ) { // phpcs:ignore Universal.Operators.StrictComparisons
$defaults['offset'] = '';
}
$taxonomy = $defaults['terms_by'];
$args = [
'taxonomy' => $taxonomy,
'number' => max( (int) $defaults['number_posts'], 0 ),
'hide_empty' => false,
'orderby' => $defaults['orderby_term'],
'order' => $defaults['order'],
'parent_term' => $defaults['parent_term'],
];
if ( '' !== $defaults['offset'] ) {
$args['offset'] = $defaults['offset'];
}
// Filter by taxonomy.
foreach ( [ 'include', 'exclude' ] as $filter ) {
$option = $filter . '_term_' . $taxonomy;
$terms = isset( $defaults[ $option ] ) && ! empty( $defaults[ $option ] ) ? $defaults[ $option ] : false;
if ( $terms ) {
if ( false !== strpos( $terms, ',' ) ) {
$terms = explode( ',', $terms );
} elseif ( false !== strpos( $terms, '|' ) ) {
$terms = explode( '|', $terms );
}
$args[ $filter ] = $terms;
}
}
$args['post_cards_query'] = true;
$args = apply_filters( 'fusion_post_cards_shortcode_query_args', $args );
return get_terms( $args );
}
/**
* Get the Advanced custom field repeater data.
*
* @static
* @access public
* @since 3.3
* @param array $args The default args.
* @return array|Object
*/
public function render_acf_repeater( $args ) {
if ( ! class_exists( 'ACF' ) ) {
return;
}
$is_builder = ( function_exists( 'fusion_is_preview_frame' ) && fusion_is_preview_frame() ) || ( function_exists( 'fusion_is_builder_frame' ) && fusion_is_builder_frame() );
// Prefixed options page fields.
if ( 'awb_acfop_' === substr( $args['acf_repeater_field'], 0, 10 ) ) {
$post_id = 'option';
if ( 1 === preg_match( '/awb_acfop_.+__/', $args['acf_repeater_field'], $check ) ) {
$post_id = trim( str_replace( 'awb_acfop_', '', $check[0] ), '__' );
}
$args['acf_repeater_field'] = str_replace( 'awb_acfop_', '', $args['acf_repeater_field'] );
} else {
$target_post = ( $is_builder || isset( $_GET['awb-studio-content'] ) ) && function_exists( 'Fusion_Template_Builder' ) ? Fusion_Template_Builder()->get_dynamic_content_selection() : false; // phpcs:ignore WordPress.Security
$post_id = $target_post ? $target_post->ID : Fusion_Dynamic_Data_Callbacks::get_post_id();
}
$post_id = isset( $_POST['post_id'] ) ? $_POST['post_id'] : $post_id; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput, WordPress.Security.NonceVerification.Missing
$post_list = '';
if ( have_rows( $args['acf_repeater_field'], $post_id ) ) {
$wrapper_tag = in_array( $args['layout'], [ 'carousel', 'slider' ], true ) ? 'div' : 'ul';
$post_list .= sprintf( '<%s %s>', $wrapper_tag, FusionBuilder::attributes( 'post-cards-shortcode-posts' ) );
$count = 1;
ob_start();
while ( have_rows( $args['acf_repeater_field'], $post_id ) ) {
the_row();
$this->render_custom();
$count++;
if ( $args['number_posts'] && -1 !== (int) $args['number_posts'] && $count > (int) $args['number_posts'] ) {
break;
}
}
reset_rows();
$post_list .= ob_get_clean();
$post_list .= '</' . $wrapper_tag . '>';
if ( in_array( $this->args['layout'], [ 'carousel', 'slider' ], true ) ) {
if ( in_array( $this->args['show_nav'], [ 'dots', 'arrows_dots' ], true ) ) {
$post_list .= '<div class="swiper-pagination"></div>';
}
if ( in_array( $this->args['show_nav'], [ 'yes', 'arrows_dots' ], true ) ) {
$post_list .= awb_get_carousel_nav( fusion_font_awesome_name_handler( $this->args['prev_icon'] ), fusion_font_awesome_name_handler( $this->args['next_icon'] ) );
}
}
}
$this->on_render();
$html = '<div ' . FusionBuilder::attributes( 'post-cards-shortcode' ) . '>' . $post_list . '</div>';
do_action( 'fusion_post_cards_rendered', $this->element_counter );
return apply_filters( 'fusion_element_post_cards_content', $html, $args );
}
/**
* Get single posts.
*
* @access public
* @since 3.3
* @param array $defaults The default args.
* @param bool $live_request Whether this is a live editor request.
* @return array|Object
*/
public function post_query( $defaults, $live_request = false ) {
global $avada_woocommerce;
$fusion_settings = awb_get_fusion_settings();
$is_builder = ( function_exists( 'fusion_is_preview_frame' ) && fusion_is_preview_frame() ) || ( function_exists( 'fusion_is_builder_frame' ) && fusion_is_builder_frame() );
$target_post = ( $is_builder || isset( $_GET['awb-studio-content'] ) ) && function_exists( 'Fusion_Template_Builder' ) ? Fusion_Template_Builder()->get_target_example() : false; // phpcs:ignore WordPress.Security
$post_id = $target_post ? $target_post->ID : get_the_ID();
$post_id = isset( $_POST['post_id'] ) ? $_POST['post_id'] : $post_id; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput, WordPress.Security.NonceVerification.Missing
if ( '0' == $defaults['offset'] ) { // phpcs:ignore Universal.Operators.StrictComparisons
$defaults['offset'] = '';
}
$args = [
'post_type' => isset( $defaults['source'] ) && 'posts' === $defaults['source'] ? $defaults['post_type'] : get_post_type( $post_id ),
'posts_per_page' => (int) $defaults['number_posts'],
'paged' => $defaults['paged'],
];
$args['orderby'] = $defaults['orderby'];
$args['order'] = $defaults['order'];
if ( 'meta_value' === $defaults['orderby'] ) {
$args['meta_key'] = $defaults['orderby_custom_field_name']; //phpcs:ignore WordPress.DB.SlowDBQuery
$args['meta_type'] = $defaults['orderby_custom_field_type'];
} elseif ( 'post_views' === $defaults['orderby'] ) {
$args['orderby'] = 'meta_value_num';
$args['meta_key'] = 'avada_post_views_count';
}
if ( 'product' === $defaults['post_type'] ) {
$args['orderby'] = ( isset( $_GET['product_orderby'] ) ) ? sanitize_text_field( wp_unslash( $_GET['product_orderby'] ) ) : $defaults['orderby']; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
$args['order'] = ( isset( $_GET['product_order'] ) ) ? sanitize_text_field( wp_unslash( $_GET['product_order'] ) ) : $defaults['order']; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
if ( function_exists( 'WC' ) ) {
remove_filter( 'woocommerce_get_catalog_ordering_args', [ $avada_woocommerce, 'get_catalog_ordering_args' ], 20 );
$ordering_args = WC()->query->get_catalog_ordering_args( $args['orderby'], $args['order'] );
add_filter( 'woocommerce_get_catalog_ordering_args', [ $avada_woocommerce, 'get_catalog_ordering_args' ], 20 );
$args['orderby'] = $ordering_args['orderby'];
$args['order'] = $ordering_args['order'];
if ( $ordering_args['meta_key'] ) {
$args['meta_key'] = $ordering_args['meta_key']; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
}
if ( 'sale_price' === $defaults['filter_price_type'] ) {
$args['post__in'] = wc_get_product_ids_on_sale();
} elseif ( 'regular_price' === $defaults['filter_price_type'] ) {
$args['post__not_in'] = wc_get_product_ids_on_sale();
}
}
$args['posts_per_page'] = '0' === $defaults['number_posts'] ? $fusion_settings->get( 'woo_items' ) : (int) $defaults['number_posts'];
$args['posts_per_page'] = ( isset( $_GET['product_count'] ) ) ? (int) $_GET['product_count'] : $args['posts_per_page']; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
}
if ( '' !== $defaults['offset'] ) {
$args['offset'] = $defaults['offset'];
}
if ( 'yes' === $defaults['ignore_sticky_posts'] && 'posts' === $defaults['source'] ) {
$args['ignore_sticky_posts'] = true;
}
// Filter by taxonomy or meta.
if ( 'all' !== $defaults['posts_by'] ) {
// Filter by meta.
if ( 'posts' === $defaults['source'] && 'awb_custom_field' === $defaults['posts_by'] ) {
if ( ! empty( $defaults['custom_field_name'] ) ) {
$meta_query = [];
$meta_query['key'] = $defaults['custom_field_name'];
if ( 'exists' === $defaults['custom_field_comparison'] ) {
$meta_query['compare'] = 'EXISTS';
} elseif ( 'not_exists' === $defaults['custom_field_comparison'] ) {
$meta_query['compare'] = 'NOT EXISTS';
} else {
$meta_query['compare'] = 'like' === $defaults['custom_field_comparison'] ? 'LIKE' : '=';
$meta_query['value'] = $defaults['custom_field_value'];
}
$args['meta_query'] = [ $meta_query ]; // phpcs:ignore WordPress.DB.SlowDBQuery
}
} else { // Filter by taxonomy.
$post_type_taxonomies = get_object_taxonomies( $defaults['post_type'], 'objects' );
$taxonomy = $defaults['posts_by'];
// If taxonomy is used by post type, then lets filter for it.
if ( isset( $post_type_taxonomies[ $taxonomy ] ) ) {
foreach ( [ 'include', 'exclude' ] as $filter ) {
$option = $filter . '_' . $taxonomy;
$terms = isset( $defaults[ $option ] ) && ! empty( $defaults[ $option ] ) ? $defaults[ $option ] : false;
if ( $terms ) {
if ( false !== strpos( $terms, ',' ) ) {
$terms = explode( ',', $terms );
} elseif ( false !== strpos( $terms, '|' ) ) {
$terms = explode( '|', $terms );
}
$terms = is_array( $terms ) ? $terms : [ $terms ];
$tax_args = [
'taxonomy' => $taxonomy,
'field' => 'id',
'terms' => apply_filters( 'avada_element_term_selection', $terms, $defaults['post_type'], $taxonomy ),
];
if ( 'exclude' === $filter ) {
$tax_args['operator'] = 'NOT IN';
}
$args['tax_query'][] = $tax_args;
}
}
}
}
}
// Product visibility option.
if ( 'product' === $defaults['post_type'] && 'no' === $defaults['show_hidden'] && class_exists( 'WooCommerce' ) ) {
$args['tax_query']['relation'] = 'AND';
$args['tax_query'][] = [
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => [ 'exclude-from-catalog', 'exclude-from-search' ],
'operator' => 'NOT IN',
];
}
// Related items.
if ( 'related' === $defaults['source'] ) {
$terms = get_the_terms( $post_id, $defaults['terms_by'] );
$terms = empty( $terms ) ? [] : $terms;
$terms = wp_list_pluck( $terms, 'slug' );
unset( $args['meta_query'] );
$args['post__not_in'] = [ $post_id ];
$args['tax_query'] = []; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query
$args['tax_query'][] = [
'taxonomy' => $defaults['terms_by'],
'field' => 'slug',
'terms' => $terms,
];
}
// Cross sells && upsells.
if ( in_array( $defaults['source'], [ 'cross_sells', 'up_sells' ], true ) && class_exists( 'WooCommerce' ) ) {
$product = wc_get_product( $post_id );
$cart_sells = ( is_page() || is_cart() && is_object( WC()->cart ) ) ? WC()->cart->get_cross_sells() : [];
$sells = 'cross_sells' === $defaults['source'] && 0 < count( $cart_sells ) ? $cart_sells : [ -1 ];
if ( 'product' === get_post_type( $post_id ) && $product ) {
$sells = 'cross_sells' === $defaults['source'] ? $product->get_cross_sell_ids() : $product->get_upsell_ids();
$sells = 0 < count( $sells ) ? $sells : [ -1 ];
}
unset( $args['meta_query'] );
unset( $args['tax_query'] );
$args['post_type'] = 'product';
$args['post__not_in'] = [ $post_id ];
$args['post__in'] = $sells;
}
// Featured Products.
if ( 'featured_products' === $defaults['source'] && class_exists( 'WooCommerce' ) ) {
unset( $args['meta_query'] );
unset( $args['tax_query'] );
$args['post_type'] = 'product';
$args['tax_query'][] = [
'taxonomy' => 'product_visibility',
'field' => 'name',
'terms' => 'featured',
'operator' => 'IN',
];
}
// Product SKU query params.
if ( 'posts' === $defaults['source'] && 'product' === $defaults['post_type'] && 'product_skus' === $defaults['posts_by'] ) {
$args['post_type'] = 'product';
if ( ! empty( $defaults['include_product_skus'] ) ) {
$args['meta_query'][] = [
'key' => '_sku',
'value' => explode( '|', $defaults['include_product_skus'] ),
];
}
if ( ! empty( $defaults['exclude_product_skus'] ) ) {
$args['meta_query'][] = [
'key' => '_sku',
'value' => explode( '|', $defaults['exclude_product_skus'] ),
'compare' => 'NOT IN',
];
}
}
// If out of stock are set not to show, hide them.
if ( ( ( 'product' === $defaults['post_type'] && 'posts' === $defaults['source'] ) || ( 'terms' !== $defaults['source'] && 'acf_repeater' !== $defaults['source'] ) ) && 'exclude' === $defaults['out_of_stock'] ) {
$args['meta_query'][] = [
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => 'NOT IN',
];
}
if ( 'posts' === $defaults['source'] && 'tribe_events' === $defaults['post_type'] ) {
if ( 'yes' === $defaults['upcoming_events_only'] ) {
$args['ends_after'] = 'now';
}
if ( 'yes' === $defaults['featured_events_only'] ) {
$args['featured'] = true;
}
}
if ( '' !== $defaults['post_status'] ) {
$defaults['post_status'] = ( $live_request || is_preview() ) && ! current_user_can( 'edit_other_posts' ) ? 'publish' : explode( ',', $defaults['post_status'] );
} elseif ( $live_request ) {
// Ajax returns protected posts, but we just want published.
$args['post_status'] = 'publish';
}
$args['post_cards_query'] = true;
if ( 'acf_relationship' === $defaults['source'] && '' !== $defaults['acf_relationship_field'] && class_exists( 'ACF' ) ) {
$post_id = is_archive() ? get_queried_object() : $post_id;
$relationship_posts = get_field_object( $defaults['acf_relationship_field'], $post_id, false );
$args['post_type'] = isset( $relationship_posts['post_type'] ) ? $relationship_posts['post_type'] : '';
if ( ! empty( $relationship_posts['value'] ) ) {
$args['post__in'] = $relationship_posts['value'];
} else {
$args['post__in'] = [ 0 ];
}
}
if ( 'posts' === $defaults['source'] && 'tribe_events' === $defaults['post_type'] && function_exists( 'tribe_get_events' ) ) {
$query = tribe_get_events( apply_filters( 'fusion_post_cards_shortcode_query_args', $args ), true );
} else {
$query = fusion_cached_query( apply_filters( 'fusion_post_cards_shortcode_query_args', $args ) );
}
if ( 'product' === $defaults['post_type'] ) {
fusion_library()->woocommerce->remove_post_clauses( $args['orderby'], $args['order'] );
}
return $query;
}
/**
* Render the shortcode.
*
* @access public
* @since 3.3
* @param array $args Shortcode parameters.
* @param string $content Content between shortcode.
* @return string HTML output
*/
public function render( $args, $content = '' ) {
$fusion_settings = awb_get_fusion_settings();
$this->defaults = self::get_element_defaults();
$is_shop = class_exists( 'WooCommerce' ) && is_shop();
// We need dynamic defaults for post type.
if ( isset( $args['posts_by'] ) ) {
$this->defaults[ 'include_' . $args['posts_by'] ] = '';
$this->defaults[ 'exclude_' . $args['posts_by'] ] = '';
}
if ( isset( $args['terms_by'] ) ) {
$this->defaults[ 'include_term_' . $args['terms_by'] ] = '';
$this->defaults[ 'exclude_term_' . $args['terms_by'] ] = '';
}
$this->args = FusionBuilder::set_shortcode_defaults( $this->defaults, $args, 'fusion_post_cards' );
$this->validate_args();
$html = '';
if ( 0 === (int) $this->args['post_card'] ) {
$this->element_counter++;
return $this->get_placeholder();
}
if ( 'acf_repeater' === $this->args['source'] ) {
return $this->render_acf_repeater( $this->args );
}
$posts = $this->query( $this->args );
$this->query = $posts;
// Either we have terms or posts depending on what we want.
$have_posts = ( 'terms' === $this->args['source'] && ! is_wp_error( $posts ) && ! empty( $posts ) ) || ( in_array( $this->args['source'], [ 'posts', 'related', 'up_sells', 'cross_sells', 'featured_products', 'acf_relationship' ], true ) && $posts->have_posts() );
if ( ! $have_posts ) {
$this->element_counter++;
if ( ! fusion_is_preview_frame() && $content ) {
return apply_filters( 'fusion_shortcode_content', '<h2 class="fusion-nothing-found">' . $content . '</h2>', $this->shortcode_name, $args );
} else {
return $this->get_placeholder( 'empty' );
}
}
$post_list = '';
if ( $have_posts ) {
// Backup global data.
$original_post = $GLOBALS['post'];
$original_query = $GLOBALS['wp_query'];
$original_queried_object = $GLOBALS['wp_query']->queried_object;
$original_is_tax = $GLOBALS['wp_query']->is_tax;
$original_is_archive = $GLOBALS['wp_query']->is_archive;
$original_is_category = $GLOBALS['wp_query']->is_category;
$original_is_tag = $GLOBALS['wp_query']->is_tag;
$original_is_singular = $GLOBALS['wp_query']->is_singular;
$original_post_type_archive = $GLOBALS['wp_query']->is_post_type_archive;
$original_is_search = $GLOBALS['wp_query']->is_search;
$original_is_404 = $GLOBALS['wp_query']->is_404;
$original_is_author = $GLOBALS['wp_query']->is_author;
$original_is_date = $GLOBALS['wp_query']->is_date;
$original_is_day = $GLOBALS['wp_query']->is_day;
$original_is_month = $GLOBALS['wp_query']->is_month;
$wrapper_tag = in_array( $this->args['layout'], [ 'carousel', 'slider' ], true ) ? 'div' : 'ul';
$post_list .= sprintf( '<%s %s>', $wrapper_tag, FusionBuilder::attributes( 'post-cards-shortcode-posts' ) );
if ( 'terms' !== $this->args['source'] ) {
$GLOBALS['wp_query']->is_tax = false;
$GLOBALS['wp_query']->is_archive = false;
$GLOBALS['wp_query']->is_category = false;
$GLOBALS['wp_query']->is_tag = false;
$GLOBALS['wp_query']->is_singular = true;
$GLOBALS['wp_query']->is_post_type_archive = false;
$GLOBALS['wp_query']->is_search = false;
$GLOBALS['wp_query']->is_404 = false;
$GLOBALS['wp_query']->is_author = false;
$GLOBALS['wp_query']->is_date = false;
$GLOBALS['wp_query']->is_day = false;
$GLOBALS['wp_query']->is_month = false;
if ( function_exists( 'Avada_Studio' ) ) {
$studio = Avada_Studio();
remove_filter( 'the_content', [ $studio, 'wrap_content' ], -10 );
}
if ( $is_shop && class_exists( 'Tribe__Events__Main' ) ) {
remove_action( 'the_post', [ tribe( Tribe\Events\Views\V2\Hooks::class ), 'manage_sensitive_info' ] );
}
ob_start();
while ( $posts->have_posts() ) {
$posts->the_post();
$GLOBALS['post'] = get_post( get_the_ID() ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
setup_postdata( $GLOBALS['post'] );
$GLOBALS['wp_query']->queried_object = $GLOBALS['post'];
$this->post_id = get_the_ID();
$this->render_custom();
}
$post_list .= ob_get_clean();
if ( $is_shop && class_exists( 'Tribe__Events__Main' ) ) {
add_action( 'the_post', [ tribe( Tribe\Events\Views\V2\Hooks::class ), 'manage_sensitive_info' ] );
}
if ( function_exists( 'Avada_Studio' ) ) {
add_filter( 'the_content', [ $studio, 'wrap_content' ], -10 );
}
} else {
$GLOBALS['wp_query']->is_tax = true;
$GLOBALS['wp_query']->is_archive = true;
$GLOBALS['wp_query']->is_post_type_archive = false;
$GLOBALS['wp_query']->is_search = false;
ob_start();
foreach ( $posts as $term ) {
$GLOBALS['wp_query']->queried_object = $term;
$this->term_id = $term->term_taxonomy_id;
$this->render_custom();
}
$post_list .= ob_get_clean();
$this->term_id = '';
}
// Restore global data.
$GLOBALS['post'] = $original_post; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$GLOBALS['wp_query'] = $original_query; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$GLOBALS['wp_query']->is_tax = $original_is_tax; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$GLOBALS['wp_query']->is_archive = $original_is_archive; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$GLOBALS['wp_query']->is_category = $original_is_category; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$GLOBALS['wp_query']->is_tag = $original_is_tag; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$GLOBALS['wp_query']->is_singular = $original_is_singular; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$GLOBALS['wp_query']->queried_object = $original_queried_object; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$GLOBALS['wp_query']->is_post_type_archive = $original_post_type_archive; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$GLOBALS['wp_query']->is_search = $original_is_search; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$GLOBALS['wp_query']->is_404 = $original_is_404; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$GLOBALS['wp_query']->is_author = $original_is_author; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$GLOBALS['wp_query']->is_date = $original_is_date; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$GLOBALS['wp_query']->is_day = $original_is_day; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$GLOBALS['wp_query']->is_month = $original_is_month; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
$post_list .= '</' . $wrapper_tag . '>';
}
if ( in_array( $this->args['layout'], [ 'carousel', 'slider' ], true ) ) {
if ( in_array( $this->args['show_nav'], [ 'dots', 'arrows_dots' ], true ) ) {
$post_list .= '<div class="swiper-pagination"></div>';
}
if ( in_array( $this->args['show_nav'], [ 'yes', 'arrows_dots' ], true ) ) {
$post_list .= awb_get_carousel_nav( fusion_font_awesome_name_handler( $this->args['prev_icon'] ), fusion_font_awesome_name_handler( $this->args['next_icon'] ) );
}
}
if ( 'no' !== $this->args['scrolling'] && 'terms' !== $this->args['source'] && ( 'grid' === $this->args['layout'] || 'masonry' === $this->args['layout'] ) ) {
$post_list .= $this->pagination( $this->query->max_num_pages, $fusion_settings->get( 'pagination_range' ), $this->query );
}
wp_reset_query(); // phpcs:ignore WordPress.WP.DiscouragedFunctions.wp_reset_query_wp_reset_query
wp_reset_postdata();
$html = '<div ' . FusionBuilder::attributes( 'post-cards-shortcode' ) . '>';
$html .= $this->post_cards_filters();
$html .= $post_list;
// If infinite scroll with "load more" button is used.
if ( 'load_more_button' === $this->args['scrolling'] && 1 < $posts->max_num_pages && 'terms' !== $this->args['source'] && ( 'grid' === $this->args['layout'] || 'masonry' === $this->args['layout'] ) ) {
$post_type_obj = get_post_type_object( $this->args['post_type'] );
$html .= '<button class="fusion-load-more-button fusion-product-button fusion-clearfix">';
/* translators: The name. */
$html .= apply_filters( 'avada_load_more_' . strtolower( $post_type_obj->labels->name ) . '_name', sprintf( esc_attr__( 'Load More %s', 'fusion-builder' ), $post_type_obj->labels->name ) );
$html .= '</button>';
}
$html .= '</div>';
$this->element_counter++;
$this->on_render();
do_action( 'fusion_post_cards_rendered', $this->element_counter );
return apply_filters( 'fusion_element_post_cards_content', $html, $args );
}
/**
* Change args to valid values based on other options.
*
* @access public
* @since 3.3
* @return void
*/
public function validate_args() {
$this->args['parent_post_id'] = get_the_ID();
// Force layout for list view.
if ( 'product' === $this->args['post_type'] && 'posts' === $this->args['source'] && 'list' === $this->get_product_view() ) {
$this->args['layout'] = 'grid';
$this->args['columns'] = 1;
}
if ( 0 === (int) $this->args['columns'] ) {
$this->args['columns'] = 4;
}
if ( 1 === (int) $this->args['columns'] && ( 'grid' === $this->args['layout'] || 'masonry' === $this->args['layout'] ) ) {
$this->args['column_spacing'] = '0';
}
// No delay offering for carousels and sliders.
if ( 'grid' !== $this->args['layout'] ) {
$this->args['animation_delay'] = 0;
}
}
/**
* Render filters.
*
* @access public
* @since 3.8
* @return string
*/
public function post_cards_filters() {
// Setup the filters, if enabled.
$filter_wrapper = $filter = '';
if ( 'no' !== $this->args['filters'] && ( 'grid' === $this->args['layout'] || 'masonry' === $this->args['layout'] ) && 'posts' === $this->args['source'] ) {
$post_type_taxonomies = get_object_taxonomies( $this->args['post_type'], 'objects' );
$taxonomy = $this->args['posts_by'];
$taxonomy = isset( $post_type_taxonomies[ $taxonomy ] ) ? $taxonomy : array_key_first( $post_type_taxonomies );
$included = ! empty( $this->args[ 'include_' . $taxonomy ] ) ? explode( ',', $this->args[ 'include_' . $taxonomy ] ) : [];
$excluded = ! empty( $this->args[ 'exclude_' . $taxonomy ] ) ? explode( ',', $this->args[ 'exclude_' . $taxonomy ] ) : [];
$first_filter = true;
// Get terms.
$terms = get_terms( $taxonomy );
$terms = is_array( $terms ) && 0 < count( $terms ) ? $terms : [];
if ( 'yes-without-all' !== $this->args['filters'] ) {
$filter = '<li role="presentation" ' . FusionBuilder::attributes( 'fusion-filter fusion-filter-all fusion-active' ) . '><a ' . FusionBuilder::attributes(
'post-cards-shortcode-filter-link',
[
'data-filter' => '*',
]
) . '>' . apply_filters( 'awb_post_cards_all_filter_name', esc_html__( 'All', 'fusion-builder' ) ) . '</a></li>';
$first_filter = false;
}
foreach ( $terms as $term ) {
// Only display filters of non excluded terms.
if ( ! in_array( $term->term_id, $excluded ) ) { // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
// Check if terms have been chosen.
if ( ! empty( $included ) ) {
// Only display filters for explicitly included terms.
if ( in_array( urldecode( $term->term_id ), $included, true ) ) {
// Set the first terms filter to active, if the all filter isn't shown.
$active_class = '';
if ( $first_filter ) {
$active_class = ' fusion-active';
$first_filter = false;
}
$filter .= '<li role="presentation" ' . FusionBuilder::attributes( 'fusion-filter fusion-hidden' . $active_class ) . '><a ' . FusionBuilder::attributes(
'post-cards-shortcode-filter-link',
[
'data-filter' => '.' . urldecode( $term->slug ),
]
) . '>' . $term->name . '</a></li>';
}
} else {
// Display all terms.
// Set the first term filter to active, if the all filter isn't shown.
$active_class = '';
if ( $first_filter ) {
$active_class = ' fusion-active';
$first_filter = false;
}
$filter .= '<li role="presentation" ' . FusionBuilder::attributes( 'fusion-filter fusion-hidden' . $active_class ) . '><a ' . FusionBuilder::attributes(
'post-cards-shortcode-filter-link',
[
'data-filter' => '.' . urldecode( $term->slug ),
]
) . '>' . $term->name . '</a></li>';
}
}
}
$filter_wrapper = '<div>';
$filter_wrapper .= '<ul ' . FusionBuilder::attributes( 'fusion-filters' ) . ' role="menu" aria-label="' . esc_attr__( 'Post Filters', 'fusion-core' ) . '">' . $filter . '</ul>';
$filter_wrapper .= '</div>';
}
return $filter_wrapper;
}
/**
* Render custom layout style.
*
* @access public
* @since 3.3
* @return void
*/
public function render_custom() {
$post_card = $this->get_post_card_design();
if ( $post_card ) {
$separator = $this->live_request || function_exists( 'fusion_separator' ) && 'none' !== $this->args['separator_style_type'] && 'grid' === $this->args['layout'] && 1 === (int) $this->args['columns'];
FusionBuilder()->post_card_data = [
'is_rendering' => true,
'is_post_card_archives' => $this->args['post_card_archives'],
'columns' => $this->args['columns'],
'column_spacing' => $this->args['column_spacing'],
];
add_filter( 'fusion_dynamic_post_id', [ $this, 'nested_post_id' ], 10 );
add_filter( 'fusion_attr_fusion-column', [ $this, 'column_attributes' ], 20 );
add_filter( 'fusion_attr_fusion-column-wrapper', [ $this, 'column_wrapper_attributes' ], 20 );
add_filter( 'fusion_column_tag', [ $this, 'column_tag' ], 20, 2 );
if ( $separator ) {
add_filter( 'fusion_column_before_close', [ $this, 'maybe_render_separator' ], 20, 2 );
}
Fusion_Template_Builder()->render_content( $post_card, ! apply_filters( 'awb_capturing_active', false ) );
remove_filter( 'fusion_dynamic_post_id', [ $this, 'nested_post_id' ], 10 );
remove_filter( 'fusion_attr_fusion-column', [ $this, 'column_attributes' ], 20 );
remove_filter( 'fusion_attr_fusion-column-wrapper', [ $this, 'column_wrapper_attributes' ], 20 );
remove_filter( 'fusion_column_tag', [ $this, 'column_tag' ], 20 );
if ( $separator ) {
remove_filter( 'fusion_column_before_close', [ $this, 'maybe_render_separator' ], 20 );
}
FusionBuilder()->post_card_data = [
'is_rendering' => false,
'is_post_card_archives' => false,
'columns' => 1,
'column_spacing' => 0,
];
do_action( 'fusion_post_card_rendered' );
}
}
/**
* Render separator.
*
* @since 3.3
* @param string $output The output.
* @param string $column_type The column type.
* @return string
*/
public function maybe_render_separator( $output, $column_type ) {
if ( 'fusion_builder_column' !== $column_type ) {
return $output;
}
$separator_args = [
'style_type' => $this->args['separator_style_type'],
'sep_color' => $this->args['separator_sep_color'],
'width' => $this->args['separator_width'],
'alignment' => $this->args['separator_alignment'],
'border_size' => $this->args['separator_border_size'],
'position' => 'absolute',
];
$output .= fusion_separator()->render( $separator_args );
return $output;
}
/**
* Return nested post ID for dynamic data.
*
* @access public
* @since 3.3
* @param int $post_id Post ID for dynamic data.
* @return int
*/
public function nested_post_id( $post_id ) {
$post_id = $this->post_id ? $this->post_id : get_the_ID();
return $this->term_id ? $this->term_id . '-archive' : $post_id;
}
/**
* Get product view layout.
*
* @access public
* @since 3.3
* @return string
*/
public function get_product_view() {
$product_view = 'grid';
if ( function_exists( 'Avada' ) && isset( $_SERVER['QUERY_STRING'] ) ) {
parse_str( sanitize_text_field( wp_unslash( $_SERVER['QUERY_STRING'] ) ), $params );
$product_view = ( isset( $params['product_view'] ) ) ? $params['product_view'] : Avada()->settings->get( 'woocommerce_product_view' );
}
return $product_view;
}
/**
* Get post card design.
*
* @access public
* @since 3.3
* @return object
*/
public function get_post_card_design() {
$post_card = get_post( (int) $this->args['post_card'] );
if ( 'product' === $this->args['post_type'] && 'posts' === $this->args['source'] && 0 !== (int) $this->args['post_card_list_view'] ) {
if ( 'list' === $this->get_product_view() ) {
$post_card = get_post( (int) $this->args['post_card_list_view'] );
}
}
return $post_card;
}
/**
* Column attributes within custom grid.
*
* @access public
* @since 3.3
* @param array $attr Column attributes.
* @return array
*/
public function column_attributes( $attr ) {
// Column within content element within post card.
if ( ! FusionBuilder()->post_card_data['is_rendering'] ) {
return $attr;
}
// No need this class for carousel & slider.
if ( 'grid' !== $this->args['layout'] && 'masonry' !== $this->args['layout'] ) {
$attr['class'] = preg_replace( '/fusion-layout-column\s/', '', $attr['class'] );
}
$attr['class'] .= ' post-card';
if ( 'grid' === $this->args['layout'] || 'masonry' === $this->args['layout'] ) {
$attr['class'] .= ' fusion-grid-column fusion-post-cards-grid-column';
$attr['class'] .= 'masonry' === $this->args['layout'] ? ' fusion-post-card-masonry' : '';
if ( 'product' === $this->args['post_type'] && 'posts' === $this->args['source'] ) {
$product_view = $this->get_product_view();
$attr['class'] .= ' product-' . $product_view . '-view';
}
// Data for filters.
if ( 'no' !== $this->args['filters'] && 'posts' === $this->args['source'] ) {
$post_type_taxonomies = get_object_taxonomies( $this->args['post_type'], 'objects' );
$taxonomy = $this->args['posts_by'];
$taxonomy = isset( $post_type_taxonomies[ $taxonomy ] ) ? $taxonomy : array_key_first( $post_type_taxonomies );
$terms = get_the_terms( get_the_ID(), $taxonomy );
if ( $terms ) {
foreach ( $terms as $terms ) {
$attr['class'] .= ' ' . urldecode( $terms->slug );
}
}
}
} elseif ( in_array( $this->args['layout'], [ 'carousel', 'slider' ], true ) ) {
$attr['class'] .= ' swiper-slide';
}
$relationship_has_products = false;
if ( 'acf_relationship' === $this->args['source'] && '' !== $this->args['acf_relationship_field'] && class_exists( 'ACF' ) ) {
$relationship_posts = get_field_object( $this->args['acf_relationship_field'], $this->args['parent_post_id'], false );
$relationship_post_types = isset( $relationship_posts['post_type'] ) ? $relationship_posts['post_type'] : [];
$relationship_has_products = in_array( 'product', $relationship_post_types, true ) && 'product' === get_post_type();
}
$woocommerce_sources = [ 'up_sells', 'cross_sells', 'featured_products' ];
if ( ( 'product' === $this->args['post_type'] && 'posts' === $this->args['source'] ) || in_array( $this->args['source'], $woocommerce_sources, true ) || ( 'related' === $this->args['source'] && ( 0 === strpos( $this->args['terms_by'], 'pa_' ) || 0 === strpos( $this->args['terms_by'], 'product_' ) ) ) || $relationship_has_products ) {
$attr['class'] .= ' product';
$attr['class'] .= ' type-product';
}
// Delayed animated, inherit animation from parent.
if ( 'grid' === $this->args['layout'] ) {
if ( $this->args['animation_type'] && ! empty( $this->args['animation_delay'] ) ) {
$attr['class'] .= ' fusion-animated';
// Animation, no delay, set full to column.
} elseif ( $this->args['animation_type'] ) {
$attr = Fusion_Builder_Animation_Helper::add_animation_attributes( $this->args, $attr );
}
}
if ( is_sticky() ) {
$attr['class'] .= ' fusion-sticky';
}
return $attr;
}
/**
* Column attributes within custom grid.
*
* @access public
* @since 3.3
* @param array $attr Column attributes.
* @return array
*/
public function column_wrapper_attributes( $attr ) {
if ( 'carousel' === $this->args['layout'] ) {
$attr['class'] .= ' fusion-carousel-item-wrapper';
}
return $attr;
}
/**
* Column main tag.
*
* @access public
* @since 3.3
* @param string $tag Column HTML tag.
* @param array $args Column attributes.
* @return string
*/
public function column_tag( $tag = 'div', $args = [] ) {
// We remove straight after using.
remove_filter( 'fusion_column_tag', [ $this, 'column_tag' ], 20 );
return in_array( $this->args['layout'], [ 'carousel', 'slider' ], true ) ? 'div' : 'li';
}
/**
* Builds the attributes array.
*
* @access public
* @since 3.3
* @return array
*/
public function attr() {
$attr = fusion_builder_visibility_atts(
$this->args['hide_on_mobile'],
[
'class' => 'fusion-post-cards fusion-post-cards-' . $this->element_counter,
'style' => $this->get_inline_style(),
]
);
if ( $this->args['animation_type'] ) {
// Grid and has delay, set parent args here, otherwise it will be on children.
if ( 'grid' === $this->args['layout'] ) {
if ( ! empty( $this->args['animation_delay'] ) ) {
// Post cards has another animation delay implemented, not on whole element, but between each post cards.
$animation_args = $this->args;
$animation_args['animation_delay'] = '';
$attr = Fusion_Builder_Animation_Helper::add_animation_attributes( $animation_args, $attr, true );
$attr['data-animation-delay'] = $this->args['animation_delay'];
$attr['class'] .= ' fusion-delayed-animation';
}
} else {
// Not grid always no delay, add to parent.
$attr = Fusion_Builder_Animation_Helper::add_animation_attributes( $this->args, $attr );
}
}
if ( in_array( $this->args['layout'], [ 'slider', 'carousel' ], true ) ) {
$attr['class'] .= ' awb-carousel awb-swiper awb-swiper-' . $this->args['layout'] . ' awb-swiper-dots-position-' . $this->args['dots_position'];
$attr['data-autoplay'] = $this->args['autoplay'];
$attr['data-loop'] = $this->args['loop'];
$attr['data-columns'] = $this->args['columns'];
$attr['data-columnsmedium'] = $this->args['columns_medium'];
$attr['data-columnssmall'] = $this->args['columns_small'];
$attr['data-itemmargin'] = $this->args['column_spacing'];
$attr['data-itemwidth'] = 180;
$attr['data-touchscroll'] = $this->args['mouse_scroll'];
$attr['data-imagesize'] = 'auto';
$attr['data-scrollitems'] = $this->args['scroll_items'];
$attr['data-mousepointer'] = $this->args['mouse_pointer'];
$attr['data-layout'] = $this->args['layout'];
if ( 'slider' === $this->args['layout'] ) {
$attr['data-slide-effect'] = $this->args['slider_animation'];
}
if ( 'custom' === $this->args['mouse_pointer'] ) {
$attr['data-cursor-color-mode'] = $this->args['cursor_color_mode'];
if ( 'custom' === $this->args['cursor_color_mode'] ) {
$attr['data-cursor-color'] = $this->args['cursor_color'];
}
}
} elseif ( ( 'grid' === $this->args['layout'] || 'masonry' === $this->args['layout'] ) && 'terms' !== $this->args['source'] ) {
$attr['class'] .= ' fusion-grid-archive';
$attr['class'] .= 'masonry' === $this->args['layout'] ? ' fusion-post-cards-masonry' : '';
}
if ( 'grid' === $this->args['layout'] ) {
$attr['class'] .= ' fusion-grid-columns-' . $this->args['columns'];
}
if ( 'grid' === $this->args['layout'] && 1 == $this->args['columns'] && 'no' === $this->args['scrolling'] ) { // phpcs:ignore Universal.Operators.StrictComparisons
$attr['class'] .= ' fusion-grid-flex-grow';
}
if ( $this->args['class'] ) {
$attr['class'] .= ' ' . $this->args['class'];
}
if ( $this->args['id'] ) {
$attr['id'] = $this->args['id'];
}
return $attr;
}
/**
* Render the blog pagination.
*
* @access public
* @since 3.3
* @param int $max_pages Max number of pages.
* @param int $range How many page numbers to display to either side of the current page.
* @param object $current_query The query.
*/
public function pagination( $max_pages = '', $range = 1, $current_query = '' ) {
global $wp_query;
$range = apply_filters( 'fusion_pagination_size', $range );
if ( '' === $max_pages ) {
if ( '' === $current_query ) {
$max_pages = $wp_query->max_num_pages;
$max_pages = ( ! $max_pages ) ? 1 : $max_pages;
} else {
$max_pages = $current_query->max_num_pages;
}
}
$max_pages = intval( $max_pages );
$blog_global_pagination = apply_filters( 'fusion_builder_blog_pagination', '' );
$infinite_pagination = 'pagination' !== $this->args['scrolling'] && 'pagination' !== strtolower( $blog_global_pagination );
$pagination_html = fusion_pagination( $max_pages, $range, $current_query, $infinite_pagination, true );
return apply_filters( 'fusion_post_cards_pagination_html', $pagination_html, $max_pages, $range, $current_query, $blog_global_pagination );
}
/**
* Builds the attributes array.
*
* @access public
* @since 3.3
* @return array
*/
public function attr_posts() {
$attr = [
'class' => '',
];
if ( 'grid' === $this->args['layout'] || 'masonry' === $this->args['layout'] ) {
$attr['class'] .= 'fusion-grid fusion-grid-' . $this->args['columns'] . ' fusion-flex-align-items-' . $this->args['flex_align_items'] . ' fusion-' . $this->args['layout'] . '-posts-cards';
} elseif ( in_array( $this->args['layout'], [ 'carousel', 'slider' ], true ) ) {
$attr['class'] .= 'swiper-wrapper';
if ( 'carousel' === $this->args['layout'] ) {
$attr['class'] .= ' fusion-flex-align-items-' . $this->args['flex_align_items'];
}
}
if ( $this->is_load_more() ) {
$attr['class'] .= ' fusion-grid-container-infinite';
$attr['data-pages'] = $this->query->max_num_pages;
}
if ( 'load_more_button' === $this->args['scrolling'] ) {
$attr['class'] .= ' fusion-grid-container-load-more';
}
return $attr;
}
/**
* Builds the filter-link attributes array.
*
* @access public
* @since 3.8
* @param array $args The arguments array.
* @return array
*/
public function filter_link_attr( $args ) {
$attr = [
'href' => '#',
];
if ( $args['data-filter'] ) {
$attr['data-filter'] = $args['data-filter'];
}
$attr['role'] = 'menuitem';
return $attr;
}
/**
* Sets the necessary scripts.
*
* @access public
* @since 3.3
* @return void
*/
public function on_first_render() {
// Skip if empty.
if ( true !== apply_filters( 'avada_force_enqueue', false ) && null === $this->args ) {
return;
}
// $this->args will be null on Avada Studio site, it precomiles CSS for all elements.
if ( $this->args ) {
$post_type_obj = get_post_type_object( $this->args['post_type'] );
if ( is_null( $post_type_obj ) ) {
return;
}
Fusion_Dynamic_JS::enqueue_script( 'awb-carousel' );
if ( 'product' === $post_type_obj->name ) {
if ( class_exists( 'Avada' ) && class_exists( 'WooCommerce' ) ) {
global $avada_woocommerce;
$js_folder_suffix = FUSION_BUILDER_DEV_MODE ? '/assets/js' : '/assets/min/js';
$js_folder_url = Avada::$template_dir_url . $js_folder_suffix;
$js_folder_path = Avada::$template_dir_path . $js_folder_suffix;
$version = Avada::get_theme_version();
Fusion_Dynamic_JS::enqueue_script(
'avada-woo-products',
$js_folder_url . '/general/avada-woo-products.js',
$js_folder_path . '/general/avada-woo-products.js',
[ 'jquery', 'fusion-flexslider' ],
$version,
true
);
Fusion_Dynamic_JS::localize_script(
'avada-woo-products',
'avadaWooCommerceVars',
$avada_woocommerce::get_avada_wc_vars()
);
}
}
Fusion_Dynamic_JS::enqueue_script(
'fusion-js-' . $this->shortcode_name,
FusionBuilder::$js_folder_url . '/general/fusion-post-cards.js',
FusionBuilder::$js_folder_path . '/general/fusion-post-cards.js',
[ 'jquery', 'isotope', 'packery', 'jquery-infinite-scroll', 'images-loaded' ],
FUSION_BUILDER_VERSION,
true
);
$label = $post_type_obj ? strtolower( $post_type_obj->labels->name ) : esc_html__( 'posts', 'fusion-builder' );
Fusion_Dynamic_JS::localize_script(
'fusion-js-' . $this->shortcode_name,
'fusionPostCardsVars',
[
/* translators: The name. */
'infinite_text' => '<em>' . sprintf( __( 'Loading the next set of %s...', 'fusion-builder' ), $label ) . '</em>',
'infinite_finished_msg' => '<em>' . __( 'All items displayed.', 'fusion-builder' ) . '</em>',
'lightbox_behavior' => fusion_library()->get_option( 'lightbox_behavior' ) ? fusion_library()->get_option( 'lightbox_behavior' ) : false,
'pagination_type' => $this->args['scrolling'],
]
);
} else {
// Just load everything on Avada Studio site.
Fusion_Dynamic_JS::enqueue_script( 'awb-carousel' );
// Add Woo scripts just in case.
if ( class_exists( 'Avada' ) && class_exists( 'WooCommerce' ) ) {
global $avada_woocommerce;
$js_folder_suffix = FUSION_BUILDER_DEV_MODE ? '/assets/js' : '/assets/min/js';
$js_folder_url = Avada::$template_dir_url . $js_folder_suffix;
$js_folder_path = Avada::$template_dir_path . $js_folder_suffix;
$version = Avada::get_theme_version();
Fusion_Dynamic_JS::enqueue_script(
'avada-woo-products',
$js_folder_url . '/general/avada-woo-products.js',
$js_folder_path . '/general/avada-woo-products.js',
[ 'jquery', 'fusion-flexslider' ],
$version,
true
);
Fusion_Dynamic_JS::localize_script(
'avada-woo-products',
'avadaWooCommerceVars',
$avada_woocommerce::get_avada_wc_vars()
);
}
Fusion_Dynamic_JS::enqueue_script(
'fusion-js-' . $this->shortcode_name,
FusionBuilder::$js_folder_url . '/general/fusion-post-cards.js',
FusionBuilder::$js_folder_path . '/general/fusion-post-cards.js',
[ 'jquery', 'jquery-infinite-scroll', 'images-loaded' ],
FUSION_BUILDER_VERSION,
true
);
$label = esc_html__( 'posts', 'fusion-builder' );
Fusion_Dynamic_JS::localize_script(
'fusion-js-' . $this->shortcode_name,
'fusionPostCardsVars',
[
/* translators: The name. */
'infinite_text' => '<em>' . sprintf( __( 'Loading the next set of %s...', 'fusion-builder' ), $label ) . '</em>',
'infinite_finished_msg' => '<em>' . __( 'All items displayed.', 'fusion-builder' ) . '</em>',
'lightbox_behavior' => fusion_library()->get_option( 'lightbox_behavior' ) ? fusion_library()->get_option( 'lightbox_behavior' ) : false,
'pagination_type' => 'pagination',
]
);
}
}
/**
* Builds the dynamic styling.
*
* @access public
* @since 3.8
* @return array
*/
public function add_styling() {
global $content_media_query;
$css[ $content_media_query ]['.fusion-post-cards .fusion-filters']['display'] = 'block !important';
return $css;
}
/**
* Load base CSS.
*
* @access public
* @since 3.3
* @return void
*/
public function add_css_files() {
// Post cards needs styling for product rollover.
if ( class_exists( 'Avada' ) ) {
if ( class_exists( 'WooCommerce' ) ) {
Fusion_Dynamic_CSS::enqueue_style( Avada::$template_dir_path . '/assets/css/dynamic/woocommerce/woo-products.min.css', Avada::$template_dir_url . '/assets/css/dynamic/woocommerce/woo-products.min.css' );
}
$version = Avada::get_theme_version();
$query_styles = [
'avada-swiper-md' => [
'url' => FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/swiper-md.min.css',
'media' => 'fusion-max-medium',
],
'avada-swiper-sm' => [
'url' => FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/swiper-sm.min.css',
'media' => 'fusion-max-small',
],
'avada-post-cards-md' => [
'url' => FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/post-cards-md.min.css',
'media' => 'fusion-max-medium',
],
'avada-post-cards-sm' => [
'url' => FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/post-cards-sm.min.css',
'media' => 'fusion-max-small',
],
'avada-grid-md' => [
'url' => FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/grid-md.min.css',
'media' => 'fusion-max-medium',
],
'avada-grid-sm' => [
'url' => FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/grid-sm.min.css',
'media' => 'fusion-max-small',
],
];
foreach ( $query_styles as $key => $value ) {
Fusion_Media_Query_Scripts::$media_query_assets[] = [
$key,
$value['url'],
[],
$version,
Fusion_Media_Query_Scripts::get_media_query_from_key( $value['media'] ),
];
}
}
FusionBuilder()->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/shortcodes/grid.min.css' );
FusionBuilder()->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/shortcodes/post-cards.min.css' );
}
/**
* Check if pagination is loadmore.
*
* @access public
* @since 3.3
* @return boolean
*/
public function is_load_more() {
return in_array( $this->args['scrolling'], [ 'infinite', 'load_more_button' ], true ) && ( 'grid' === $this->args['layout'] || 'masonry' === $this->args['layout'] );
}
/**
* Get placeholder.
*
* @since 3.3
* @param string $type placeholder type.
* @return string
*/
protected function get_placeholder( $type = 'card' ) {
if ( ! current_user_can( 'manage_options' ) ) {
$msg = '';
} elseif ( 'card' === $type ) {
$msg = sprintf( '<a href="%s" target="_blank" class="fusion-builder-placeholder">%s</a>', admin_url( 'admin.php?page=avada-library' ), esc_html__( 'Please select post card design to display here.', 'fusion-builder' ) );
} else {
$msg = in_array( $this->args['source'], [ 'posts', 'related', 'up_sells', 'cross_sells', 'featured_products', 'acf_relationship' ], true ) ? esc_html__( 'No posts found.', 'fusion-builder' ) : esc_html__( 'No terms found.', 'fusion-builder' );
$msg = sprintf( '<div class="fusion-builder-placeholder">%s</div>', $msg );
}
return apply_filters( 'awb_post_cards_placeholder_message', $msg, $type, $this->args );
}
/**
* Get reverse number.
*
* @access public
* @since 3.3
* @param string $value number value.
* @return string
*/
public function get_reverse_num( $value ) {
return strpos( $value, '-' ) > 0 ? str_replace( '-', '', $value ) : '-' . $value;
}
/**
* Get the inline style.
*
* @since 3.9
* @return string
*/
public function get_inline_style() {
$css_vars_options = [
'arrow_position_vertical' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'arrow_position_horizontal' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'arrow_size' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'arrow_box_width' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'arrow_box_height' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'arrow_bgcolor' => [ 'callback' => [ 'Fusion_Sanitize', 'color' ] ],
'arrow_color' => [ 'callback' => [ 'Fusion_Sanitize', 'color' ] ],
'arrow_hover_bgcolor' => [ 'callback' => [ 'Fusion_Sanitize', 'color' ] ],
'arrow_hover_color' => [ 'callback' => [ 'Fusion_Sanitize', 'color' ] ],
'arrow_border_radius_top_left' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'arrow_border_radius_top_right' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'arrow_border_radius_bottom_right' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'arrow_border_radius_bottom_left' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'dots_color' => [ 'callback' => [ 'Fusion_Sanitize', 'color' ] ],
'dots_active_color' => [ 'callback' => [ 'Fusion_Sanitize', 'color' ] ],
'dots_size' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'dots_active_size' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'dots_spacing' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'column_spacing' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'dots_margin_top' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'dots_margin_bottom' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'dots_align',
'columns',
'filters_font_size' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'filters_line_height',
'filters_letter_spacing' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'filters_text_transform',
'filters_color' => [ 'callback' => [ 'Fusion_Sanitize', 'color' ] ],
'filters_hover_color' => [ 'callback' => [ 'Fusion_Sanitize', 'color' ] ],
'filters_active_color' => [ 'callback' => [ 'Fusion_Sanitize', 'color' ] ],
'active_filter_border_size' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'active_filter_border_color' => [ 'callback' => [ 'Fusion_Sanitize', 'color' ] ],
'filters_border_bottom' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'filters_border_top' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'filters_border_left' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'filters_border_right' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'filters_border_color' => [ 'callback' => [ 'Fusion_Sanitize', 'color' ] ],
'filters_height' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'filters_alignment',
'row_spacing' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'margin_top' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'margin_right' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'margin_bottom' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'margin_left' => [ 'callback' => [ 'Fusion_Sanitize', 'get_value_with_unit' ] ],
'load_more_btn_color' => [ 'callback' => [ 'Fusion_Sanitize', 'color' ] ],
'load_more_btn_bg_color' => [ 'callback' => [ 'Fusion_Sanitize', 'color' ] ],
'load_more_btn_hover_color' => [ 'callback' => [ 'Fusion_Sanitize', 'color' ] ],
'load_more_btn_hover_bg_color' => [ 'callback' => [ 'Fusion_Sanitize', 'color' ] ],
];
$custom_vars = [];
if ( ! $this->is_default( 'arrow_position_vertical' ) ) {
$custom_vars['arrow_position_vertical_transform'] = 'none';
}
if ( ! $this->is_default( 'filters_border_left' ) ) {
$custom_vars['filters_border_left_style'] = 'solid';
}
if ( ! $this->is_default( 'filters_border_right' ) ) {
$custom_vars['filters_border_right_style'] = 'solid';
}
// Responsive Columns.
// List view should always be 100%.
if ( 'list' === $this->get_product_view() ) {
$custom_vars['columns_medium'] = '100%';
$custom_vars['columns_small'] = '100%';
} elseif ( 'grid' === $this->args['layout'] || 'masonry' === $this->args['layout'] ) {
foreach ( [ 'medium', 'small' ] as $responsive_size ) {
$key = 'columns_' . $responsive_size;
if ( ! $this->is_default( $key ) ) {
$custom_vars[ $key ] = $this->get_grid_width_val( $key );
}
}
}
// Responsive Filters Alignment.
if ( 'no' !== $this->args['filters'] && ( 'grid' === $this->args['layout'] || 'masonry' === $this->args['layout'] ) && 'posts' === $this->args['source'] ) {
foreach ( [ 'medium', 'small' ] as $size ) {
$key = 'filters_alignment_' . $size;
$custom_vars[ $key ] = $this->args[ $key ];
}
}
return $this->get_css_vars_for_options( $css_vars_options ) . $this->get_font_styling_vars( 'filters_font' ) . $this->get_custom_css_vars( $custom_vars );
}
/**
* Apply post per page on shop page.
*
* @access public
* @since 3.3
* @param object $query The WP_Query object.
* @return void
*/
public function alter_shop_loop( $query ) {
if ( ! is_admin() && $query->is_main_query() && ! $query->is_search && $query->is_post_type_archive( 'product' ) && 'no' === fusion_get_option( 'show_wc_shop_loop' ) ) {
$search_override = get_post( wc_get_page_id( 'shop' ) );
$has_archives_component = $search_override && has_shortcode( $search_override->post_content, 'fusion_post_cards' );
if ( $has_archives_component ) {
$pattern = get_shortcode_regex( [ 'fusion_post_cards' ] );
$content = $search_override->post_content;
if ( preg_match_all( '/' . $pattern . '/s', $search_override->post_content, $matches )
&& array_key_exists( 2, $matches )
&& in_array( 'fusion_post_cards', $matches[2], true ) ) {
$search_atts = shortcode_parse_atts( $matches[3][0] );
$number_posts = ( isset( $_GET['product_count'] ) ) ? (int) $_GET['product_count'] : $search_atts['number_posts']; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
$query->set( 'paged', ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1 );
if ( '0' !== $number_posts ) {
$query->set( 'posts_per_page', $number_posts );
}
}
}
}
}
/**
* Get grid width value.
*
* @access public
* @since 3.3
* @param string $key Key column.
* @return string
*/
public function get_grid_width_val( $key ) {
$columns = $this->args[ $key ];
$cols = [
'1' => '100%',
'2' => '50%',
'3' => '33.3333%',
'4' => '25%',
'5' => '20%',
'6' => '16.6666%',
];
return isset( $cols[ $columns ] ) ? $cols[ $columns ] : '100%';
}
/**
* Fetch post types.
*
* @access protected
* @since 3.3
* @return mixed
*/
public function fetch_post_types() {
if ( null !== $this->post_types ) {
return $this->post_types;
}
$post_types = get_post_types( [ 'public' => true ], 'objects' );
unset( $post_types['attachment'] );
unset( $post_types['slide'] );
$this->post_types = apply_filters( 'post_card_post_types', $post_types );
return $this->post_types;
}
/**
* Fetch taxonomies.
*
* @access protected
* @since 3.3
* @return array
*/
public function fetch_taxonomies() {
if ( null !== $this->taxonomies ) {
return $this->taxonomies;
}
$post_types = $this->fetch_post_types();
if ( is_array( $post_types ) ) {
foreach ( $post_types as $post_type ) {
$new_taxonomies = get_object_taxonomies( $post_type->name, 'objects' );
foreach ( $new_taxonomies as $new_taxonomy ) {
$post_taxonomies[ $new_taxonomy->name ] = $new_taxonomy;
// Need each taxonomy for each post type.
if ( ! isset( $this->taxonomy_map[ $post_type->name ] ) ) {
$this->taxonomy_map[ $post_type->name ] = [ 'all' ];
}
$this->taxonomy_map[ $post_type->name ][] = $new_taxonomy->name;
}
if ( 'product' === $post_type->name ) {
$this->taxonomy_map[ $post_type->name ][] = 'product_skus';
}
$this->taxonomy_map[ $post_type->name ][] = 'awb_custom_field';
}
}
unset( $post_taxonomies['post_format'] ); // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UndefinedUnsetVariable
unset( $post_taxonomies['product_visibility'] ); // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UndefinedUnsetVariable
$this->taxonomies = apply_filters( 'post_card_post_taxonomies', $post_taxonomies );
return $this->taxonomies;
}
/**
* Fetch post type option select.
*
* @access protected
* @since 3.3
* @return string
*/
public function fetch_post_type_option() {
$post_types = $this->fetch_post_types();
$post_type_options = [];
if ( is_array( $post_types ) ) {
foreach ( $post_types as $post_type ) {
$post_type_options[ esc_attr( $post_type->name ) ] = esc_html( $post_type->label );
}
}
return [
'type' => 'select',
'heading' => esc_attr__( 'Post Type', 'fusion-builder' ),
'description' => esc_attr__( 'Select the post type to display.', 'fusion-builder' ),
'param_name' => 'post_type',
'default' => 'post',
'value' => $post_type_options,
'dependency' => [
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
];
}
/**
* Fetch post taxonomy option select.
*
* @access protected
* @since 3.3
* @return string
*/
public function fetch_post_terms_option() {
$taxonomies = $this->fetch_taxonomies();
$taxonomy_options = [];
if ( is_array( $taxonomies ) ) {
foreach ( $taxonomies as $taxonomy ) {
$taxonomy_options[ $taxonomy->name ] = ucwords( esc_html( $taxonomy->label ) );
}
}
return [
'type' => 'select',
'heading' => esc_html__( 'Taxonomy', 'fusion-builder' ),
'description' => esc_html__( 'Select which taxonomy to use.', 'fusion-builder' ),
'param_name' => 'terms_by',
'default' => '',
'value' => $taxonomy_options,
'dependency' => [
[
'element' => 'source',
'value' => 'posts',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'up_sells',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'cross_sells',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'featured_products',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'acf_repeater',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'acf_relationship',
'operator' => '!=',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
];
}
/**
* Fetch post type specific filter options.
*
* @access protected
* @since 3.3
* @return string
*/
public function fetch_post_filter_option() {
$filter_options = [];
$taxonomies = $this->fetch_taxonomies();
$taxonomy_options = [
'all' => esc_html__( 'All', 'fusion-builder' ),
];
if ( empty( $taxonomies ) ) {
return $filter_options;
}
// There ae some, add each to select field if they are accepted.
foreach ( $taxonomies as $taxonomy ) {
$taxonomy_options[ $taxonomy->name ] = ucwords( esc_html( $taxonomy->label ) );
}
$taxonomy_options['product_skus'] = esc_html__( 'Product SKUs', 'fusion-builder' );
$taxonomy_options['awb_custom_field'] = esc_html__( 'Custom Field', 'fusion-builder' );
$filter_options = [
[
'type' => 'select',
'heading' => esc_html__( 'Posts By', 'fusion-builder' ),
'description' => esc_html__( 'Select which taxonomy to pull posts from or select all to pull all.', 'fusion-builder' ),
'param_name' => 'posts_by',
'default' => 'all',
'value' => $taxonomy_options,
'conditions' => [
'option' => 'post_type',
'map' => $this->taxonomy_map,
],
'dependency' => [
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
],
[
'type' => 'multiple_select',
'heading' => esc_html__( 'Post Status', 'fusion-core' ),
'placeholder' => esc_html__( 'Post Status', 'fusion-core' ),
'description' => esc_html__( 'Select the status(es) of the posts that should be included or leave blank for published only posts.', 'fusion-core' ),
'param_name' => 'post_status',
'value' => [
'publish' => esc_html__( 'Published', 'fusion-builder' ),
'pending' => esc_html__( 'Pending', 'fusion-builder' ),
'draft' => esc_html__( 'Drafted', 'fusion-builder' ),
'future' => esc_html__( 'Future', 'fusion-builder' ),
'private' => esc_html__( 'Private', 'fusion-builder' ),
'trash' => esc_html__( 'Trash', 'fusion-builder' ),
'any' => esc_html__( 'Any', 'fusion-builder' ),
],
'default' => '',
'dependency' => [
[
'element' => 'source',
'value' => 'terms',
'operator' => '!=',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
],
[
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Ignore Sticky Posts', 'fusion-builder' ),
'description' => esc_attr__( 'Select if sticky posts should be displayed first ("No") or as part of the selected ordering ("Yes").', 'fusion-builder' ),
'param_name' => 'ignore_sticky_posts',
'default' => 'no',
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
'value' => [
'yes' => esc_html__( 'Yes', 'fusion-builder' ),
'no' => esc_html__( 'No', 'fusion-builder' ),
],
'dependency' => [
[
'element' => 'source',
'value' => 'terms',
'operator' => '!=',
],
],
]
];
return $filter_options;
}
/**
* Fetch taxonomy options.
*
* @access protected
* @since 3.3
* @return string
*/
public function fetch_post_taxonomy_options() {
$taxonomies = $this->fetch_taxonomies();
$options = [];
if ( is_array( $taxonomies ) ) {
foreach ( $taxonomies as $taxonomy ) {
$field_type = 'ajax_select';
$ajax = 'fusion_search_query';
$ajax_params = [
'taxonomy' => $taxonomy->name,
];
$selection = [];
if ( 25 > wp_count_terms( $taxonomy->name ) ) {
$ajax = '';
$field_type = 'multiple_select';
$terms = get_terms(
[
'taxonomy' => $taxonomy->name,
'hide_empty' => false,
]
);
// All terms.
foreach ( $terms as $term ) {
$selection[ $term->term_id ] = $term->name;
}
}
$taxonomy_title = ucwords( $taxonomy->labels->name );
$include_options = [
'type' => $field_type,
/* translators: Taxonomy title. */
'heading' => sprintf( esc_attr__( 'Include %s', 'fusion-builder' ), $taxonomy_title ),
'placeholder' => ucwords( $taxonomy->labels->name ),
/* translators: Taxonomy name. */
'description' => sprintf( esc_attr__( 'Select a %s or leave blank for all.', 'fusion-builder' ), strtolower( $taxonomy->labels->name ) ),
'param_name' => 'include_' . $taxonomy->name,
'default' => '',
'value' => $selection,
'ajax' => $ajax,
'ajax_params' => $ajax_params,
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
'dependency' => [
[
'element' => 'posts_by',
'value' => $taxonomy->name,
'operator' => '==',
],
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
],
];
$options[] = $include_options;
// Duplicate the option for terms.
$include_options['param_name'] = 'include_term_' . $taxonomy->name;
$include_options['dependency'] = [
[
'element' => 'terms_by',
'value' => $taxonomy->name,
'operator' => '==',
],
[
'element' => 'source',
'value' => 'terms',
'operator' => '==',
],
];
$options[] = $include_options;
$exclude_options = [
'type' => $field_type,
/* translators: Taxonomy title. */
'heading' => sprintf( esc_attr__( 'Exclude %s', 'fusion-builder' ), $taxonomy_title ),
'placeholder' => ucwords( $taxonomy->labels->name ),
/* translators: Taxonomy name. */
'description' => sprintf( esc_attr__( 'Select a %s or leave blank for all.', 'fusion-builder' ), strtolower( $taxonomy->labels->name ) ),
'param_name' => 'exclude_' . $taxonomy->name,
'default' => '',
'value' => $selection,
'ajax' => $ajax,
'ajax_params' => $ajax_params,
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
'dependency' => [
[
'element' => 'posts_by',
'value' => $taxonomy->name,
'operator' => '==',
],
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
],
];
$options[] = $exclude_options;
// Duplicate option for terms.
$exclude_options['param_name'] = 'exclude_term_' . $taxonomy->name;
$exclude_options['dependency'] = $include_options['dependency'];
$options[] = $exclude_options;
}
}
return $options;
}
/**
* Fetch taxonomy options.
*
* @access protected
* @since 3.11.8
* @return string
*/
public function fetch_product_sku_options() {
$options = [];
if ( post_type_exists( 'product' ) ) {
$options = [
[
'type' => 'sortable_text',
'heading' => esc_html__( 'Include Products by SKU', 'fusion-builder' ),
'description' => esc_html__( 'Add the SKUs of the products to include or leave empty to include all products with .', 'fusion-builder' ),
'add_label' => esc_html__( 'Add SKU', 'fusion-builder' ),
'placeholder' => esc_html__( 'Product SKUs', 'fusion-builder' ),
'param_name' => 'include_product_skus',
'is_sortable' => 0,
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
'dependency' => [
[
'element' => 'posts_by',
'value' => 'product_skus',
'operator' => '==',
],
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
],
],
[
'type' => 'sortable_text',
'heading' => esc_html__( 'Exclude Products by SKU', 'fusion-builder' ),
'description' => esc_html__( 'Add the SKUs of the products to exclude.', 'fusion-builder' ),
'add_label' => esc_html__( 'Add SKU', 'fusion-builder' ),
'placeholder' => esc_html__( 'Product SKUs', 'fusion-builder' ),
'param_name' => 'exclude_product_skus',
'is_sortable' => 0,
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
'dependency' => [
[
'element' => 'posts_by',
'value' => 'product_skus',
'operator' => '==',
],
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
],
],
];
}
return $options;
}
/**
* Fetch post meta options.
*
* @return array
*/
public function fetch_post_meta_options() {
$options = [];
$options[] = [
'type' => 'textfield',
'heading' => esc_attr__( 'Custom Field - Name', 'fusion-builder' ),
'description' => esc_attr__( 'Enter the custom field (or meta) name.', 'fusion-builder' ),
'param_name' => 'custom_field_name',
'default' => '',
'dynamic_data' => true,
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
'dependency' => [
[
'element' => 'posts_by',
'value' => 'awb_custom_field',
'operator' => '==',
],
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
],
];
$options[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Custom Field - Value Comparison', 'fusion-builder' ),
'description' => esc_attr__( 'Select the custom field (or meta) comparison type. The "like" comparison is needed when you want to check serialized data for equality.', 'fusion-builder' ),
'param_name' => 'custom_field_comparison',
'default' => 'exists',
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
'value' => [
'exists' => esc_html__( 'Exists', 'fusion-builder' ),
'not_exists' => esc_html__( 'Not Exists', 'fusion-builder' ),
'equals' => esc_html__( 'Equals', 'fusion-builder' ),
'like' => esc_html__( 'Like', 'fusion-builder' ),
],
'dependency' => [
[
'element' => 'posts_by',
'value' => 'awb_custom_field',
'operator' => '==',
],
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
],
];
$options[] = [
'type' => 'textfield',
'heading' => esc_attr__( 'Custom Field - Value', 'fusion-builder' ),
'description' => esc_attr__( 'Enter the custom field (or meta) value.', 'fusion-builder' ),
'param_name' => 'custom_field_value',
'default' => '',
'dynamic_data' => true,
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
'dependency' => [
[
'element' => 'posts_by',
'value' => 'awb_custom_field',
'operator' => '==',
],
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
[
'element' => 'custom_field_comparison',
'value' => 'exists',
'operator' => '!=',
],
[
'element' => 'custom_field_comparison',
'value' => 'not_exists',
'operator' => '!=',
],
],
];
return $options;
}
}
}
/**
* Instantiates the post cards class.
*
* @return object FusionSC_PostCards
*/
function fusion_post_cards() { // phpcs:ignore WordPress.NamingConventions
return FusionSC_PostCards::get_instance();
}
// Instantiate post cards.
fusion_post_cards();
}
/**
* Map shortcode to Avada Builder.
*/
function fusion_element_post_cards() {
$fusion_settings = awb_get_fusion_settings();
$editing = apply_filters( 'awb_post_cards_options_is_editing', function_exists( 'is_fusion_editor' ) && is_fusion_editor() );
$post_type_option = [];
$post_type_options = [];
$taxonomy_options = [];
$product_sku_options = [];
$filter_options = [];
$meta_options = [];
$post_terms_option = [];
$layouts_permalink = [];
$layouts = [
'0' => esc_attr__( 'None', 'fusion-builder' ),
];
// If builder get custom layout options.
if ( $editing && function_exists( 'Fusion_Builder_Library' ) ) {
// In case taxonomy is not registered yet, register.
Fusion_Builder_Library()->register_layouts();
$post_cards = get_posts(
[
'post_type' => 'fusion_element',
'posts_per_page' => '-1',
'tax_query' => [ // phpcs:ignore WordPress.DB.SlowDBQuery
[
'taxonomy' => 'element_category',
'field' => 'slug',
'terms' => 'post_cards',
],
],
]
);
if ( $post_cards ) {
foreach ( $post_cards as $post_card ) {
$layouts[ $post_card->ID ] = $post_card->post_title;
$layouts_permalink[ $post_card->ID ] = $post_card->guid;
}
}
// We only need options if element is active so check here is safe.
if ( function_exists( 'fusion_post_cards' ) ) {
$post_cards = fusion_post_cards();
$post_type_option = $post_cards->fetch_post_type_option();
$post_terms_option = $post_cards->fetch_post_terms_option();
$filter_options = $post_cards->fetch_post_filter_option();
$taxonomy_options = $post_cards->fetch_post_taxonomy_options();
$product_sku_options = $post_cards->fetch_product_sku_options();
$meta_options = $post_cards->fetch_post_meta_options();
}
}
$source_values = [
'posts' => esc_attr__( 'Posts', 'fusion-builder' ),
'terms' => esc_attr__( 'Terms', 'fusion-builder' ),
'related' => esc_attr__( 'Related', 'fusion-builder' ),
];
if ( class_exists( 'WooCommerce' ) ) {
$woo_sources = [
'up_sells' => esc_attr__( 'Upsells', 'fusion-builder' ),
'cross_sells' => esc_attr__( 'Cross-sells', 'fusion-builder' ),
'featured_products' => esc_attr__( 'Featured Products', 'fusion-builder' ),
];
$source_values = array_merge( $source_values, $woo_sources );
}
if ( class_exists( 'ACF' ) ) {
$source_values['acf_repeater'] = esc_attr__( 'ACF Repeater', 'fusion-builder' );
$source_values['acf_relationship'] = esc_attr__( 'ACF Relationship', 'fusion-builder' );
}
$library_link = '<a href="' . admin_url( 'admin.php?page=avada-library' ) . '">' . esc_attr__( 'Avada Library', 'fusion-builder' ) . '</a>';
$params = [
[
'type' => 'select',
'heading' => esc_attr__( 'Post Card', 'fusion-builder' ),
'group' => esc_attr__( 'General', 'fusion-builder' ),
/* translators: The Avada Library link. */
'description' => sprintf( __( 'Select a saved Post Card design to use. Create new or edit existing Post Cards in the %s.', 'fusion-builder' ), $library_link ),
'param_name' => 'post_card',
'default' => '0',
'value' => $layouts,
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
'quick_edit' => [
'label' => esc_html__( 'Edit Post Card', 'fusion-builder' ),
'type' => 'post_card',
'items' => $layouts_permalink,
],
],
[
'type' => 'select',
'heading' => esc_attr__( 'Post Card List View', 'fusion-builder' ),
'group' => esc_attr__( 'General', 'fusion-builder' ),
/* translators: The Avada Library link. */
'description' => sprintf( __( 'This post card will be used in the list view which can be triggered with the sorting element. Post cards can be created in the %s.', 'fusion-builder' ), $library_link ),
'param_name' => 'post_card_list_view',
'default' => '0',
'value' => $layouts,
'dependency' => [
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
[
'element' => 'post_type',
'value' => 'product',
'operator' => '==',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
],
[
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Content Source', 'fusion-builder' ),
'description' => __( 'Select the type of content you would like to show. <strong>NOTE:</strong> The related option will fetch items related to the post that it is placed on based on taxonomy selection.', 'fusion-builder' ),
'param_name' => 'source',
'default' => 'posts',
'value' => $source_values,
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
],
[
'type' => 'textfield',
'heading' => esc_attr__( 'Repeater Field', 'fusion-builder' ),
'description' => __( 'Enter field name you want to use.', 'fusion-builder' ),
'param_name' => 'acf_repeater_field',
'default' => '',
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
'dependency' => [
[
'element' => 'source',
'value' => 'acf_repeater',
'operator' => '==',
],
],
],
[
'type' => 'textfield',
'heading' => esc_attr__( 'Relationship Field', 'fusion-builder' ),
'description' => __( 'Enter field name you want to use.', 'fusion-builder' ),
'param_name' => 'acf_relationship_field',
'default' => '',
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
'dependency' => [
[
'element' => 'source',
'value' => 'acf_relationship',
'operator' => '==',
],
],
],
$post_type_option,
$post_terms_option,
];
foreach ( $filter_options as $filter_option ) {
$params[] = $filter_option;
}
foreach ( $taxonomy_options as $taxonomy_option ) {
$params[] = $taxonomy_option;
}
foreach ( $product_sku_options as $product_sku_option ) {
$params[] = $product_sku_option;
}
foreach ( $meta_options as $meta_option ) {
$params[] = $meta_option;
}
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Display Products By Price Type', 'fusion-builder' ),
'description' => esc_attr__( 'Include products depending on the price type', 'fusion-builder' ),
'param_name' => 'filter_price_type',
'value' => [
'regular_price' => esc_attr__( 'Regular', 'fusion-builder' ),
'sale_price' => esc_attr__( 'Sale', 'fusion-builder' ),
'both' => esc_attr__( 'Both', 'fusion-builder' ),
],
'default' => 'both',
'dependency' => [
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
[
'element' => 'post_type',
'value' => 'product',
'operator' => '==',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Include Out Of Stock Products', 'fusion-builder' ),
'description' => esc_attr__( 'Include or exclude out of stock products.', 'fusion-builder' ),
'param_name' => 'out_of_stock',
'value' => [
'include' => esc_attr__( 'Include', 'fusion-builder' ),
'exclude' => esc_attr__( 'Exclude', 'fusion-builder' ),
],
'default' => 'include',
'dependency' => [
[
'element' => 'source',
'value' => 'terms',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'acf_repeater',
'operator' => '!=',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Show Hidden Products', 'fusion-builder' ),
'description' => esc_attr__( 'Display hidden products that are excluded from search or catalogs.', 'fusion-builder' ),
'param_name' => 'show_hidden',
'value' => [
'yes' => esc_attr__( 'Yes', 'fusion-builder' ),
'no' => esc_attr__( 'No', 'fusion-builder' ),
],
'default' => 'no',
'dependency' => [
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
[
'element' => 'post_type',
'value' => 'product',
'operator' => '==',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Show Filters', 'fusion-builder' ),
'description' => esc_attr__( 'Choose to show or hide the filters.', 'fusion-builder' ),
'param_name' => 'filters',
'value' => [
'yes' => esc_attr__( 'Yes', 'fusion-builder' ),
'yes-without-all' => __( 'Yes without "All"', 'fusion-builder' ),
'no' => esc_attr__( 'No', 'fusion-builder' ),
],
'default' => 'no',
'dependency' => [
[
'element' => 'layout',
'value' => 'carousel',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'slider',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
];
$params[] = [
'type' => 'range',
'heading' => esc_attr__( 'Number of Posts', 'fusion-builder' ),
'description' => sprintf(
/* translators: %1$s: Portfolio Link. %2$s: Products Link. */
esc_attr__( 'Select number of posts per page. Set to -1 to display all. Set to 0 to use the post type default number of posts. For %1$s and %2$s this comes from the global options. For all others Settings > Reading.', 'fusion-builder' ),
'<a href="' . admin_url( 'themes.php?page=avada_options#portfolio_archive_items' ) . '" target="_blank">' . esc_attr__( 'portfolio', 'fusion-builder' ) . '</a>',
'<a href="' . admin_url( 'themes.php?page=avada_options#woo_items' ) . '" target="_blank">' . esc_attr__( 'products', 'fusion-builder' ) . '</a>'
),
'param_name' => 'number_posts',
'min' => '-1',
'max' => '50',
'step' => '1',
'value' => '0',
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
];
$params[] = [
'type' => 'range',
'heading' => esc_attr__( 'Posts Offset', 'fusion-builder' ),
'description' => esc_attr__( 'The number of posts to skip. ex: 1.', 'fusion-builder' ),
'param_name' => 'offset',
'value' => '0',
'min' => '0',
'max' => '24',
'step' => '1',
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
'dependency' => [
[
'element' => 'source',
'value' => 'acf_repeater',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'select',
'heading' => esc_attr__( 'Order By', 'fusion-builder' ),
'description' => __( 'Defines how posts should be ordered. <strong>NOTE:</strong> (Price|Popularity|Rating) options only work for product-related queries.', 'fusion-builder' ),
'param_name' => 'orderby',
'default' => 'date',
'value' => [
'date' => esc_attr__( 'Date', 'fusion-builder' ),
'title' => esc_attr__( 'Post Title', 'fusion-builder' ),
'name' => esc_attr__( 'Post Slug', 'fusion-builder' ),
'author' => esc_attr__( 'Author', 'fusion-builder' ),
'post__in' => esc_attr__( 'Post In', 'fusion-builder' ),
'id' => esc_attr__( 'ID', 'fusion-builder' ),
'comment_count' => esc_attr__( 'Number of Comments', 'fusion-builder' ),
'post_views' => esc_attr__( 'Post Views', 'fusion-builder' ),
'modified' => esc_attr__( 'Last Modified', 'fusion-builder' ),
'rand' => esc_attr__( 'Random', 'fusion-builder' ),
'price' => esc_attr__( 'Price', 'fusion-builder' ),
'popularity' => esc_attr__( 'Popularity (sales)', 'fusion-builder' ),
'rating' => esc_attr__( 'Average Rating', 'fusion-builder' ),
'event_date' => esc_attr__( 'Event Date', 'fusion-builder' ),
'menu_order' => esc_attr__( 'Menu Order', 'fusion-builder' ),
'meta_value' => esc_attr__( 'Custom Field', 'fusion-builder' ), //phpcs:ignore WordPress.DB.SlowDBQuery
],
'dependency' => [
[
'element' => 'source',
'value' => 'terms',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'acf_repeater',
'operator' => '!=',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
];
$params[] = [
'type' => 'textfield',
'heading' => esc_attr__( 'Custom Field Name', 'fusion-builder' ),
'description' => __( 'Insert custom field name.', 'fusion-builder' ),
'param_name' => 'orderby_custom_field_name',
'dependency' => [
[
'element' => 'source',
'value' => 'terms',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'acf_repeater',
'operator' => '!=',
],
[
'element' => 'orderby',
'value' => 'meta_value',
'operator' => '==',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
];
$params[] = [
'type' => 'select',
'heading' => esc_attr__( 'Custom Field Type', 'fusion-builder' ),
'description' => __( 'Select custom field value type.', 'fusion-builder' ),
'param_name' => 'orderby_custom_field_type',
'default' => 'CHAR',
'value' => [
'CHAR' => esc_attr__( 'String', 'fusion-builder' ),
'NUMERIC' => esc_attr__( 'Numeric', 'fusion-builder' ),
'DATE' => esc_attr__( 'Date', 'fusion-builder' ),
'DATETIME' => esc_attr__( 'Date and time', 'fusion-builder' ),
'TIME' => esc_attr__( 'Time', 'fusion-builder' ),
'BINARY' => esc_attr__( 'Binary', 'fusion-builder' ),
'DECIMAL' => esc_attr__( 'Decimal', 'fusion-builder' ),
],
'dependency' => [
[
'element' => 'source',
'value' => 'terms',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'acf_repeater',
'operator' => '!=',
],
[
'element' => 'orderby',
'value' => 'meta_value',
'operator' => '==',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
];
$params[] = [
'type' => 'select',
'heading' => esc_attr__( 'Order By', 'fusion-builder' ),
'description' => __( 'Defines how terms should be ordered.', 'fusion-builder' ),
'param_name' => 'orderby_term',
'default' => 'name',
'value' => [
'name' => esc_attr__( 'Name', 'fusion-builder' ),
'slug' => esc_attr__( 'Slug', 'fusion-builder' ),
'term_group' => esc_attr__( 'Term Group', 'fusion-builder' ),
'term_id' => esc_attr__( 'Term ID', 'fusion-builder' ),
'description' => esc_attr__( 'Description', 'fusion-builder' ),
'parent' => esc_attr__( 'Parent', 'fusion-builder' ),
],
'dependency' => [
[
'element' => 'source',
'value' => 'terms',
'operator' => '==',
],
[
'element' => 'source',
'value' => 'acf_repeater',
'operator' => '!=',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Order', 'fusion-builder' ),
'description' => esc_attr__( 'Defines the sorting order of posts.', 'fusion-builder' ),
'param_name' => 'order',
'default' => 'DESC',
'value' => [
'DESC' => esc_attr__( 'Descending', 'fusion-builder' ),
'ASC' => esc_attr__( 'Ascending', 'fusion-builder' ),
],
'dependency' => [
[
'element' => 'orderby',
'value' => 'rand',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'acf_repeater',
'operator' => '!=',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Show Only Upcoming Events', 'fusion-builder' ),
'description' => __( 'Whether or not the events displayed will be only from the current date.', 'fusion-builder' ),
'param_name' => 'upcoming_events_only',
'default' => 'yes',
'value' => [
'yes' => esc_attr__( 'Yes', 'fusion-builder' ),
'no' => esc_attr__( 'No', 'fusion-builder' ),
],
'dependency' => [
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
[
'element' => 'post_type',
'value' => 'tribe_events',
'operator' => '==',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Show Only Featured Events', 'fusion-builder' ),
'description' => __( 'Whether or not to display only events that are featured.', 'fusion-builder' ),
'param_name' => 'featured_events_only',
'default' => 'no',
'value' => [
'yes' => esc_attr__( 'Yes', 'fusion-builder' ),
'no' => esc_attr__( 'No', 'fusion-builder' ),
],
'dependency' => [
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
[
'element' => 'post_type',
'value' => 'tribe_events',
'operator' => '==',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Pagination Type', 'fusion-builder' ),
'description' => esc_attr__( 'Select the type of pagination.', 'fusion-builder' ),
'param_name' => 'scrolling',
'default' => 'pagination',
'value' => [
'no' => esc_attr__( 'No Pagination', 'fusion-builder' ),
'pagination' => esc_attr__( 'Pagination', 'fusion-builder' ),
'infinite' => esc_attr__( 'Infinite Scrolling', 'fusion-builder' ),
'load_more_button' => esc_attr__( 'Load More Button', 'fusion-builder' ),
],
'dependency' => [
[
'element' => 'layout',
'value' => 'carousel',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'slider',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'terms',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'acf_repeater',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'tinymce',
'heading' => esc_attr__( 'Nothing Found Message', 'fusion-builder' ),
'description' => esc_attr__( 'Replacement text when no results are found.', 'fusion-builder' ),
'param_name' => 'element_content',
'value' => esc_html__( 'Nothing Found', 'fusion-builder' ),
'placeholder' => true,
'dynamic_data' => true,
];
$params[] = [
'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' ),
];
$params[] = [
'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' => '',
];
$params[] = [
'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' => '',
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Layout', 'fusion-builder' ),
'description' => esc_attr__( 'Select how you want Post Cards to display.', 'fusion-builder' ),
'param_name' => 'layout',
'value' => [
'grid' => esc_attr__( 'Grid', 'fusion-builder' ),
'carousel' => esc_attr__( 'Carousel', 'fusion-builder' ),
'slider' => esc_attr__( 'Slider', 'fusion-builder' ),
'masonry' => esc_attr__( 'Masonry', 'fusion-builder' ),
],
'default' => 'grid',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
];
$params[] = [
'type' => 'typography',
'heading' => esc_attr__( 'Filters Typography', 'fusion-builder' ),
'description' => esc_html__( 'Controls the typography of the filters content. Leave empty for the global font family.', 'fusion-builder' ),
'param_name' => 'filters_fonts',
'choices' => [
'font-family' => 'filters_font',
'font-size' => 'filters_font_size',
'text-transform' => 'filters_text_transform',
'line-height' => 'filters_line_height',
'letter-spacing' => 'filters_letter_spacing',
'color' => 'filters_color',
],
'default' => [
'font-family' => '',
'variant' => '400',
'font-size' => '',
'text-transform' => '',
'line-height' => '',
'letter-spacing' => '',
'color' => $fusion_settings->get( 'link_color' ),
],
'remove_from_atts' => true,
'global' => true,
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => [
[
'element' => 'layout',
'value' => 'carousel',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'slider',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
[
'element' => 'filters',
'value' => 'no',
'operator' => '!=',
],
],
'callback' => [
'function' => 'fusion_style_block',
],
];
$params[] = [
'type' => 'range',
'heading' => esc_attr__( 'Filters Container Height', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the filters container height. In pixels.', 'fusion-builder' ),
'param_name' => 'filters_height',
'value' => '36',
'min' => '0',
'max' => '500',
'step' => '1',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => [
[
'element' => 'layout',
'value' => 'carousel',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'slider',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
[
'element' => 'filters',
'value' => 'no',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'dimension',
'remove_from_atts' => true,
'heading' => esc_attr__( 'Filters Container Border Size', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the border size of the filters container. In pixels or percentage, ex: 10px or 10%.', 'fusion-builder' ),
'param_name' => 'border_sizes',
'value' => [
'filters_border_top' => '',
'filters_border_right' => '',
'filters_border_bottom' => '',
'filters_border_left' => '',
],
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => [
[
'element' => 'layout',
'value' => 'carousel',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'slider',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
[
'element' => 'filters',
'value' => 'no',
'operator' => '!=',
],
],
'callback' => [
'function' => 'fusion_style_block',
'args' => [
'dimension' => true,
],
],
];
$params[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Filters Container Border Color', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the border color of the filters container.', 'fusion-builder' ),
'param_name' => 'filters_border_color',
'value' => '',
'default' => $fusion_settings->get( 'sep_color' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => [
[
'element' => 'layout',
'value' => 'carousel',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'slider',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
[
'element' => 'filters',
'value' => 'no',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Filters Alignment', 'fusion-builder' ),
'description' => esc_attr__( 'Select the filters content alignment.', 'fusion-builder' ),
'param_name' => 'filters_alignment',
'default' => 'flex-start',
'grid_layout' => true,
'back_icons' => true,
'icons' => [
'flex-start' => '<span class="fusiona-horizontal-flex-start"></span>',
'center' => '<span class="fusiona-horizontal-flex-center"></span>',
'flex-end' => '<span class="fusiona-horizontal-flex-end"></span>',
'space-between' => '<span class="fusiona-horizontal-space-between"></span>',
'space-around' => '<span class="fusiona-horizontal-space-around"></span>',
'space-evenly' => '<span class="fusiona-horizontal-space-evenly"></span>',
],
'value' => [
'flex-start' => esc_html__( 'Flex Start', 'fusion-builder' ),
'center' => esc_html__( 'Center', 'fusion-builder' ),
'flex-end' => esc_html__( 'Flex End', 'fusion-builder' ),
'space-between' => esc_html__( 'Space Between', 'fusion-builder' ),
'space-around' => esc_html__( 'Space Around', 'fusion-builder' ),
'space-evenly' => esc_html__( 'Space Evenly', 'fusion-builder' ),
],
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => [
[
'element' => 'layout',
'value' => 'carousel',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'slider',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
[
'element' => 'filters',
'value' => 'no',
'operator' => '!=',
],
],
'responsive' => [
'state' => 'large',
],
];
$params[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Filters Link Hover Color', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the hover color of the filters link.', 'fusion-builder' ),
'param_name' => 'filters_hover_color',
'value' => '',
'default' => $fusion_settings->get( 'link_hover_color' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => [
[
'element' => 'layout',
'value' => 'carousel',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'slider',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
[
'element' => 'filters',
'value' => 'no',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Filters Link Active Color', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the active color of the filters link.', 'fusion-builder' ),
'param_name' => 'filters_active_color',
'value' => '',
'default' => $fusion_settings->get( 'primary_color' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => [
[
'element' => 'layout',
'value' => 'carousel',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'slider',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
[
'element' => 'filters',
'value' => 'no',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'range',
'heading' => esc_attr__( 'Active Filter Link Border Size', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the filters link border size. In pixels.', 'fusion-builder' ),
'param_name' => 'active_filter_border_size',
'value' => '3',
'min' => '0',
'max' => '100',
'step' => '1',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => [
[
'element' => 'layout',
'value' => 'carousel',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'slider',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
[
'element' => 'filters',
'value' => 'no',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Active Filter Link Border Color', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the color of the active filter link.', 'fusion-builder' ),
'param_name' => 'active_filter_border_color',
'value' => '',
'default' => $fusion_settings->get( 'primary_color' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => [
[
'element' => 'layout',
'value' => 'carousel',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'slider',
'operator' => '!=',
],
[
'element' => 'source',
'value' => 'posts',
'operator' => '==',
],
[
'element' => 'filters',
'value' => 'no',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Post Card Alignment', 'fusion-builder' ),
'description' => esc_attr__( 'Select the Post Cards alignment within rows.', 'fusion-builder' ),
'param_name' => 'flex_align_items',
'back_icons' => true,
'grid_layout' => true,
'value' => [
'flex-start' => esc_attr__( 'Flex Start', 'fusion-builder' ),
'center' => esc_attr__( 'Center', 'fusion-builder' ),
'flex-end' => esc_attr__( 'Flex End', 'fusion-builder' ),
'stretch' => esc_attr__( 'Stretch', 'fusion-builder' ),
],
'icons' => [
'flex-start' => '<span class="fusiona-align-top-columns"></span>',
'center' => '<span class="fusiona-align-center-columns"></span>',
'flex-end' => '<span class="fusiona-align-bottom-columns"></span>',
'stretch' => '<span class="fusiona-full-height"></span>',
],
'default' => 'flex-start',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => [
[
'element' => 'layout',
'value' => 'masonry',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'slider',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'range',
'heading' => esc_attr__( 'Number of Columns', 'fusion-builder' ),
'description' => esc_attr__( 'Set the number of columns per row.', 'fusion-builder' ),
'param_name' => 'columns',
'value' => '4',
'min' => '0',
'max' => '6',
'step' => '1',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'responsive' => [
'state' => 'large',
'values' => [
'small' => '0',
'medium' => '0',
],
'descriptions' => [
'small' => esc_attr__( 'Set the number of columns per row. Leave at 0 for automatic column breaking.', 'fusion-builder' ),
'medium' => esc_attr__( 'Set the number of columns per row. Leave at 0 for automatic column breaking.', 'fusion-builder' ),
],
],
'dependency' => [
[
'element' => 'layout',
'value' => 'slider',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'range',
'heading' => esc_attr__( 'Column Spacing', 'fusion-builder' ),
'description' => esc_attr__( "Insert the amount of horizontal spacing between items without 'px'. ex: 40.", 'fusion-builder' ),
'param_name' => 'column_spacing',
'value' => '40',
'min' => '0',
'max' => '300',
'step' => '1',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => [
[
'element' => 'columns',
'value' => '1',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'slider',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'range',
'heading' => esc_attr__( 'Row Spacing', 'fusion-builder' ),
'description' => esc_attr__( "Insert the amount of vertical spacing between items without 'px'. ex: 40.", 'fusion-builder' ),
'param_name' => 'row_spacing',
'value' => '40',
'min' => '0',
'max' => '300',
'step' => '1',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => [
[
'element' => 'layout',
'value' => 'carousel',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'slider',
'operator' => '!=',
],
],
];
// Separator styles.
$params[] = [
'type' => 'select',
'heading' => esc_attr__( 'Separator', 'fusion-builder' ),
'description' => esc_attr__( 'Choose the horizontal separator line style. This will only be used on single column grids or list view.', 'fusion-builder' ),
'param_name' => 'separator_style_type',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'callback' => [
'function' => 'fusion_post_card_separator',
'ajax' => false,
],
'value' => [
'none' => esc_attr__( 'None', 'fusion-builder' ),
'single solid' => esc_attr__( 'Single Border Solid', 'fusion-builder' ),
'double solid' => esc_attr__( 'Double Border Solid', 'fusion-builder' ),
'single|dashed' => esc_attr__( 'Single Border Dashed', 'fusion-builder' ),
'double|dashed' => esc_attr__( 'Double Border Dashed', 'fusion-builder' ),
'single|dotted' => esc_attr__( 'Single Border Dotted', 'fusion-builder' ),
'double|dotted' => esc_attr__( 'Double Border Dotted', 'fusion-builder' ),
],
'default' => 'none',
'dependency' => [
[
'element' => 'layout',
'value' => 'grid',
'operator' => '==',
],
],
];
$params[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Separator Color', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the separator color.', 'fusion-builder' ),
'param_name' => 'separator_sep_color',
'value' => '',
'default' => $fusion_settings->get( 'sep_color' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'callback' => [
'function' => 'fusion_post_card_separator',
'ajax' => false,
],
'dependency' => [
[
'element' => 'layout',
'value' => 'grid',
'operator' => '==',
],
[
'element' => 'separator_style_type',
'value' => 'none',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'dimension',
'remove_from_atts' => true,
'heading' => esc_attr__( 'Separator Width', 'fusion-builder' ),
'param_name' => 'dimensions_width',
'value' => [
'separator_width' => '',
],
'description' => esc_attr__( 'In pixels (px or %), ex: 1px, ex: 50%. Leave blank for full width.', 'fusion-builder' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'callback' => [
'function' => 'fusion_post_card_separator',
'ajax' => false,
],
'dependency' => [
[
'element' => 'layout',
'value' => 'grid',
'operator' => '==',
],
[
'element' => 'separator_style_type',
'value' => 'none',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Separator Alignment', 'fusion-builder' ),
'description' => esc_attr__( 'Select the separator alignment; only works when a width is specified.', 'fusion-builder' ),
'param_name' => 'separator_alignment',
'value' => [
'center' => esc_attr__( 'Center', 'fusion-builder' ),
'left' => esc_attr__( 'Left', 'fusion-builder' ),
'right' => esc_attr__( 'Right', 'fusion-builder' ),
],
'default' => 'center',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'callback' => [
'function' => 'fusion_post_card_separator',
'ajax' => false,
],
'dependency' => [
[
'element' => 'layout',
'value' => 'grid',
'operator' => '==',
],
[
'element' => 'separator_style_type',
'value' => 'none',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'range',
'heading' => esc_attr__( 'Separator Border Size', 'fusion-builder' ),
'param_name' => 'separator_border_size',
'value' => $fusion_settings->get( 'separator_border_size' ),
'min' => '0',
'max' => '50',
'step' => '1',
'description' => esc_attr__( 'In pixels. ', 'fusion-builder' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'callback' => [
'function' => 'fusion_post_card_separator',
'ajax' => false,
],
'dependency' => [
[
'element' => 'layout',
'value' => 'grid',
'operator' => '==',
],
[
'element' => 'separator_style_type',
'value' => 'none',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Autoplay', 'fusion-builder' ),
'description' => esc_attr__( 'Choose to autoplay the items.', 'fusion-builder' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'param_name' => 'autoplay',
'value' => [
'yes' => esc_attr__( 'Yes', 'fusion-builder' ),
'no' => esc_attr__( 'No', 'fusion-builder' ),
],
'default' => 'no',
'dependency' => [
[
'element' => 'layout',
'value' => 'grid',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'masonry',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Loop', 'fusion-builder' ),
'description' => esc_attr__( 'Choose to enable continuous loop mode.', 'fusion-builder' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'param_name' => 'loop',
'value' => [
'yes' => esc_attr__( 'Yes', 'fusion-builder' ),
'no' => esc_attr__( 'No', 'fusion-builder' ),
],
'default' => 'yes',
'dependency' => [
[
'element' => 'layout',
'value' => 'grid',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'masonry',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'range',
'heading' => esc_attr__( 'Scroll Items', 'fusion-builder' ),
'description' => esc_attr__( 'Insert the amount of items to scroll. Leave empty to scroll number of visible items.', 'fusion-builder' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'param_name' => 'scroll_items',
'min' => '1',
'max' => '50',
'step' => '1',
'value' => '0',
'dependency' => [
[
'element' => 'layout',
'value' => 'carousel',
'operator' => '==',
],
],
];
// Navigation section.
$arrows_dependency = [
[
'element' => 'layout',
'value' => 'grid',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'masonry',
'operator' => '!=',
],
[
'element' => 'show_nav',
'value' => 'no',
'operator' => '!=',
],
[
'element' => 'show_nav',
'value' => 'dots',
'operator' => '!=',
],
];
$dots_dependency = [
[
'element' => 'layout',
'value' => 'grid',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'masonry',
'operator' => '!=',
],
[
'element' => 'show_nav',
'value' => 'no',
'operator' => '!=',
],
[
'element' => 'show_nav',
'value' => 'yes',
'operator' => '!=',
],
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Mouse Scroll', 'fusion-builder' ),
'description' => esc_attr__( 'Choose to enable mouse drag control on the carousel.', 'fusion-builder' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'param_name' => 'mouse_scroll',
'value' => [
'yes' => esc_attr__( 'Yes', 'fusion-builder' ),
'no' => esc_attr__( 'No', 'fusion-builder' ),
],
'default' => 'no',
'dependency' => [
[
'element' => 'layout',
'value' => 'grid',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'masonry',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Mouse Pointer', 'fusion-builder' ),
'description' => esc_attr__( 'Choose to enable mouse drag custom cursor.', 'fusion-builder' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'param_name' => 'mouse_pointer',
'value' => [
'default' => esc_attr__( 'Default', 'fusion-builder' ),
'custom' => esc_attr__( 'Custom', 'fusion-builder' ),
],
'default' => 'default',
'dependency' => [
[
'element' => 'layout',
'value' => 'grid',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'masonry',
'operator' => '!=',
],
[
'element' => 'mouse_scroll',
'value' => 'yes',
'operator' => '==',
],
],
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Cursor Color Mode', 'fusion-builder' ),
'description' => esc_attr__( 'Choose cursor color mode.', 'fusion-builder' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'param_name' => 'cursor_color_mode',
'value' => [
'auto' => esc_attr__( 'Automatic', 'fusion-builder' ),
'custom' => esc_attr__( 'Custom Color', 'fusion-builder' ),
],
'default' => 'auto',
'dependency' => [
[
'element' => 'layout',
'value' => 'grid',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'masonry',
'operator' => '!=',
],
[
'element' => 'mouse_scroll',
'value' => 'yes',
'operator' => '==',
],
[
'element' => 'mouse_pointer',
'value' => 'custom',
'operator' => '==',
],
],
];
$params[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Cursor Color', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the color of cursor.', 'fusion-builder' ),
'param_name' => 'cursor_color',
'value' => '',
'default' => '',
'group' => esc_html__( 'Design', 'fusion-builder' ),
'dependency' => [
[
'element' => 'layout',
'value' => 'grid',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'masonry',
'operator' => '!=',
],
[
'element' => 'mouse_scroll',
'value' => 'yes',
'operator' => '==',
],
[
'element' => 'mouse_pointer',
'value' => 'custom',
'operator' => '==',
],
[
'element' => 'cursor_color_mode',
'value' => 'custom',
'operator' => '==',
],
],
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Show Navigation', 'fusion-builder' ),
'description' => esc_attr__( 'Choose to show navigation buttons on the carousel / slider.', 'fusion-builder' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'param_name' => 'show_nav',
'value' => [
'no' => esc_attr__( 'None', 'fusion-builder' ),
'yes' => esc_attr__( 'Arrows', 'fusion-builder' ),
'dots' => esc_attr__( 'Dots', 'fusion-builder' ),
'arrows_dots' => esc_attr__( 'Arrows & Dots', 'fusion-builder' ),
],
'default' => 'yes',
'dependency' => [
[
'element' => 'layout',
'value' => 'grid',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'masonry',
'operator' => '!=',
],
],
];
$params[] = [
'type' => 'dimension',
'heading' => esc_attr__( 'Arrow Box Dimensions', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the width and height of the arrow box. Enter values including any valid CSS unit.', 'fusion-builder' ),
'param_name' => 'arrow_box',
'value' => [
'arrow_box_width' => '',
'arrow_box_height' => '',
],
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => $arrows_dependency,
];
$params[] = [
'type' => 'textfield',
'heading' => esc_attr__( 'Arrow Icon Size', 'fusion-builder' ),
'description' => esc_attr__( 'Set the arrow icon size. Enter value including any valid CSS unit, ex: 14px.', 'fusion-builder' ),
'param_name' => 'arrow_size',
'value' => '',
'default' => '',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => $arrows_dependency,
];
$params[] = [
'type' => 'iconpicker',
'heading' => esc_attr__( 'Previous Icon', 'fusion-builder' ),
'param_name' => 'prev_icon',
'value' => '',
'description' => esc_attr__( 'Click an icon to select, click again to deselect.', 'fusion-builder' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => $arrows_dependency,
];
$params[] = [
'type' => 'iconpicker',
'heading' => esc_attr__( 'Next Icon', 'fusion-builder' ),
'param_name' => 'next_icon',
'value' => '',
'description' => esc_attr__( 'Click an icon to select, click again to deselect.', 'fusion-builder' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => $arrows_dependency,
];
$params[] = [
'type' => 'dimension',
'heading' => esc_attr__( 'Arrow Position', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the position of the arrow. Enter value including any valid CSS unit, ex: 14px.', 'fusion-builder' ),
'param_name' => 'arrow_position',
'value' => [
'arrow_position_horizontal' => '',
'arrow_position_vertical' => '',
],
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => $arrows_dependency,
];
$params[] = [
'type' => 'dimension',
'remove_from_atts' => true,
'heading' => esc_attr__( 'Arrow Border Radius', 'fusion-builder' ),
'description' => __( 'Enter values including any valid CSS unit, ex: 10px.', 'fusion-builder' ),
'param_name' => 'arrow_border_radius',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'value' => [
'arrow_border_radius_top_left' => '',
'arrow_border_radius_top_right' => '',
'arrow_border_radius_bottom_right' => '',
'arrow_border_radius_bottom_left' => '',
],
'dependency' => array_merge( $arrows_dependency ),
];
$params[] = [
'type' => 'subgroup',
'heading' => esc_html__( 'Arrows Styling', 'fusion-builder' ),
'description' => esc_html__( 'Use filters to see specific type of content.', 'fusion-builder' ),
'param_name' => 'arrow_styling',
'default' => 'regular',
'group' => esc_html__( 'Design', 'fusion-builder' ),
'remove_from_atts' => true,
'value' => [
'regular' => esc_html__( 'Regular', 'fusion-builder' ),
'hover' => esc_html__( 'Hover / Active', 'fusion-builder' ),
],
'icons' => [
'regular' => '<span class="fusiona-regular-state" style="font-size:18px;"></span>',
'hover' => '<span class="fusiona-hover-state" style="font-size:18px;"></span>',
],
'dependency' => $arrows_dependency,
];
$params[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Arrow Background Color', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the background color of arrow.', 'fusion-builder' ),
'param_name' => 'arrow_bgcolor',
'value' => '',
'default' => $fusion_settings->get( 'carousel_nav_color' ),
'group' => esc_html__( 'Design', 'fusion-builder' ),
'subgroup' => [
'name' => 'arrow_styling',
'tab' => 'regular',
],
'dependency' => $arrows_dependency,
];
$params[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Arrow Color', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the color of arrow.', 'fusion-builder' ),
'param_name' => 'arrow_color',
'value' => '',
'default' => '#fff',
'group' => esc_html__( 'Design', 'fusion-builder' ),
'subgroup' => [
'name' => 'arrow_styling',
'tab' => 'regular',
],
'dependency' => $arrows_dependency,
];
$params[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Arrow Background Color', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the color of arrow.', 'fusion-builder' ),
'param_name' => 'arrow_hover_bgcolor',
'value' => '',
'default' => $fusion_settings->get( 'carousel_hover_color' ),
'group' => esc_html__( 'Design', 'fusion-builder' ),
'subgroup' => [
'name' => 'arrow_styling',
'tab' => 'hover',
],
'dependency' => $arrows_dependency,
];
$params[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Arrow Color', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the color of arrow.', 'fusion-builder' ),
'param_name' => 'arrow_hover_color',
'value' => '',
'default' => '#fff',
'group' => esc_html__( 'Design', 'fusion-builder' ),
'subgroup' => [
'name' => 'arrow_styling',
'tab' => 'hover',
],
'dependency' => $arrows_dependency,
];
// Dots section.
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Dots Position', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the position of the dots. Enter value including any valid CSS unit, ex: 14px.', 'fusion-builder' ),
'param_name' => 'dots_position',
'value' => [
'above' => esc_attr__( 'Above', 'fusion-builder' ),
'top' => esc_attr__( 'Top', 'fusion-builder' ),
'bottom' => esc_attr__( 'Bottom', 'fusion-builder' ),
'below' => esc_attr__( 'Below', 'fusion-builder' ),
],
'default' => 'bottom',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => $dots_dependency,
];
$params[] = [
'type' => 'range',
'heading' => esc_attr__( 'Dots Spacing', 'fusion-builder' ),
'param_name' => 'dots_spacing',
'value' => '4',
'min' => '0',
'max' => '100',
'step' => '1',
'description' => esc_attr__( 'In pixels. ', 'fusion-builder' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => $dots_dependency,
];
$params[] = [
'type' => 'dimension',
'remove_from_atts' => true,
'heading' => esc_attr__( 'Dots Margin', 'fusion-builder' ),
'description' => esc_attr__( 'In pixels or percentage, ex: 10px or 10%.', 'fusion-builder' ),
'param_name' => 'dots_margin',
'value' => [
'dots_margin_top' => '',
'dots_margin_bottom' => '',
],
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => $dots_dependency,
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Dots Alignment', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the border style of the arrow.', 'fusion-builder' ),
'param_name' => 'dots_align',
'value' => [
'left' => esc_attr__( 'Left', 'fusion-builder' ),
'center' => esc_attr__( 'Center', 'fusion-builder' ),
'right' => esc_attr__( 'Right', 'fusion-builder' ),
],
'default' => 'center',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => $dots_dependency,
];
$params[] = [
'type' => 'subgroup',
'heading' => esc_html__( 'Dots Styling', 'fusion-builder' ),
'description' => esc_html__( 'Use filters to see specific type of content.', 'fusion-builder' ),
'param_name' => 'dots_styling',
'default' => 'regular',
'group' => esc_html__( 'Design', 'fusion-builder' ),
'remove_from_atts' => true,
'value' => [
'regular' => esc_html__( 'Regular', 'fusion-builder' ),
'hover' => esc_html__( 'Active', 'fusion-builder' ),
],
'icons' => [
'regular' => '<span class="fusiona-regular-state" style="font-size:18px;"></span>',
'hover' => '<span class="fusiona-hover-state" style="font-size:18px;"></span>',
],
'dependency' => $dots_dependency,
];
$params[] = [
'type' => 'range',
'heading' => esc_attr__( 'Dots Size', 'fusion-builder' ),
'param_name' => 'dots_size',
'value' => '8',
'min' => '0',
'max' => '100',
'step' => '1',
'description' => esc_attr__( 'In pixels. ', 'fusion-builder' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'subgroup' => [
'name' => 'dots_styling',
'tab' => 'regular',
],
'dependency' => $dots_dependency,
];
$params[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Dots Color', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the color of the dots.', 'fusion-builder' ),
'param_name' => 'dots_color',
'value' => '',
'default' => $fusion_settings->get( 'carousel_hover_color' ),
'group' => esc_html__( 'Design', 'fusion-builder' ),
'subgroup' => [
'name' => 'dots_styling',
'tab' => 'regular',
],
'dependency' => $dots_dependency,
];
$params[] = [
'type' => 'range',
'heading' => esc_attr__( 'Dots Size', 'fusion-builder' ),
'param_name' => 'dots_active_size',
'value' => '8',
'min' => '0',
'max' => '100',
'step' => '1',
'description' => esc_attr__( 'In pixels. ', 'fusion-builder' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'subgroup' => [
'name' => 'dots_styling',
'tab' => 'hover',
],
'dependency' => $dots_dependency,
];
$params[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Dots Color', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the color of the dots.', 'fusion-builder' ),
'param_name' => 'dots_active_color',
'value' => '',
'default' => $fusion_settings->get( 'carousel_nav_color' ),
'group' => esc_html__( 'Design', 'fusion-builder' ),
'subgroup' => [
'name' => 'dots_styling',
'tab' => 'hover',
],
'dependency' => $dots_dependency,
];
$params[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Animation', 'fusion-builder' ),
'description' => esc_attr__( 'Choose for animation style.', 'fusion-builder' ),
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'param_name' => 'slider_animation',
'value' => [
'fade' => esc_attr__( 'Fade', 'fusion-builder' ),
'slide' => esc_attr__( 'Slide', 'fusion-builder' ),
],
'default' => 'fade',
'dependency' => [
[
'element' => 'layout',
'value' => 'slider',
'operator' => '==',
],
[
'element' => 'mouse_scroll',
'value' => 'no',
'operator' => '==',
],
],
];
$params[] = [
'type' => 'dimension',
'remove_from_atts' => true,
'heading' => esc_attr__( 'Margin', 'fusion-builder' ),
'description' => esc_attr__( 'In pixels or percentage, ex: 10px or 10%.', 'fusion-builder' ),
'param_name' => 'margin',
'value' => [
'margin_top' => '',
'margin_right' => '',
'margin_bottom' => '',
'margin_left' => '',
],
'group' => esc_attr__( 'Design', 'fusion-builder' ),
];
$params[] = [
'type' => 'subgroup',
'heading' => esc_html__( 'Load More - Button Styling', 'fusion-builder' ),
'description' => esc_html__( 'Customize "Load More" button colors.', 'fusion-builder' ),
'param_name' => 'load_more_button',
'default' => 'regular',
'group' => esc_html__( 'Design', 'fusion-builder' ),
'remove_from_atts' => true,
'value' => [
'regular' => esc_html__( 'Regular', 'fusion-builder' ),
'active' => esc_html__( 'Active', 'fusion-builder' ),
],
'icons' => [
'regular' => '<span class="fusiona-regular-state" style="font-size:18px;"></span>',
'active' => '<span class="fusiona-hover-state" style="font-size:18px;"></span>',
],
'dependency' => [
[
'element' => 'scrolling',
'value' => 'load_more_button',
'operator' => '==',
],
],
];
$params[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Text Color', 'fusion-builder' ),
'description' => esc_attr__( 'Select the button text color.', 'fusion-builder' ),
'param_name' => 'load_more_btn_color',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'value' => '',
'default' => 'var(--awb-color8)',
'subgroup' => [
'name' => 'load_more_button',
'tab' => 'regular',
],
'dependency' => [
[
'element' => 'scrolling',
'value' => 'load_more_button',
'operator' => '==',
],
],
];
$params[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Background Color', 'fusion-builder' ),
'description' => esc_attr__( 'Select the button background color.', 'fusion-builder' ),
'param_name' => 'load_more_btn_bg_color',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'value' => '',
'default' => 'var(--awb-color3)',
'subgroup' => [
'name' => 'load_more_button',
'tab' => 'regular',
],
'dependency' => [
[
'element' => 'scrolling',
'value' => 'load_more_button',
'operator' => '==',
],
],
];
$params[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Hover Text Color', 'fusion-builder' ),
'description' => esc_attr__( 'Select the button hover text color.', 'fusion-builder' ),
'param_name' => 'load_more_btn_hover_color',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'value' => '',
'default' => 'var(--awb-color1)',
'subgroup' => [
'name' => 'load_more_button',
'tab' => 'active',
],
'dependency' => [
[
'element' => 'scrolling',
'value' => 'load_more_button',
'operator' => '==',
],
],
];
$params[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Hover Background Color', 'fusion-builder' ),
'description' => esc_attr__( 'Select the button hover background color.', 'fusion-builder' ),
'param_name' => 'load_more_btn_hover_bg_color',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'value' => '',
'default' => 'var(--awb-color5)',
'subgroup' => [
'name' => 'load_more_button',
'tab' => 'active',
],
'dependency' => [
[
'element' => 'scrolling',
'value' => 'load_more_button',
'operator' => '==',
],
],
];
$params['fusion_animation_placeholder'] = [
'preview_selector' => '.fusion-post-cards',
'remove_delay_option' => true,
];
$params[] = [
'type' => 'range',
'heading' => esc_attr__( 'Animation Delay', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the delay of animation between each element in a set. In seconds.', 'fusion-builder' ),
'param_name' => 'animation_delay',
'group' => esc_attr__( 'Extras', 'fusion-builder' ),
'min' => '0',
'max' => '1',
'step' => '0.1',
'value' => '0',
'dependency' => [
[
'element' => 'animation_type',
'value' => '',
'operator' => '!=',
],
[
'element' => 'layout',
'value' => 'grid',
'operator' => '==',
],
],
'preview' => [
'selector' => '.fusion-post-cards',
'type' => 'animation',
],
];
fusion_builder_map(
fusion_builder_frontend_data(
'FusionSC_PostCards',
[
'name' => esc_attr__( 'Post Cards', 'fusion-builder' ),
'shortcode' => 'fusion_post_cards',
'icon' => 'fusiona-post-cards-element',
'help_url' => 'https://avada.com/documentation/post-cards-cart-element/',
'params' => $params,
'subparam_map' => [
'separator_width' => 'dimensions_width',
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_post_cards',
'ajax' => true,
],
]
)
);
}
add_action( 'fusion_builder_wp_loaded', 'fusion_element_post_cards' );