38217-vm/wp-content/plugins/fusion-builder/inc/class-awb-off-canvas-front-end.php
2026-02-05 17:08:59 +03:00

1226 lines
37 KiB
PHP

<?php
/**
* Off Canvas Front End class.
*
* @author ThemeFusion
* @copyright (c) Copyright by ThemeFusion
* @link https://avada.com
* @package Fusion-Builder
* @since 3.6
*/
/**
* Adds Off Canvas feature.
*/
class AWB_Off_Canvas_Front_End extends AWB_Layout_Conditions {
/**
* The one, true instance of this object.
*
* @static
* @access private
* @since 3.6
* @var object
*/
private static $instance;
/**
* Off Canvas post type handle.
*
* @access private
* @since 3.6
* @var string
*/
private $post_type = 'awb_off_canvas';
/**
* Current page off canvases array.
*
* @access public
* @since 3.6
* @var array
*/
public static $current = [];
/**
* The class constructor.
*
* @access private
* @since 3.6
* @return void
*/
private function __construct() {
if ( ! apply_filters( 'fusion_load_off_canvas', true ) || false === self::is_enabled() || fusion_is_preview_frame() || fusion_is_builder_frame() ) {
return;
}
add_action( 'wp_footer', [ $this, 'insert' ], 0 ); // Set priority to 0 for rendering before the js compiler.
add_action( 'wp_enqueue_scripts', [ $this, 'scripts' ] );
add_action( 'wp_enqueue_scripts', [ $this, 'styles' ] );
}
/**
* Get page options.
*
* @access public
* @since 3.6
* @param String $id off canvas ID.
* @return Array Page options array.
*/
public static function get_options( $id ) {
$fusion_settings = awb_get_fusion_settings();
$options = wp_parse_args(
(array) fusion_data()->post_meta( $id )->get_all_meta(),
[
// General.
'type' => 'popup',
'width' => '',
'width_medium' => '',
'width_small' => '',
'height' => 'fit',
'custom_height' => '',
'custom_height_medium' => '',
'custom_height_small' => '',
'horizontal_position' => 'center',
'horizontal_position_medium' => '',
'horizontal_position_small' => '',
'vertical_position' => 'center',
'vertical_position_medium' => '',
'vertical_position_small' => '',
'content_layout' => 'column',
'align_content' => 'flex-start',
'valign_content' => 'flex-start',
'content_wrap' => 'wrap',
'enter_animation' => '',
'enter_animation_direction' => 'static',
'enter_animation_speed' => 0.5,
'enter_animation_timing' => 'ease',
'exit_animation' => '',
'exit_animation_direction' => 'static',
'exit_animation_speed' => 0.5,
'exit_animation_timing' => 'ease',
'off_canvas_state' => 'closed',
'sb_height' => '',
'position' => 'left',
'transition' => 'overlap',
'css_class' => '',
'css_id' => '',
'sb_enter_animation' => 'slideShort',
'sb_enter_animation_speed' => 0.5,
'sb_enter_animation_timing' => 'ease',
'sb_exit_animation' => 'slideShort',
'sb_exit_animation_speed' => 0.5,
'sb_exit_animation_timing' => 'ease',
// Design.
'background_color' => '#ffffff',
'background_image' => '',
'background_position' => 'left top',
'background_repeat' => 'repeat',
'background_size' => '',
'background_custom_size' => '',
'background_blend_mode' => 'none',
'oc_scrollbar' => 'default',
'oc_scrollbar_background' => '#f2f3f5',
'oc_scrollbar_handle_color' => '#65bc7b',
'margin' => '',
'padding' => '',
'box_shadow' => 'no',
'box_shadow_position' => '',
'box_shadow_blur' => '0',
'box_shadow_spread' => '0',
'box_shadow_color' => '',
'border_radius' => '',
'border_width' => '',
'border_color' => '',
// Overlay.
'overlay' => 'yes',
'overlay_z_index' => '',
'overlay_page_scrollbar' => 'yes',
'overlay_background_color' => 'rgba(0,0,0,0.8)',
'overlay_background_image' => '',
'overlay_background_position' => 'left top',
'overlay_background_repeat' => 'repeat',
'overlay_background_size' => '',
'overlay_background_custom_size' => '',
'overlay_background_blend_mode' => 'none',
// close.
'overlay_close_on_click' => 'yes',
'close_on_anchor_click' => 'no',
'close_on_esc' => 'yes',
'auto_close_after_time' => '',
'close_button' => 'yes',
'close_button_position' => 'right',
'show_close_button_after_time' => '',
'close_button_margin' => '',
'close_button_color' => '',
'close_button_color_hover' => '',
'close_icon_size' => '16',
'close_button_custom_icon' => '',
// Triggers.
'on_page_load' => 'no',
'time_on_page' => 'no',
'time_on_page_duration' => '',
'on_scroll' => 'no',
'scroll_direction' => 'up',
'scroll_to' => 'position',
'scroll_position' => '',
'scroll_element' => '',
'on_click' => 'no',
'on_click_element' => '',
'exit_intent' => 'no',
'after_inactivity' => 'no',
'inactivity_duration' => '',
'on_add_to_cart' => 'no',
// Rules.
'publish_date_after' => '',
'publish_date_until' => '',
'frequency' => 'forever',
'frequency_xtimes' => '',
'frequency_xdays' => '',
'after_x_page_views' => 'no',
'number_of_page_views' => '',
'after_x_sessions' => 'no',
'number_of_sessions' => '',
'when_arriving_from' => '',
'users' => 'all',
'users_roles' => '',
'device' => '',
// Get Element Appearance Animations option.
'status_css_animations' => $fusion_settings->get( 'status_css_animations' ),
]
);
$options = self::filter_options( $options );
if ( 'full' === $options['height'] ) {
$options['vertical_position'] = 'flex-end';
}
return $options;
}
/**
* Check if off canvas has rules.
* users and device rules excluded because it works with php.
*
* @access public
* @since 3.6.2
* @param String $id Off canvas ID.
* @return String Off Canvas template.
*/
public static function has_js_rules( $id ) {
$options = self::get_options( $id );
if ( ! empty( $options['frequency'] ) && 'forever' !== $options['frequency'] ) {
return true;
}
if ( 'yes' === $options['after_x_page_views'] ) {
return true;
}
if ( 'yes' === $options['after_x_sessions'] ) {
return true;
}
if ( ! empty( $options['when_arriving_from'] ) ) {
return true;
}
return false;
}
/**
* Off Canvas Render.
*
* @since 3.6
* @param string $id Off canvas ID.
* @param bool $force Force render?.
* @param bool $content_filter Content filter.
* @return string Off Canvas template.
*/
public static function render( $id, $force = false, $content_filter = true ) {
if ( ( ! self::is_currently_published( $id ) || ! self::is_current_user_can( $id ) || ! self::is_current_device_fit( $id ) || self::is_slider_revolution_preview() ) && ! $force ) {
return;
}
$content = self::get_content( $id, $content_filter );
$content = '<div class="off-canvas-content">' . do_shortcode( $content ) . '</div>';
$style = '';
$close_btn = self::close_button( $id );
$options = self::get_options( $id );
if ( 'sliding-bar' === $options['type'] && 'opened' === $options['off_canvas_state'] && 'push' === $options['transition'] && ! self::has_js_rules( $id ) ) {
if ( 'right' === $options['position'] ) {
$style .= '#wrapper{margin-left:-' . fusion_library()->sanitize->get_value_with_unit( $options['width'] ) . ';}';
}
if ( 'left' === $options['position'] ) {
$style .= '#wrapper{margin-left:' . fusion_library()->sanitize->get_value_with_unit( $options['width'] ) . ';}';
}
}
// Custom Code.
$custom_code = '';
if ( ! fusion_is_preview_frame() ) { // Prevent override & duplicated custom code in LE.
$custom_code = fusion_data()->post_meta( $id )->get( 'space_body_close' );
}
// Custom CSS.
if ( ! fusion_is_preview_frame() ) { // Prevent override & duplicated custom CSS in LE.
$custom_css = get_post_meta( $id, '_fusion_builder_custom_css', true );
$style .= $custom_css ? $custom_css : '';
}
$style = $style ? '<style>' . $style . '</style>' : '';
$html = $custom_code . $style . '<div ' . self::wrap_attr( $id ) . '><div class="awb-off-canvas" tabindex="-1">' . $close_btn . '<div ' . self::attr( $id ) . '>' . $content . '</div></div></div>';
$html .= self::get_script( $id );
return apply_filters( 'fusion_off_canvas_content', $html );
}
/**
* Wrap Attributes.
*
* @access public
* @since 3.6
* @param string $id Off Canvas post ID.
* @return string Wrap attributes.
*/
public static function wrap_attr( $id ) {
$atts = [];
$atts['id'] = 'awb-oc-' . $id;
$atts['class'] = 'awb-off-canvas-wrap';
$atts['style'] = '';
$atts['data-id'] = $id;
$options = self::get_options( $id );
if ( '' !== $options['css_class'] ) {
$atts['class'] .= ' ' . $options['css_class'];
}
if ( '' !== $options['css_id'] ) {
$atts['id'] = $options['css_id'];
}
if ( '' !== $options['type'] ) {
$atts['class'] .= ' type-' . $options['type'];
}
if ( 'sliding-bar' === $options['type'] && '' !== $options['position'] ) {
$atts['class'] .= ' position-' . $options['position'];
}
if ( 'no' === $options['overlay'] ) {
$atts['class'] .= ' overlay-disabled';
}
if ( 'no' === $options['overlay_close_on_click'] ) {
$atts['class'] .= ' overlay-disable-close';
}
if ( 'no' === $options['close_on_esc'] ) {
$atts['class'] .= ' disable-close-on-esc';
}
if ( 'custom' === $options['oc_scrollbar'] ) {
$atts['class'] .= ' has-custom-scrollbar';
}
if ( 'hidden' === $options['oc_scrollbar'] ) {
$atts['class'] .= ' hidden-scrollbar';
}
if ( 'yes' === $options['close_on_anchor_click'] ) {
$atts['class'] .= ' close-on-anchor';
}
if ( ( 'sliding-bar' === $options['type'] && 'opened' === $options['off_canvas_state'] && ! self::has_js_rules( $id ) ) || ( function_exists( 'fusion_is_preview_frame' ) && fusion_is_preview_frame() ) ) {
$atts['class'] .= ' awb-show';
}
if ( isset( $_GET['awb-studio-off-canvas'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
$atts['class'] .= ' init-for-studio';
}
$atts['style'] .= self::get_style_vars( $id );
$str = [];
foreach ( $atts as $k => $v ) {
$str[] = $k . '="' . esc_attr( $v ) . '"';
}
return implode( ' ', $str );
}
/**
* Off Canvas Attributes.
*
* @access public
* @since 3.6
* @param string $id Off Canvas post ID.
* @return string Wrap attributes.
*/
public static function attr( $id ) {
$atts = [];
$atts['class'] = 'awb-off-canvas-inner';
$atts['style'] = '';
$options = self::get_options( $id );
$content = self::get_content( $id );
if ( empty( $content ) ) {
$atts['class'] .= ' is-empty';
}
if ( 'sliding-bar' === $options['type'] && 'opened' === $options['off_canvas_state'] && ! self::has_js_rules( $id ) ) {
$atts['style'] .= 'visibility: visible;';
}
$atts['class'] .= ' content-layout-' . $options['content_layout'];
$str = [];
foreach ( $atts as $k => $v ) {
$str[] = $k . '="' . esc_attr( $v ) . '"';
}
return implode( ' ', $str );
}
/**
* Get Close button.
*
* @access public
* @since 3.6
* @param string $id Off Canvas post ID.
* @return String Close button HTML.
*/
public static function close_button( $id ) {
$options = self::get_options( $id );
if ( 'no' === $options['close_button'] ) {
return;
}
$class = 'off-canvas-close';
if ( ! empty( $options['close_button_custom_icon'] ) ) {
$class .= ' ' . fusion_font_awesome_name_handler( $options['close_button_custom_icon'] );
} else {
$class .= ' awb-icon-close';
}
if ( ! empty( $options['show_close_button_after_time'] ) && intval( $options['show_close_button_after_time'] ) ) {
$class .= ' hidden';
}
$class .= ' close-position-' . $options['close_button_position'];
$btn = '<button class="' . esc_attr( $class ) . '" aria-label="' . esc_attr__( 'Close', 'fusion-builder' ) . '"></button>';
return $btn;
}
/**
* Get spacing.
*
* @access public
* @since 3.6
* @param Array $options options array.
* @param String $key spacing option key.
* @return String Spacing css.
*/
public static function get_spacing( $options, $key ) {
if ( empty( $options[ $key ] ) || ! is_array( $options[ $key ] ) ) {
return [];
}
$vars = [];
foreach ( $options[ $key ] as $k => $v ) {
if ( '' === $v ) {
continue;
}
$vars[ $key . '_' . $k ] = fusion_library()->sanitize->get_value_with_unit( $v );
}
return $vars;
}
/**
* Get box shadow.
*
* @access public
* @since 3.6
* @param Array $options options array.
* @return String Box shadow css.
*/
public static function get_shadow( $options ) {
if ( 'yes' !== $options['box_shadow'] ) {
return;
}
$css = '';
$h = '0';
$v = '0';
$blur = $options['box_shadow_blur'];
$spread = $options['box_shadow_spread'];
$color = $options['box_shadow_color'];
if ( ! empty( $options['box_shadow_position'] ) && is_array( $options['box_shadow_position'] ) ) {
$h = isset( $options['box_shadow_position']['horizontal'] ) && '' !== $options['box_shadow_position']['horizontal'] ? $options['box_shadow_position']['horizontal'] : $h;
$v = isset( $options['box_shadow_position']['vertical'] ) && '' !== $options['box_shadow_position']['vertical'] ? $options['box_shadow_position']['vertical'] : $v;
}
$css = fusion_library()->sanitize->get_value_with_unit( $h ) . ' ' . fusion_library()->sanitize->get_value_with_unit( $v ) . ' ' . fusion_library()->sanitize->get_value_with_unit( $blur ) . ' ' . fusion_library()->sanitize->get_value_with_unit( $spread ) . ' ' . $color;
return $css;
}
/**
* Get border.
*
* @access public
* @since 3.6
* @param Array $options options array.
* @return String borders css.
*/
public static function get_border( $options ) {
$vars = [];
// Border radius.
if ( ! empty( $options['border_radius'] ) && is_array( $options['border_radius'] ) ) {
foreach ( $options['border_radius'] as $k => $v ) {
if ( $v ) {
$vars[ 'border_' . $k . '_radius' ] = fusion_library()->sanitize->get_value_with_unit( $v );
}
}
}
// Border width.
if ( ! empty( $options['border_width'] ) && is_array( $options['border_width'] ) ) {
foreach ( $options['border_width'] as $k => $v ) {
if ( $v ) {
$vars[ 'border_' . $k . '_width' ] = fusion_library()->sanitize->get_value_with_unit( $v );
}
}
}
// Border color.
if ( ! empty( $options['border_color'] ) ) {
$vars['border_color'] = $options['border_color'];
}
return $vars;
}
/**
* Insert Off Canvas to wp footer.
*
* @access public
* @since 3.6
* @return void
*/
public function insert() {
$off_canvases = $this->get_current_page_off_canvases();
foreach ( $off_canvases as $id => $v ) {
echo self::render( $id ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
}
/**
* Get off canvases assigned to current page.
*
* @since 3.6
* @return array Array of off canvases.
* @access public
*/
public function get_current_page_off_canvases() {
$args = [
'post_type' => [ $this->post_type ],
'post_status' => 'publish',
'posts_per_page' => -1,
'post__not_in' => array_keys( self::$current ),
];
$off_canvases = fusion_cached_query( $args );
$off_canvases = $off_canvases->posts;
if ( is_array( $off_canvases ) ) {
foreach ( $off_canvases as $off_canvas ) {
if ( $this->check_full_conditions( $off_canvas ) ) {
self::$current[ $off_canvas->ID ] = $off_canvas->post_title;
}
}
}
return self::$current;
}
/**
* Check if current post matched conditions of template.
*
* @since 3.6
* @param WP_Post $template Section post object.
* @return bool Whether it passed or not.
* @access public
*/
private function check_full_conditions( $template ) {
if ( 'yes' === fusion_data()->post_meta( $template->ID )->get( 'conditions_enabled' ) ) {
$conditions = self::get_conditions( $template );
if ( is_array( $conditions ) && 0 < count( $conditions ) ) {
foreach ( $conditions as $condition ) {
if ( isset( $condition['type'] ) && '' !== $condition['type'] && isset( $condition[ $condition['type'] ] ) ) {
$type = $condition['type'];
$exclude = 'exclude' === $condition['mode'];
$pass = 'archives' === $type ? $this->check_archive_condition( $condition ) : $this->check_singular_condition( $condition );
// If it doesn't pass all exclude conditions check is false.
// If all exclude conditions are valid and we find one valid condition check is true.
if ( $exclude && ! $pass ) {
return false;
} elseif ( ! $exclude && $pass ) {
return true;
}
}
}
} else {
return true;
}
}
// The default behavior.
return false;
}
/**
* Get conditions.
*
* @static
* @since 3.6
* @param WP_Post $template Section post object.
* @return array $return Array of conditions.
* @access private
*/
private static function get_conditions( $template ) {
if ( $template ) {
$data = json_decode( wp_unslash( str_replace( [ '\"', '\\' ], [ '\'', '' ], fusion_data()->post_meta( $template->ID )->get( 'layout_conditions' ) ) ), true );
if ( is_array( $data ) ) {
return self::group_conditions( $data );
}
}
return false;
}
/**
* Modify options mostly for the sliding bar type.
*
* @access public
* @since 3.6
* @param string $options Options array to modify.
* @return array The modified options array.
*/
public static function filter_options( $options ) {
if ( 'sliding-bar' !== $options['type'] ) {
return $options;
}
$options['enter_animation'] = $options['sb_enter_animation'];
$options['enter_animation_speed'] = $options['sb_enter_animation_speed'];
$options['enter_animation_timing'] = $options['sb_enter_animation_timing'];
$options['exit_animation'] = $options['sb_exit_animation'];
$options['exit_animation_speed'] = $options['sb_exit_animation_speed'];
$options['exit_animation_timing'] = $options['sb_exit_animation_timing'];
if ( 'left' === $options['position'] ) {
$options['height'] = 'full';
$options['enter_animation_direction'] = 'left';
$options['exit_animation_direction'] = 'left';
$options['vertical_position'] = 'flex-start';
if ( is_rtl() ) {
$options['horizontal_position'] = 'flex-end';
} else {
$options['horizontal_position'] = 'flex-start';
}
}
if ( 'right' === $options['position'] ) {
$options['height'] = 'full';
$options['enter_animation_direction'] = 'right';
$options['exit_animation_direction'] = 'right';
$options['vertical_position'] = 'flex-start';
if ( is_rtl() ) {
$options['horizontal_position'] = 'flex-start';
} else {
$options['horizontal_position'] = 'flex-end';
}
}
if ( 'top' === $options['position'] ) {
$height = $options['sb_height'] ? $options['sb_height'] : 'auto';
$options['width'] = '100vw';
$options['height'] = 'custom';
$options['width'] = '100vw';
$options['height'] = 'custom';
$options['custom_height'] = $height;
$options['enter_animation_direction'] = 'down';
$options['exit_animation_direction'] = 'up';
$options['vertical_position'] = 'flex-start';
$options['horizontal_position'] = 'flex-start';
}
if ( 'bottom' === $options['position'] ) {
$height = $options['sb_height'] ? $options['sb_height'] : 'auto';
$options['width'] = '100vw';
$options['height'] = 'custom';
$options['width'] = '100vw';
$options['height'] = 'custom';
$options['custom_height'] = $height;
$options['enter_animation_direction'] = 'up';
$options['exit_animation_direction'] = 'down';
$options['vertical_position'] = 'flex-end';
$options['horizontal_position'] = 'flex-start';
}
return $options;
}
/**
* Check if Off-Canvas is currently published.
*
* @access public
* @since 3.6
* @param string $id Off-Canvas ID.
* @return bool Will be true if the Off-Canvas is currently published.
*/
public static function is_currently_published( $id ) {
$publish_date_after = fusion_data()->post_meta( $id )->get( 'publish_date_after' );
$publish_date_until = fusion_data()->post_meta( $id )->get( 'publish_date_until' );
// Authors can always see it.
if ( current_user_can( 'publish_posts' ) ) {
return true;
}
// Published, all can see.
if ( empty( $publish_date_after ) && empty( $publish_date_until ) ) {
return true;
}
// Set to show until or after.
$publish_date_after = strtotime( $publish_date_after );
$publish_date_until = strtotime( $publish_date_until );
$current_time = current_time( 'timestamp' );
if ( ! empty( $publish_date_after ) && ! empty( $publish_date_until ) ) {
return $current_time > $publish_date_after && $current_time <= $publish_date_until;
} elseif ( ! empty( $publish_date_after ) ) {
return $current_time > $publish_date_after;
} else {
return $current_time <= $publish_date_until;
}
}
/**
* Test user rules against current user.
*
* @access public
* @since 3.6
* @param string $id off canvas ID.
* @return bool true if current user can see popup false if not.
*/
public static function is_current_user_can( $id ) {
$users = fusion_data()->post_meta( $id )->get( 'users' );
$users_roles = fusion_data()->post_meta( $id )->get( 'users_roles' );
if ( ! empty( $users ) ) {
if ( 'logged-out' === $users ) {
if ( is_user_logged_in() ) {
return false;
}
}
if ( 'logged-in' === $users ) {
if ( ! is_user_logged_in() ) {
return false;
}
if ( ! empty( $users_roles ) ) {
$current_user = wp_get_current_user();
$intersect = array_intersect( $users_roles, $current_user->roles );
if ( ! empty( $current_user ) ) {
if ( empty( $intersect ) ) {
return false;
}
}
}
}
}
// Default behavior.
return true;
}
/**
* Test device rules against user device.
*
* @access public
* @since 3.6
* @param string $id off canvas ID.
* @return bool true if current device can display popup false if not.
*/
public static function is_current_device_fit( $id ) {
$devices = fusion_data()->post_meta( $id )->get( 'device' );
if ( ! empty( $devices ) && is_array( $devices ) ) {
$current_device = 'desktop';
if ( fusion_library()->device_detection->is_mobile() ) {
$current_device = 'mobile';
} elseif ( fusion_library()->device_detection->is_tablet() ) {
$current_device = 'tablet';
} elseif ( ! wp_is_mobile() ) {
$current_device = 'desktop';
}
if ( ! in_array( $current_device, $devices, true ) ) {
return false;
}
}
// Default behavior.
return true;
}
/**
* Checks if we are on a Slider Revolution admin preview page.
*
* @access public
* @since 3.7.15
* @return bool true if we are on a Slider Revolution admin preview page.
*/
public static function is_slider_revolution_preview() {
global $SR_GLOBALS;
if ( isset( $SR_GLOBALS['preview_mode'] ) && $SR_GLOBALS['preview_mode'] ) {
return true;
}
return false;
}
/**
* Get off canvas content.
*
* @access public
* @since 3.6
* @param string $id off canvas ID.
* @param bool $filter Whether or not to filter.
* @return array Page options array.
*/
public static function get_content( $id, $filter = false ) {
$off_canvas = get_post( apply_filters( 'wpml_object_id', $id, 'awb_off_canvas', true ) );
if ( $off_canvas ) {
if ( ! $filter ) {
return $off_canvas->post_content;
}
if ( function_exists( 'Fusion_Template_Builder' ) ) {
Fusion_Template_Builder()->remove_third_party_the_content_changes( $off_canvas );
}
$content = apply_filters( 'the_content', $off_canvas->post_content );
$content = str_replace( ']]>', ']]&gt;', $content );
if ( function_exists( 'Fusion_Template_Builder' ) ) {
Fusion_Template_Builder()->readd_third_party_the_content_changes( $off_canvas );
}
return $content;
}
return false;
}
/**
* Get script with off canvas options object.
*
* @access public
* @since 3.6
* @param string $id off canvas ID.
* @return array Page options array.
*/
public static function get_script( $id ) {
$options = self::get_options( $id );
$options['has_js_rules'] = self::has_js_rules( $id );
$json = wp_json_encode( $options );
return '<script>window.off_canvas_' . $id . ' = ' . $json . ';</script>';
}
/**
* Enqueue JS Scripts.
*
* @access public
* @since 3.6
* @return void.
*/
public static function scripts() {
Fusion_Dynamic_JS::enqueue_script(
'awb-off-canvas',
FusionBuilder::$js_folder_url . '/general/awb-off-canvas.js',
FusionBuilder::$js_folder_path . '/general/awb-off-canvas.js',
[ 'jquery' ],
FUSION_BUILDER_VERSION,
true
);
}
/**
* Enqueue styles on frontend.
*
* @since 3.6
* @access public
* @return void
*/
public function styles() {
Fusion_Dynamic_CSS::enqueue_style(
FUSION_BUILDER_PLUGIN_DIR . 'assets/css/off-canvas.min.css',
FUSION_BUILDER_PLUGIN_URL . 'assets/css/off-canvas.min.css'
);
if ( class_exists( 'Avada' ) ) {
$version = Avada::get_theme_version();
Fusion_Media_Query_Scripts::$media_query_assets[] = [
'avada-off-canvas-md',
FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/off-canvas-md.min.css',
[],
$version,
Fusion_Media_Query_Scripts::get_media_query_from_key( 'fusion-max-medium' ),
];
Fusion_Media_Query_Scripts::$media_query_assets[] = [
'avada-off-canvas-sm',
FUSION_BUILDER_PLUGIN_DIR . 'assets/css/media/off-canvas-sm.min.css',
[],
$version,
Fusion_Media_Query_Scripts::get_media_query_from_key( 'fusion-max-small' ),
];
}
}
/**
* Get off canvas CSS style variables.
*
* @access public
* @since 3.9
* @param String $id off canvas ID.
* @return String off canvas css style.
*/
public static function get_style_vars( $id ) {
$options = self::get_options( $id );
$vars = [];
if ( ! empty( $options['horizontal_position'] ) ) {
$vars['horizontal_position'] = $options['horizontal_position'];
}
if ( ! empty( $options['horizontal_position_medium'] ) ) {
$vars['horizontal_position_medium'] = $options['horizontal_position_medium'];
}
if ( ! empty( $options['horizontal_position_small'] ) ) {
$vars['horizontal_position_small'] = $options['horizontal_position_small'];
}
if ( ! empty( $options['vertical_position'] ) ) {
$vars['vertical_position'] = $options['vertical_position'];
}
if ( ! empty( $options['vertical_position_medium'] ) ) {
$vars['vertical_position_medium'] = $options['vertical_position_medium'];
}
if ( ! empty( $options['vertical_position_small'] ) ) {
$vars['vertical_position_small'] = $options['vertical_position_small'];
}
if ( ! empty( $options['overlay_z_index'] ) ) {
$vars['overlay_z_index'] = $options['overlay_z_index'];
}
// Overlay Background.
if ( 'yes' === $options['overlay'] ) {
if ( ! empty( $options['overlay_background_color'] ) ) {
$vars['overlay_background_color'] = $options['overlay_background_color'];
}
if ( ! empty( $options['overlay_background_image'] ) ) {
$overlay_background_image = $options['overlay_background_image'];
if ( is_array( $overlay_background_image ) ) {
$overlay_background_image = isset( $overlay_background_image['url'] ) ? $overlay_background_image['url'] : '';
}
$vars['overlay_background_image'] = "url({$overlay_background_image})";
if ( ! empty( $options['overlay_background_repeat'] ) ) {
$vars['overlay_background_repeat'] = $options['overlay_background_repeat'];
}
if ( ! empty( $options['overlay_background_position'] ) ) {
$vars['overlay_background_position'] = $options['overlay_background_position'];
}
if ( ! empty( $options['overlay_background_blend_mode'] ) ) {
$vars['overlay_background_blend_mode'] = $options['overlay_background_blend_mode'];
}
if ( '' !== $options['overlay_background_size'] ) {
if ( 'custom' === $options['overlay_background_size'] ) {
$width = ! empty( $options['overlay_background_custom_size']['width'] ) ? fusion_library()->sanitize->get_value_with_unit( $options['overlay_background_custom_size']['width'] ) : '';
$height = ! empty( $options['overlay_background_custom_size']['height'] ) ? fusion_library()->sanitize->get_value_with_unit( $options['overlay_background_custom_size']['height'] ) : '';
if ( $width ) {
$vars['overlay_background_size'] = $width . ' ' . $height;
}
} else {
$vars['overlay_background_size'] = $options['overlay_background_size'];
}
}
}
}
if ( ! empty( $options['width'] ) ) {
$vars['width'] = fusion_library()->sanitize->get_value_with_unit( $options['width'] );
}
if ( ! empty( $options['width_medium'] ) ) {
$vars['width_medium'] = fusion_library()->sanitize->get_value_with_unit( $options['width_medium'] );
}
if ( ! empty( $options['width_small'] ) ) {
$vars['width_small'] = fusion_library()->sanitize->get_value_with_unit( $options['width_small'] );
}
if ( ! empty( $options['height'] ) ) {
if ( 'full' === $options['height'] ) {
$vars['height'] = '100dvh';
}
if ( 'custom' === $options['height'] ) {
if ( ! empty( $options['custom_height'] ) ) {
$vars['height'] = fusion_library()->sanitize->get_value_with_unit( $options['custom_height'] );
}
if ( ! empty( $options['custom_height_medium'] ) ) {
$vars['height_medium'] = fusion_library()->sanitize->get_value_with_unit( $options['custom_height_medium'] );
}
if ( ! empty( $options['custom_height_small'] ) ) {
$vars['height_small'] = fusion_library()->sanitize->get_value_with_unit( $options['custom_height_small'] );
}
}
}
// Margin.
$vars = array_merge( $vars, self::get_spacing( $options, 'margin' ) );
// Padding.
$vars = array_merge( $vars, self::get_spacing( $options, 'padding' ) );
$vars['box_shadow'] = self::get_shadow( $options );
$vars = array_merge( $vars, self::get_border( $options ) );
if ( ! empty( $options['background_color'] ) ) {
$vars['background_color'] = $options['background_color'];
}
if ( ! empty( $options['background_image'] ) ) {
$background_image = $options['background_image'];
if ( is_array( $background_image ) ) {
$background_image = isset( $background_image['url'] ) ? $background_image['url'] : '';
}
$vars['background_image'] = "url({$background_image})";
if ( ! empty( $options['background_repeat'] ) ) {
$vars['background_repeat'] = $options['background_repeat'];
}
if ( ! empty( $options['background_position'] ) ) {
$vars['background_position'] = $options['background_position'];
}
if ( ! empty( $options['background_blend_mode'] ) ) {
$vars['background_blend_mode'] = $options['background_blend_mode'];
}
if ( '' !== $options['background_size'] ) {
if ( 'custom' === $options['background_size'] ) {
$width = ! empty( $options['background_custom_size']['width'] ) ? fusion_library()->sanitize->get_value_with_unit( $options['background_custom_size']['width'] ) : '';
$height = ! empty( $options['background_custom_size']['height'] ) ? fusion_library()->sanitize->get_value_with_unit( $options['background_custom_size']['height'] ) : '';
if ( $width ) {
$vars['background_size'] = $width . ' ' . $height;
}
} else {
$vars['background_size'] = $options['background_size'];
}
}
}
// Custom Scrollbar.
if ( 'custom' === $options['oc_scrollbar'] ) {
if ( ! empty( $options['oc_scrollbar_handle_color'] ) ) {
$vars['oc_scrollbar_handle_color'] = $options['oc_scrollbar_handle_color'];
}
if ( ! empty( $options['oc_scrollbar_background'] ) ) {
$vars['oc_scrollbar_background'] = $options['oc_scrollbar_background'];
}
}
// Alignment.
if ( ! empty( $options['content_layout'] ) ) {
$vars['content_layout'] = $options['content_layout'];
}
if ( ! empty( $options['align_content'] ) ) {
$vars['align_content'] = $options['align_content'];
}
if ( ! empty( $options['valign_content'] ) ) {
$vars['valign_content'] = $options['valign_content'];
}
if ( ! empty( $options['content_wrap'] ) ) {
$vars['content_wrap'] = $options['content_wrap'];
}
// Close button.
$vars = array_merge( $vars, self::get_spacing( $options, 'close_button_margin' ) );
if ( ! empty( $options['close_button_color'] ) ) {
$vars['close_button_color'] = $options['close_button_color'];
}
if ( ! empty( $options['close_icon_size'] ) ) {
$vars['close_icon_size'] = fusion_library()->sanitize->get_value_with_unit( $options['close_icon_size'] );
}
if ( ! empty( $options['close_button_color_hover'] ) ) {
$vars['close_button_color_hover'] = $options['close_button_color_hover'];
}
$styles = '';
foreach ( $vars as $key => $value ) {
$var_name = '--awb-' . str_replace( '_', '-', $key );
$styles .= $var_name . ':' . $value . ';';
}
return $styles;
}
/**
* Creates or returns an instance of this class.
*
* @static
* @access public
* @since 3.6
*/
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 AWB_Off_Canvas_Front_End();
}
return self::$instance;
}
/**
* Checks if off canvas are enabled.
*
* @static
* @access public
* @since 3.6
* @return bool
*/
public static function is_enabled() {
$fusion_settings = awb_get_fusion_settings();
$status_awb_off_canvas = $fusion_settings->get( 'status_awb_Off_Canvas' );
$status_awb_off_canvas = '0' === $status_awb_off_canvas ? false : true;
return boolval( apply_filters( 'fusion_load_off_canvas', $status_awb_off_canvas ) );
}
/**
* Add it to used items stack.
*
* @static
* @access public
* @since 3.6
* @param int $off_canvas_post_id Off Canvas post ID.
* @return void
*/
public static function add_off_canvas_to_stack( $off_canvas_post_id ) {
// Early exit if Off Canvas is not published.
if ( ! $off_canvas_post_id || 'publish' !== get_post_status( $off_canvas_post_id ) ) {
return;
}
if ( ! isset( self::$current[ $off_canvas_post_id ] ) ) {
self::$current[ $off_canvas_post_id ] = $off_canvas_post_id;
}
}
/**
* Getter for available Off Canvas items, returns ID => post_title pair.
*
* @access public
* @since 3.6
* @return array
*/
public function get_available_items() {
$off_canvas_items = [];
$args = [
'post_type' => 'awb_off_canvas',
'post_status' => 'publish',
'ignore_sticky_posts' => 1,
'posts_per_page' => -1,
'fields' => 'id=>parent',
];
// Don't fetch entire object.
add_filter( 'posts_fields', [ $this, 'filter_wp_query_return_fields' ], 10, 2 );
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
foreach ( $query->posts as $post ) {
if ( isset( $post->post_title ) ) {
$off_canvas_items[ $post->ID ] = $post->post_title;
}
}
}
remove_filter( 'posts_fields', [ $this, 'filter_wp_query_return_fields' ], 10 );
return $off_canvas_items;
}
/**
* Filter for fetching only necessary post object's fields (leaving out post_parent results in PHP notice).
*
* @access public
* @param string $fields query fields.
* @param object $query query object.
* @since 3.6
*/
public function filter_wp_query_return_fields( $fields, $query ) {
global $wpdb;
return "{$wpdb->posts}.ID, {$wpdb->posts}.post_parent, {$wpdb->posts}.post_title";
}
}
/**
* Instantiates the AWB_Off_Canvas_Front_End class.
* Make sure the class is properly set-up.
*
* @since object 3.6
* @return object AWB_Off_Canvas_Front_End
*/
function AWB_Off_Canvas_Front_End() { // phpcs:ignore WordPress.NamingConventions
return AWB_Off_Canvas_Front_End::get_instance();
}
AWB_Off_Canvas_Front_End();