File: /var/www/html/triad-infosec/wp-content/plugins/fusion-builder/shortcodes/fusion-news-ticker.php
<?php
/**
* Add an element to fusion-builder.
*
* @package fusion-builder
* @since 3.5
*/
if ( fusion_is_element_enabled( 'fusion_news_ticker' ) ) {
if ( ! class_exists( 'Fusion_News_Ticker' ) && class_exists( 'Fusion_Element' ) ) {
/**
* Shortcode class.
*
* @since 3.5
*/
class Fusion_News_Ticker extends Fusion_Element {
/**
* The number of instance of this element. Working as an id.
*
* @access protected
* @since 3.5
* @var int
*/
protected $element_id = 1;
/**
* Constructor.
*
* @access public
* @since 3.5
*/
public function __construct() {
parent::__construct();
add_shortcode( 'fusion_news_ticker', [ $this, 'render' ] );
add_filter( 'fusion_pipe_seprator_shortcodes', [ $this, 'allow_separator' ] );
add_filter( 'fusion_attr_news-ticker-element', [ $this, 'ticker_attr' ] );
add_filter( 'fusion_attr_news-ticker-title', [ $this, 'ticker_title_attr' ] );
add_filter( 'fusion_attr_news-ticker-bar', [ $this, 'ticker_bar_attr' ] );
add_filter( 'fusion_attr_news-ticker-items-list', [ $this, 'ticker_items_list_attr' ] );
// Ajax mechanism for query related part.
add_action( 'wp_ajax_get_fusion_news_ticker_posts', [ $this, 'ajax_query' ] );
}
/**
* Gets the default values.
*
* @since 3.5
* @return array
*/
public static function get_element_defaults() {
$fusion_settings = awb_get_fusion_settings();
return [
'ticker_title' => '',
'post_type' => 'post',
'pull_by' => '',
'orderby' => 'date',
'order' => 'DESC',
'posts_number' => '7',
'show_date' => 'no',
'date_format' => '',
'ticker_type' => 'marquee',
'ticker_speed' => '75',
'posts_distance' => '',
'separator' => '',
'carousel_display_time' => '6',
'link_target' => '_self',
'hide_on_mobile' => fusion_builder_default_visibility( 'string' ),
'class' => '',
'id' => '',
// Design.
'fusion_font_family_ticker_font' => '',
'fusion_font_variant_ticker_font' => '',
'font_size' => '',
'line_height' => '2.5',
'letter_spacing' => '',
'text_transform' => '',
'ticker_height' => '',
'title_font_color' => '',
'title_background_color' => '',
'title_shape' => 'none',
'ticker_font_color' => '',
'ticker_hover_font_color' => '',
'ticker_background_hover_color' => '',
'ticker_background_color' => '',
'ticker_indicators_color' => '',
'ticker_indicators_hover_color' => '',
'carousel_bar_height' => '3',
'carousel_arrows_style' => 'none',
'carousel_btn_border_radius' => '',
'title_padding_right' => '',
'title_padding_left' => '',
'ticker_padding_right' => '',
'ticker_padding_left' => '',
'btn_padding_top' => '',
'btn_padding_right' => '',
'btn_padding_bottom' => '',
'btn_padding_left' => '',
'margin_top' => '',
'margin_right' => '',
'margin_bottom' => '',
'margin_left' => '',
'border_radius_top_left' => '',
'border_radius_top_right' => '',
'border_radius_bottom_right' => '',
'border_radius_bottom_left' => '',
'box_shadow' => '',
'box_shadow_blur' => '',
'box_shadow_color' => '',
'box_shadow_horizontal' => '',
'box_shadow_spread' => '',
'box_shadow_style' => '',
'box_shadow_vertical' => '',
// Extra.
'animation_direction' => 'left',
'animation_offset' => $fusion_settings->get( 'animation_offset' ),
'animation_speed' => '',
'animation_delay' => '',
'animation_type' => '',
'animation_color' => '',
];
}
/**
* Enables pipe separator for short code.
*
* @since 3.5
* @param array $shortcodes The shortcodes array.
* @return array
*/
public function allow_separator( $shortcodes ) {
if ( is_array( $shortcodes ) ) {
array_push( $shortcodes, 'fusion_news_ticker' );
}
return $shortcodes;
}
/**
* Render the shortcode.
*
* @since 3.5
* @param array $args Shortcode parameters.
* @param string $content Content between shortcode.
* @return string HTML output.
*/
public function render( $args, $content = '' ) {
$this->defaults = self::get_element_defaults();
// We need dynamic defaults for taxonomies.
if ( isset( $args['pull_by'] ) ) {
$this->defaults[ 'dynamic_tax_include_' . $args['pull_by'] ] = '';
$this->defaults[ 'dynamic_tax_exclude_' . $args['pull_by'] ] = '';
}
$this->args = FusionBuilder::set_shortcode_defaults( $this->defaults, $args, 'fusion_news_ticker' );
$html = '';
$html .= '<div ' . FusionBuilder::attributes( 'news-ticker-element' ) . '>';
if ( ! empty( $this->args['ticker_title'] ) ) {
$html .= '<div ' . FusionBuilder::attributes( 'news-ticker-title' ) . '>';
$html .= $this->args['ticker_title'];
if ( 'triangle' === $this->args['title_shape'] ) {
$html .= '<div class="awb-news-ticker-title-decorator awb-news-ticker-title-decorator-triangle"></div>';
}
$html .= '</div>';
}
$html .= '<div ' . FusionBuilder::attributes( 'news-ticker-bar' ) . '>';
$html .= '<div ' . FusionBuilder::attributes( 'news-ticker-items-list' ) . '>';
$html .= $this->get_ticker_items_html( $this->get_ticker_items_query_args() );
$html .= '</div>';
$html .= $this->get_carousel_buttons_if_necessary();
$html .= '</div>';
$html .= '</div>';
$this->element_id++;
$this->on_render();
return $html;
}
/**
* Get the ticker element attributes.
*
* @since 3.5
* @return array
*/
public function ticker_attr() {
$attr = [
'class' => 'awb-news-ticker awb-news-ticker-' . $this->element_id,
'role' => 'marquee',
'style' => $this->get_inline_style(),
];
if ( 'marquee' === $this->args['ticker_type'] ) {
$attr['class'] .= ' awb-news-ticker-marquee';
} elseif ( 'carousel' === $this->args['ticker_type'] ) {
$attr['class'] .= ' awb-news-ticker-carousel';
}
$attr = fusion_builder_visibility_atts( $this->args['hide_on_mobile'], $attr );
if ( $this->args['class'] ) {
$attr['class'] .= ' ' . $this->args['class'];
}
if ( $this->args['id'] ) {
$attr['id'] = $this->args['id'];
}
if ( $this->args['animation_type'] ) {
$attr = Fusion_Builder_Animation_Helper::add_animation_attributes( $this->args, $attr );
}
return $attr;
}
/**
* Get the ticker title attributes.
*
* @since 3.5
* @return array
*/
public function ticker_title_attr() {
$attr = [
'class' => 'awb-news-ticker-title',
];
if ( 'rounded' === $this->args['title_shape'] ) {
$attr['class'] .= ' awb-news-ticker-title-rounded';
}
return $attr;
}
/**
* Get the ticker bar attributes.
*
* @since 3.5
* @return array
*/
public function ticker_bar_attr() {
$attr = [
'class' => 'awb-news-ticker-bar',
];
if ( 'marquee' === $this->args['ticker_type'] ) {
$attr['class'] .= ' awb-news-ticker-bar-marquee';
} elseif ( 'carousel' === $this->args['ticker_type'] ) {
$attr['class'] .= ' awb-news-ticker-bar-carousel';
}
return $attr;
}
/**
* Get the attributes for the ticker items wrapper.
*
* @since 3.5
* @return array
*/
public function ticker_items_list_attr() {
$attr = [
'class' => 'awb-news-ticker-item-list',
];
if ( 'marquee' === $this->args['ticker_type'] ) {
$attr['class'] .= ' awb-news-ticker-item-list-run';
$attr['data-awb-ticker-speed'] = $this->args['ticker_speed'];
} elseif ( 'carousel' === $this->args['ticker_type'] ) {
$attr['class'] .= ' awb-news-ticker-item-list-carousel';
$attr['data-awb-news-ticker-display-time'] = $this->args['carousel_display_time'];
}
return $attr;
}
/**
* Get the inline style.
*
* @since 3.5
* @return string
*/
public function get_inline_style() {
$css_vars_options = [
'font_size',
'letter_spacing',
'text_transform',
'ticker_height',
'title_font_color',
'title_background_color',
'ticker_font_color',
'ticker_hover_font_color',
'ticker_background_color',
'ticker_background_hover_color',
'ticker_indicators_color',
'ticker_indicators_hover_color',
'title_padding_right',
'title_padding_left',
'carousel_btn_border_radius',
'btn_padding_top',
'btn_padding_right',
'btn_padding_bottom',
'btn_padding_left',
'ticker_padding_right',
'ticker_padding_left',
'margin_top',
'margin_right',
'margin_bottom',
'margin_left',
'border_radius_top_left',
'border_radius_top_right',
'border_radius_bottom_right',
'border_radius_bottom_left',
];
if ( $this->args['line_height'] ) {
$css_vars_options [] = 'line_height';
}
$custom_vars = [];
$typography = Fusion_Builder_Element_Helper::get_font_styling( $this->args, 'ticker_font', 'array' );
foreach ( $typography as $rule => $value ) {
$custom_vars[ $rule ] = $value;
}
if ( ! $this->is_default( 'carousel_bar_height' ) ) {
$custom_vars['carousel_bar_height'] = $this->args['carousel_bar_height'] . 'px';
}
// Increase padding a little on triangle shape.
if ( 'carousel' === $this->args['ticker_type'] && 'triangle' === $this->args['title_shape'] ) {
if ( ! is_rtl() && $this->is_default( 'ticker_padding_left' ) ) {
$custom_vars['ticker_padding_left'] = '17px';
} elseif ( $this->is_default( 'ticker_padding_right' ) ) {
$custom_vars['ticker_padding_right'] = '17px';
}
}
if ( ! $this->is_default( 'carousel_display_time' ) ) {
$custom_vars['carousel_display_time'] = $this->args['carousel_display_time'] . 's';
}
if ( $this->args['posts_distance'] && 'marquee' === $this->args['ticker_type'] ) {
$custom_vars['posts_distance'] = round( $this->args['posts_distance'] / 2, 1 ) . 'px';
}
$box_shadow = Fusion_Builder_Box_Shadow_Helper::get_box_shadow_css_var(
'--awb-box-shadow',
[
'box_shadow' => $this->args['box_shadow'],
'box_shadow_horizontal' => $this->args['box_shadow_horizontal'],
'box_shadow_vertical' => $this->args['box_shadow_vertical'],
'box_shadow_blur' => $this->args['box_shadow_blur'],
'box_shadow_spread' => $this->args['box_shadow_spread'],
'box_shadow_color' => $this->args['box_shadow_color'],
'box_shadow_style' => $this->args['box_shadow_style'],
]
);
return $this->get_css_vars_for_options( $css_vars_options ) . $this->get_custom_css_vars( $custom_vars ) . $box_shadow;
}
/**
* Get the query arguments for ticker items.
*
* @since 3.5
* @param array $args Other arguments, that will replace $this->args.
* @return array
*/
public function get_ticker_items_query_args( $args = null ) {
if ( null === $args ) {
$args = $this->args;
}
$posts_options = [];
// Post Type Argument.
$post_type = 'post';
if ( $args['post_type'] ) {
$post_type = $args['post_type'];
}
$posts_options['post_type'] = $post_type;
// Number of posts argument.
$number_of_posts = 7;
if ( $args['posts_number'] && is_numeric( $args['posts_number'] ) ) {
$number_of_posts = $args['posts_number'];
}
$posts_options['posts_per_page'] = $number_of_posts;
// Order & orderby.
if ( ! empty( $args['orderby'] ) && 'upcoming_event' !== $args['orderby'] ) {
$posts_options['orderby'] = $args['orderby'];
if ( ! empty( $args['order'] ) ) {
$posts_options['order'] = $args['order'];
}
}
$posts_options = array_merge( $posts_options, $this->get_posts_taxonomy_filters( $args ) );
return apply_filters( 'awb_news_ticker_posts_options', $posts_options, $this->element_id );
}
/**
* Returns an array that contains the taxonomy arguments, ready to be merged with the wp query array.
*
* @since 3.5
* @param array $args The arguments.
* @return array
*/
private function get_posts_taxonomy_filters( $args ) {
$post_type = $args['post_type'];
$taxonomy = $args['pull_by'];
$wp_query = [];
if ( 'all' === $taxonomy || empty( $taxonomy ) || empty( $post_type ) ) {
return $wp_query;
}
// Return if taxonomy does not exist in the post type.
$post_type_taxonomies = get_object_taxonomies( $post_type, 'objects' );
if ( ! isset( $post_type_taxonomies[ $taxonomy ] ) ) {
return $wp_query;
}
$include_query_args = [];
$exclude_query_args = [];
if ( ! empty( $args[ 'dynamic_tax_include_' . $taxonomy ] ) ) {
$include_query_args = [
[
'taxonomy' => $taxonomy,
'terms' => explode( ',', $args[ 'dynamic_tax_include_' . $taxonomy ] ),
'include_children' => true,
],
];
}
if ( ! empty( $args[ 'dynamic_tax_exclude_' . $taxonomy ] ) ) {
$exclude_query_args = [
'taxonomy' => $taxonomy,
'terms' => explode( ',', $args[ 'dynamic_tax_exclude_' . $taxonomy ] ),
'include_children' => true,
'operator' => 'NOT IN',
];
}
$tax_query = [];
if ( ! empty( $include_query_args ) && ! empty( $exclude_query_args ) ) {
$tax_query['relation'] = 'AND';
array_push( $tax_query, $include_query_args );
array_push( $tax_query, $exclude_query_args );
} elseif ( ! empty( $include_query_args ) ) {
array_push( $tax_query, $include_query_args );
} elseif ( ! empty( $exclude_query_args ) ) {
array_push( $tax_query, $exclude_query_args );
}
if ( ! empty( $tax_query ) ) {
// phpcs:ignore WordPress.DB.SlowDBQuery
$wp_query['tax_query'] = $tax_query;
}
return $wp_query;
}
/**
* Get the HTML of ticker items.
*
* @since 3.5
* @param array $query_args Wp_Query arguments to retrieve the posts.
* @param array $args Other arguments, that will replace $this->args.
* @return string
*/
public function get_ticker_items_html( $query_args, $args = null ) {
if ( null === $args ) {
$args = $this->args;
}
$query_needs_custom_event_calendar_function = 'tribe_events' === $args['post_type'] && function_exists( 'tribe_get_events' ) && 'upcoming_events' === $args['orderby'];
if ( $query_needs_custom_event_calendar_function ) {
$query_args['ends_after'] = 'now';
$query_args['orderby'] = 'event_date';
$query_args['order'] = 'ASC';
$ticker_posts = tribe_get_events( $query_args );
} else {
$ticker_posts = get_posts( $query_args );
}
$separator = '';
if ( $args['separator'] ) {
$separator = $args['separator'];
}
$html = '';
$displayed_posts_num = count( $ticker_posts );
$carousel_mode = ( 'carousel' === $args['ticker_type'] ? true : false );
$display_separator = ( ! $carousel_mode );
$link_target = ( '_blank' === $args['link_target'] ? ' target="_blank"' : '' );
foreach ( $ticker_posts as $index => $ticker_post ) {
$additional_item_class = '';
if ( 0 === $index && $carousel_mode ) {
$additional_item_class = ' awb-news-ticker-item-active';
}
$text = get_the_title( $ticker_post );
if ( 'yes' === $args['show_date'] ) {
$date_format = 'M j: ';
if ( $args['date_format'] ) {
$date_format = $args['date_format'];
}
if ( get_post_type( $ticker_post ) === 'tribe_events' && function_exists( 'tribe_get_start_date' ) ) {
$date_text = tribe_get_start_date( $ticker_post, false, $date_format );
} else {
$date_text = get_the_date( $date_format, $ticker_post );
}
$text = '<span class="awb-news-ticker-title-date">' . $date_text . '</span>' . $text;
}
$html .= '<div class="awb-news-ticker-item' . $additional_item_class . '">';
$html .= '<a class="awb-news-ticker-link" href="' . get_the_permalink( $ticker_post ) . '"' . $link_target . '>' . $text . '</a>';
$html .= '</div>';
$is_last_item = ( ( $displayed_posts_num - 1 ) === $index ? true : false );
if ( $display_separator && ! $is_last_item ) {
$html .= '<div class="awb-news-ticker-item-separator">' . $separator . '</div>';
}
}
return $html;
}
/**
* Gets the query data.
*
* @since 3.5
* @param array $defaults An array of defaults.
* @return void
*/
public function ajax_query( $defaults ) {
check_ajax_referer( 'fusion_load_nonce', 'fusion_load_nonce' );
// From Ajax Request.
if ( isset( $_POST['model'] ) && ! apply_filters( 'fusion_builder_live_request', false ) ) { // phpcs:ignore WordPress.Security.NonceVerification
$args = wp_unslash( $_POST['model']['params'] ); // phpcs:ignore WordPress.Security
$defaults = self::get_element_defaults();
// We need dynamic defaults for taxonomies.
if ( isset( $args['pull_by'] ) ) {
$defaults[ 'dynamic_tax_include_' . $args['pull_by'] ] = '';
$defaults[ 'dynamic_tax_exclude_' . $args['pull_by'] ] = '';
}
$args = FusionBuilder::set_shortcode_defaults( $defaults, $args, 'fusion_news_ticker' );
add_filter( 'fusion_builder_live_request', '__return_true' );
}
$query_args = $this->get_ticker_items_query_args( $args );
echo wp_json_encode( $this->get_ticker_items_html( $query_args, $args ) );
wp_die();
}
/**
* Get the carousel buttons HTML if necessary.
*
* @return string
*/
private function get_carousel_buttons_if_necessary() {
$html = '';
if ( 'carousel' === $this->args['ticker_type'] ) {
$additional_btn_classes = '';
if ( 'border' === $this->args['carousel_arrows_style'] ) {
$additional_btn_classes = ' awb-news-ticker-btn-border';
}
$previous_aria_label = esc_attr__( 'Previous', 'fusion-builder' );
$next_aria_label = esc_attr__( 'Next', 'fusion-builder' );
$html .= '<div class="awb-news-ticker-items-buttons">';
$html .= '<div class="awb-news-ticker-btn-wrapper"><button class="awb-news-ticker-prev-btn' . $additional_btn_classes . '" aria-label="' . $previous_aria_label . '"><span class="awb-news-ticker-btn-arrow"></span></button></div>';
$html .= '<div class="awb-news-ticker-btn-wrapper"><button class="awb-news-ticker-next-btn' . $additional_btn_classes . '" aria-label="' . $next_aria_label . '"><span class="awb-news-ticker-btn-arrow"></span></button></div>';
$html .= '</div>';
$html .= '<div class="awb-news-ticker-carousel-indicator"></div>';
}
return $html;
}
/**
* Used to set any other variables for use on front-end editor template.
*
* @since 3.5
* @return array
*/
public static function get_element_extras() {
return [
'is_rtl' => is_rtl(),
];
}
/**
* Load base CSS.
*
* @since 3.5
*/
public function add_css_files() {
FusionBuilder()->add_element_css( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/shortcodes/news-ticker.min.css' );
}
/**
* Sets the necessary scripts.
*
* @since 3.5
* @return void
*/
public function on_first_render() {
Fusion_Dynamic_JS::enqueue_script(
'fusion-news-ticker',
FusionBuilder::$js_folder_url . '/general/fusion-news-ticker.js',
FusionBuilder::$js_folder_path . '/general/fusion-news-ticker.js',
[ 'jquery' ],
FUSION_BUILDER_VERSION,
true
);
}
}
}
new Fusion_News_Ticker();
}
/**
* Map shortcode to Fusion Builder
*
* @since 3.5
*/
function fusion_news_ticker_map() {
fusion_builder_map(
fusion_builder_frontend_data(
// Class reference.
'Fusion_News_Ticker',
[
'name' => esc_attr__( 'News Ticker', 'fusion-builder' ),
'shortcode' => 'fusion_news_ticker',
'icon' => 'fusiona-af-text',
'params' => fusion_news_ticker_get_param_settings(),
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_news_ticker_posts',
'ajax' => true,
],
]
)
);
}
add_action( 'fusion_builder_wp_loaded', 'fusion_news_ticker_map' );
/**
* Get the shortcode param settings.
*
* @return array
*/
function fusion_news_ticker_get_param_settings() {
$builder_status = function_exists( 'is_fusion_editor' ) && is_fusion_editor();
$php_date_format_link = '<a href="' . esc_url( 'https://www.php.net/manual/en/datetime.format.php' ) . '">' . esc_html__( 'link', 'fusion-builder' ) . '</a>';
$post_types = $builder_status ? awb_get_post_types() : [];
$param = [];
$param[] = [
'type' => 'textfield',
'heading' => esc_attr__( 'Ticker Title', 'fusion-builder' ),
'description' => esc_attr__( 'Set the ticker title.', 'fusion-builder' ),
'param_name' => 'ticker_title',
];
$param[] = [
'type' => 'select',
'heading' => esc_attr__( 'Posts Type', 'fusion-builder' ),
'description' => esc_attr__( 'Select the type of posts displayed in the ticker.', 'fusion-builder' ),
'param_name' => 'post_type',
'default' => 'post',
'value' => $post_types,
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_news_ticker_posts',
'ajax' => true,
],
];
$param = array_merge( $param, fusion_news_ticker_get_taxonomies_settings() );
$param = array_merge( $param, fusion_news_ticker_get_order_by_settings() );
$param[] = [
'type' => 'range',
'heading' => esc_attr__( 'Number Of Posts', 'fusion-builder' ),
'description' => esc_attr__( 'Select the maximum number of posts to be displayed in the ticker.', 'fusion-builder' ),
'param_name' => 'posts_number',
'value' => '7',
'min' => '3',
'max' => '15',
'step' => '1',
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_news_ticker_posts',
'ajax' => true,
],
];
$param[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Show Date', 'fusion-builder' ),
'description' => esc_attr__( 'Select whether or not to show the date before the post.', 'fusion-builder' ),
'param_name' => 'show_date',
'default' => 'no',
'value' => [
'yes' => esc_attr__( 'Yes', 'fusion-builder' ),
'no' => esc_attr__( 'No', 'fusion-builder' ),
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_news_ticker_posts',
'ajax' => true,
],
];
$param[] = [
'type' => 'textfield',
'heading' => esc_attr__( 'Date Format', 'fusion-builder' ),
/* translators: %s: a link. */
'description' => sprintf( esc_attr__( 'Select the date format, including the separator. By default "M j: ". You can find a list of date format placeholders here: %s.', 'fusion-builder' ), $php_date_format_link ),
'param_name' => 'date_format',
'value' => '',
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_news_ticker_posts',
'ajax' => true,
],
'dependency' => [
[
'element' => 'show_date',
'value' => 'yes',
'operator' => '==',
],
],
];
$param[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Ticker Type', 'fusion-builder' ),
'description' => esc_attr__( 'Select the ticker type to display posts.', 'fusion-builder' ),
'param_name' => 'ticker_type',
'default' => 'marquee',
'value' => [
'marquee' => esc_attr__( 'Running Ticker', 'fusion-builder' ),
'carousel' => esc_attr__( 'One At A Time', 'fusion-builder' ),
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_news_ticker_posts',
'ajax' => true,
],
];
$param[] = [
'type' => 'range',
'heading' => esc_attr__( 'Ticker Speed', 'fusion-builder' ),
'description' => esc_attr__( 'Select the ticker speed, in pixels per second.', 'fusion-builder' ),
'param_name' => 'ticker_speed',
'value' => '75',
'min' => '50',
'max' => '150',
'step' => '1',
'dependency' => [
[
'element' => 'ticker_type',
'value' => 'marquee',
'operator' => '==',
],
],
];
$param[] = [
'type' => 'range',
'heading' => esc_attr__( 'Distance Between Posts', 'fusion-builder' ),
'description' => esc_attr__( 'Select the distance between posts.', 'fusion-builder' ),
'param_name' => 'posts_distance',
'value' => '50',
'min' => '25',
'max' => '200',
'step' => '1',
'dependency' => [
[
'element' => 'ticker_type',
'value' => 'marquee',
'operator' => '==',
],
],
];
$param[] = [
'type' => 'textfield',
'heading' => esc_attr__( 'Separator', 'fusion-builder' ),
'description' => esc_attr__( 'Enter the separator text between the posts.', 'fusion-builder' ),
'param_name' => 'separator',
'value' => '',
'dependency' => [
[
'element' => 'ticker_type',
'value' => 'marquee',
'operator' => '==',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_news_ticker_posts',
'ajax' => true,
],
];
$param[] = [
'type' => 'range',
'heading' => esc_attr__( 'Display Duration', 'fusion-builder' ),
'description' => esc_attr__( 'Select how much time a post should be displayed, before switching to the next post. In seconds.', 'fusion-builder' ),
'param_name' => 'carousel_display_time',
'value' => '6',
'min' => '0.1',
'max' => '20',
'step' => '0.1',
'dependency' => [
[
'element' => 'ticker_type',
'value' => 'carousel',
'operator' => '==',
],
],
];
$param[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Link Target', 'fusion-builder' ),
'description' => esc_html__( 'Controls how the link will open.', 'fusion-builder' ),
'param_name' => 'link_target',
'value' => [
'_self' => esc_html__( 'Same Window/Tab', 'fusion-builder' ),
'_blank' => esc_html__( 'New Window/Tab', 'fusion-builder' ),
],
'default' => '_self',
];
$param[] = [
'type' => 'checkbox_button_set',
'heading' => esc_attr__( 'Element Visibility', 'fusion-builder' ),
'description' => esc_html__( 'Choose to show or hide the element on small, medium or large screens. You can choose more than one at a time.', 'fusion-builder' ),
'param_name' => 'hide_on_mobile',
'value' => fusion_builder_visibility_options( 'full' ),
'default' => fusion_builder_default_visibility( 'array' ),
];
$param[] = [
'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' => '',
];
$param[] = [
'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' => '',
];
// Design.
$param[] = [
'type' => 'typography',
'remove_from_atts' => true,
'global' => true,
'heading' => esc_attr__( 'Typography', 'fusion-builder' ),
'description' => esc_html__( 'Controls the typography.', 'fusion-builder' ),
'param_name' => 'ticker_typography',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'choices' => [
'font-family' => 'ticker_font',
'font-size' => 'font_size',
'line-height' => 'line_height',
'letter-spacing' => 'letter_spacing',
'text-transform' => 'text_transform',
],
'default' => [
'font-family' => '',
'variant' => '',
'font-size' => '',
'line-height' => '2.5',
'letter-spacing' => '',
'text-transform' => '',
],
];
$param[] = [
'type' => 'textfield',
'heading' => esc_attr__( 'Height', 'fusion-builder' ),
'description' => esc_attr__( 'Enter value including any valid CSS unit, ex: 20px. The height can also be changed only from typography line-height setting, and needs to be higher than computed value of line-height.', 'fusion-builder' ),
'param_name' => 'ticker_height',
'value' => '',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
];
$param[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Title Font Color', 'fusion-builder' ),
'description' => esc_attr__( 'Select the font color of the title.', 'fusion-builder' ),
'param_name' => 'title_font_color',
'value' => '',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
];
$param[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Title Background Color', 'fusion-builder' ),
'description' => esc_attr__( 'Select the background color of the title.', 'fusion-builder' ),
'param_name' => 'title_background_color',
'value' => '',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
];
$param[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Title Shape', 'fusion-builder' ),
'description' => esc_attr__( 'Select the title shape.', 'fusion-builder' ),
'param_name' => 'title_shape',
'default' => 'none',
'value' => [
'none' => esc_attr__( 'None', 'fusion-builder' ),
'rounded' => esc_attr__( 'Rounded', 'fusion-builder' ),
'triangle' => esc_attr__( 'Triangle', 'fusion-builder' ),
],
'group' => esc_attr__( 'Design', 'fusion-builder' ),
];
$param[] = [
'type' => 'dimension',
'remove_from_atts' => true,
'heading' => esc_attr__( 'Title Padding', 'fusion-builder' ),
'description' => esc_attr__( 'Enter padding for the title.', 'fusion-builder' ),
'param_name' => 'title_padding',
'group' => esc_html__( 'Design', 'fusion-builder' ),
'value' => [
'title_padding_left' => '',
'title_padding_right' => '',
],
];
$param[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Ticker Font Color', 'fusion-builder' ),
'description' => esc_attr__( 'Select the font color of the ticker.', 'fusion-builder' ),
'param_name' => 'ticker_font_color',
'value' => '',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'states' => [
'hover' => [
'label' => __( 'Hover', 'fusion-builder' ),
'param_name' => 'ticker_hover_font_color',
'preview' => [
'selector' => '.awb-news-ticker-link',
'type' => 'class',
'toggle' => 'hover',
],
],
],
'connect-state' => [ 'ticker_background_color', 'ticker_indicators_color' ],
];
$param[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Ticker Background Color', 'fusion-builder' ),
'description' => esc_attr__( 'Select the background color of the ticker.', 'fusion-builder' ),
'param_name' => 'ticker_background_color',
'value' => '',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'states' => [
'hover' => [
'label' => __( 'Hover', 'fusion-builder' ),
'param_name' => 'ticker_background_hover_color',
'preview' => [
'selector' => '.awb-news-ticker',
'type' => 'class',
'toggle' => 'hover',
],
],
],
'connect-state' => [ 'ticker_font_color', 'ticker_indicators_color' ],
];
$param[] = [
'type' => 'colorpickeralpha',
'heading' => esc_attr__( 'Ticker Indicators Color', 'fusion-builder' ),
'description' => esc_attr__( 'Select the color of the ticker indicators and next/previous arrows.', 'fusion-builder' ),
'param_name' => 'ticker_indicators_color',
'value' => '',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => [
[
'element' => 'ticker_type',
'value' => 'carousel',
'operator' => '==',
],
],
'states' => [
'hover' => [
'label' => __( 'Hover', 'fusion-builder' ),
'param_name' => 'ticker_indicators_hover_color',
'preview' => [
'selector' => '.awb-news-ticker-next-btn, .awb-news-ticker-prev-btn',
'type' => 'class',
'toggle' => 'hover',
],
],
],
'connect-state' => [ 'ticker_background_color', 'ticker_font_color' ],
];
$param[] = [
'type' => 'range',
'heading' => esc_attr__( 'Progress Indicator Bar Height', 'fusion-builder' ),
'description' => esc_attr__( 'Select the height of the indicator bar.', 'fusion-builder' ),
'param_name' => 'carousel_bar_height',
'value' => '3',
'min' => '1',
'max' => '10',
'step' => '1',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => [
[
'element' => 'ticker_type',
'value' => 'carousel',
'operator' => '==',
],
],
];
$param[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Previous/Next Arrows Style', 'fusion-builder' ),
'description' => esc_attr__( 'Select the style of the carousel arrows.', 'fusion-builder' ),
'param_name' => 'carousel_arrows_style',
'default' => 'none',
'value' => [
'none' => esc_attr__( 'Normal', 'fusion-builder' ),
'border' => esc_attr__( 'Bordered', 'fusion-builder' ),
],
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => [
[
'element' => 'ticker_type',
'value' => 'carousel',
'operator' => '==',
],
],
];
$param[] = [
'type' => 'dimension',
'remove_from_atts' => true,
'heading' => esc_attr__( 'Arrow Buttons Padding', 'fusion-builder' ),
'description' => esc_attr__( 'In pixels or percentage, ex: 10px or 10%. You can see the padding, by triggering bordering arrow style in the upper setting.', 'fusion-builder' ),
'param_name' => 'button_padding',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'value' => [
'btn_padding_top' => '',
'btn_padding_right' => '',
'btn_padding_bottom' => '',
'btn_padding_left' => '',
],
'dependency' => [
[
'element' => 'ticker_type',
'value' => 'carousel',
'operator' => '==',
],
],
];
$param[] = [
'type' => 'textfield',
'heading' => esc_attr__( 'Arrows Border Radius', 'fusion-builder' ),
'description' => esc_attr__( 'Enter value including any valid CSS unit, ex: 20px, or 50% to be perfectly rounded.', 'fusion-builder' ),
'param_name' => 'carousel_btn_border_radius',
'value' => '',
'group' => esc_attr__( 'Design', 'fusion-builder' ),
'dependency' => [
[
'element' => 'ticker_type',
'value' => 'carousel',
'operator' => '==',
],
[
'element' => 'carousel_arrows_style',
'value' => 'border',
'operator' => '==',
],
],
];
$param[] = [
'type' => 'dimension',
'remove_from_atts' => true,
'heading' => esc_attr__( 'Ticker Padding', 'fusion-builder' ),
'description' => esc_attr__( 'Controls the padding of the ticker.', 'fusion-builder' ),
'param_name' => 'ticker_padding',
'group' => esc_html__( 'Design', 'fusion-builder' ),
'value' => [
'ticker_padding_left' => '',
'ticker_padding_right' => '',
],
'dependency' => [
[
'element' => 'ticker_type',
'value' => 'carousel',
'operator' => '==',
],
],
];
$param['fusion_margin_placeholder'] = [
'param_name' => 'margin',
'heading' => esc_attr__( 'Element Margin', 'fusion-builder' ),
'value' => [
'margin_top' => '',
'margin_right' => '',
'margin_bottom' => '',
'margin_left' => '',
],
];
$param['fusion_border_radius_placeholder'] = [
'heading' => esc_attr__( 'Element Border Radius', 'fusion-builder' ),
];
$param['fusion_box_shadow_placeholder'] = [];
$param['fusion_animation_placeholder'] = [
'preview_selector' => '.awb-news-ticker',
];
return $param;
}
/**
* Create the dynamic shortcode settings for categories and tags.
*
* @return array
*/
function fusion_news_ticker_get_taxonomies_settings() {
$builder_status = function_exists( 'is_fusion_editor' ) && is_fusion_editor();
$post_types = $builder_status ? awb_get_post_types() : [];
$settings = [];
$taxonomy_map = [];
$post_taxonomies = [];
if ( is_array( $post_types ) ) {
foreach ( $post_types as $post_type => $post_type_label ) {
$new_taxonomies = get_object_taxonomies( $post_type, 'objects' );
$taxonomy_map[ $post_type ] = [ 'all' ];
foreach ( $new_taxonomies as $new_taxonomy ) {
$post_taxonomies[ $new_taxonomy->name ] = $new_taxonomy;
$taxonomy_map[ $post_type ][] = $new_taxonomy->name;
}
}
}
$taxonomy_options = [
'all' => esc_html__( 'All', 'fusion-builder' ),
];
foreach ( $post_taxonomies as $taxonomy ) {
$taxonomy_options[ $taxonomy->name ] = ucwords( esc_html( $taxonomy->label ) );
}
$settings [] = [
'type' => 'select',
'heading' => esc_attr__( 'Pull Posts By', 'fusion-builder' ),
'description' => esc_attr__( 'Choose the taxonomy to pull posts by.', 'fusion-builder' ),
'param_name' => 'pull_by',
'default' => 'all',
'value' => $taxonomy_options,
'conditions' => [
'option' => 'post_type',
'map' => $taxonomy_map,
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_news_ticker_posts',
'ajax' => true,
],
];
// Foreach taxonomy, add 2 options, one to include terms, and one to exclude.
foreach ( $taxonomy_options as $taxonomy_name => $taxonomy_label ) {
if ( 'all' === $taxonomy_name ) {
continue;
}
$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' => true,
]
);
// All terms.
foreach ( $terms as $term ) {
$selection[ $term->term_id ] = $term->name;
}
}
$settings [] = [
'type' => $field_type,
/* translators: %s - a taxonomy name. */
'heading' => sprintf( esc_html__( 'Include %s', 'fusion-builder' ), $taxonomy_label ),
'description' => esc_html__( 'Select the taxonomies to include, or leave blank for all. If the taxonomy is hierarchical, it will also include posts within children taxonomy.', 'fusion-builder' ),
'placeholder' => ucwords( $taxonomy_label ),
'param_name' => 'dynamic_tax_include_' . $taxonomy_name,
'value' => $selection,
'default' => '',
'ajax' => $ajax,
'ajax_params' => $ajax_params,
'dependency' => [
[
'element' => 'pull_by',
'value' => $taxonomy_name,
'operator' => '==',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_news_ticker_posts',
'ajax' => true,
],
];
$settings [] = [
'type' => $field_type,
/* translators: %s - a taxonomy name. */
'heading' => sprintf( esc_html__( 'Exclude %s', 'fusion-builder' ), $taxonomy_label ),
'description' => esc_html__( 'Select the taxonomies to exclude, or leave blank for none. If the taxonomy is hierarchical, it will also exclude posts within children taxonomy.', 'fusion-builder' ),
'placeholder' => ucwords( $taxonomy_label ),
'param_name' => 'dynamic_tax_exclude_' . $taxonomy_name,
'value' => $selection,
'default' => '',
'ajax' => $ajax,
'ajax_params' => $ajax_params,
'dependency' => [
[
'element' => 'pull_by',
'value' => $taxonomy_name,
'operator' => '==',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_news_ticker_posts',
'ajax' => true,
],
];
}
return $settings;
}
/**
* Get the orderby settings.
*
* @since 3.5
* @return array
*/
function fusion_news_ticker_get_order_by_settings() {
$settings = [];
$builder_status = function_exists( 'is_fusion_editor' ) && is_fusion_editor();
$post_types = $builder_status ? awb_get_post_types() : [];
$normal_posts_orderby = [
'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' ),
'comment_count' => esc_attr__( 'Number of Comments', 'fusion-builder' ),
'modified' => esc_attr__( 'Last Modified', 'fusion-builder' ),
'rand' => esc_attr__( 'Random', 'fusion-builder' ),
];
$normal_posts_orderby_keys = array_keys( $normal_posts_orderby );
$additional_event_posts_orderby = [
'upcoming_events' => esc_attr__( 'Upcoming Events', 'fusion-builder' ),
];
$additional_event_posts_orderby_keys = array_keys( $additional_event_posts_orderby );
$conditions_map = [];
foreach ( $post_types as $post_type => $post_type_label ) {
if ( 'tribe_events' === $post_type ) {
$conditions_map[ $post_type ] = array_merge( $additional_event_posts_orderby_keys, $normal_posts_orderby_keys );
} else {
$conditions_map[ $post_type ] = $normal_posts_orderby_keys;
}
}
$settings[] = [
'type' => 'select',
'heading' => esc_attr__( 'Order By', 'fusion-builder' ),
'description' => esc_attr__( 'Defines how posts should be ordered. Note that custom post types like "Events", can have additionally ordering choices.', 'fusion-builder' ),
'param_name' => 'orderby',
'default' => 'date',
'conditions' => [
'option' => 'post_type',
'map' => $conditions_map,
],
'value' => array_merge( $additional_event_posts_orderby, $normal_posts_orderby ),
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_news_ticker_posts',
'ajax' => true,
],
];
$settings[] = [
'type' => 'radio_button_set',
'heading' => esc_attr__( 'Order', 'fusion-builder' ),
'description' => esc_attr__( 'Define 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' => 'orderby',
'value' => 'upcoming_events',
'operator' => '!=',
],
],
'callback' => [
'function' => 'fusion_ajax',
'action' => 'get_fusion_news_ticker_posts',
'ajax' => true,
],
];
return $settings;
}