File: /var/www/html/triad-infosec/wp-content/plugins/fusion-builder/inc/class-fusion-template-builder.php
<?php
/**
* Avada Layout Sections Builder.
*
* @package Avada-Builder
* @since 2.2
*/
// Do not allow directly accessing this file.
if ( ! defined( 'ABSPATH' ) ) {
exit( 'Direct script access denied.' );
}
/**
* Fusion Layouts Builder class.
*
* @since 2.2
*/
class Fusion_Template_Builder extends AWB_Layout_Conditions {
/**
* The one, true instance of this object.
*
* @static
* @access private
* @since 2.2
* @var object
*/
private static $instance;
/**
* The layout overide.
*
* @access public
* @var mixed
*/
public $layout = null;
/**
* The template overrides in template.
*
* @access public
* @var mixed
*/
public $overrides = [];
/**
* Pause content override.
*
* @access private
* @since 2.2
* @var bool
*/
private $override_paused = false;
/**
* The template types.
*
* @access public
* @var array
*/
public $types = [];
/**
* The template meta.
*
* @access public
* @var array
*/
public $template_meta = [];
/**
* The default layout data.
*
* @static
* @access public
* @var array
*/
public static $default_layout_data = [
'conditions' => [],
'template_terms' => [],
];
/**
* The layout order.
*
* @since 2.9
* @access public
* @var mixed(bool|string)
*/
public $layout_order = false;
/**
* The name of currently rendered override.
*
* @access public
* @var bool|string
*/
public $current_override_name = false;
/**
* Holds the number of layout section loop recursion.
*
* @access protected
* @var int
*/
protected $rendering_override_loop = 0;
/**
* Array of the_content filters from third parties.
*
* @access protected
* @var array
*/
protected $content_filters = [];
/**
* Class constructor.
*
* @since 2.2
* @access private
*/
private function __construct() {
if ( ! apply_filters( 'fusion_load_template_builder', true ) ) {
return;
}
$this->register_post_types();
$this->set_global_overrides();
add_action( 'fusion_builder_shortcodes_init', [ $this, 'init_shortcodes' ] );
// Using priority 51 to come after EC of 50.
add_filter( 'template_include', [ $this, 'template_include' ], 51 );
add_filter( 'fusion_is_hundred_percent_template', [ $this, 'is_hundred_percent_template' ], 25 );
// Requirements for live editor.
add_action( 'fusion_builder_load_templates', [ $this, 'load_component_templates' ] );
add_action( 'fusion_builder_enqueue_separate_live_scripts', [ $this, 'load_component_views' ] );
// Filter in some template options along with post.
add_filter( 'fusion_pagetype_data', [ $this, 'template_tabs' ], 10, 2 );
// Special sidebar overrides.
add_filter( 'avada_setting_get_posts_global_sidebar', [ $this, 'filter_posts_global_sidebar' ] );
add_filter( 'avada_setting_get_portfolio_global_sidebar', [ $this, 'filter_portfolio_global_sidebar' ] );
add_filter( 'avada_setting_get_search_sidebar', [ $this, 'filter_search_sidebar_1' ] );
add_filter( 'avada_setting_get_search_sidebar_2', [ $this, 'filter_search_sidebar_2' ] );
add_filter( 'avada_sidebar_post_meta_option_names', [ $this, 'load_template_sidebars' ], 10, 2 );
// Headerr override option overrides.
add_filter( 'avada_setting_get_header_position', [ $this, 'filter_header_position' ] );
add_filter( 'avada_setting_get_side_header_width', [ $this, 'filter_side_header_width' ] );
add_filter( 'avada_setting_get_side_header_break_point', [ $this, 'filter_side_header_break_point' ] );
// New layout hook.
add_action( 'admin_action_fusion_tb_new_layout', [ $this, 'add_new_layout' ] );
// New template hook.
add_action( 'admin_action_fusion_tb_new_post', [ $this, 'add_new_template' ] );
// Override template post type and ID with target example.
add_filter( 'fusion_dynamic_post_data', [ $this, 'dynamic_data' ] );
add_filter( 'fusion_dynamic_post_id', [ $this, 'dynamic_id' ] );
add_filter( 'fusion_breadcrumb_post_id', [ $this, 'dynamic_id' ] );
// When saving a layout section, we need to make sure the CSS / JS for all posts using it get updated.
add_action( 'fusion_save_post', [ $this, 'reset_all_caches' ] );
// Reset caches when a template or layout gets deleted, undeleted etc.
add_action( 'clean_post_cache', [ $this, 'clean_post_cache' ], 10, 2 );
// Filters to pause.
add_action( 'fusion_pause_template_builder_override', [ $this, 'pause_content_filter' ], 999 );
add_action( 'fusion_resume_template_builder_override', [ $this, 'resume_content_filter' ], 999 );
// Add FusionApp data.
add_filter( 'fusion_app_preview_data', [ $this, 'add_builder_data' ], 10 );
// Front end page edit trigger.
add_action( 'admin_bar_menu', [ $this, 'builder_trigger' ], 999 );
// Render Hedaer override if it exists.
add_action( 'wp_head', [ $this, 'maybe_render_header' ] );
// Render Page Title Bar override if it exists.
add_action( 'wp_head', [ $this, 'maybe_render_page_title_bar' ] );
add_action( 'fusion_template_content', [ $this, 'render_content_override' ] );
// Render footer override if it exists.
add_action( 'get_footer', [ $this, 'maybe_render_footer' ] );
add_filter( 'avada_setting_get_footer_special_effects', [ $this, 'filter_special_effects' ] );
add_filter( 'generate_css_get_footer_special_effects', [ $this, 'filter_special_effects' ] );
// Add custom CSS.
// This has a priority of 1000 because we need it to be
// just before the `fusion_builder_custom_css` hook - which runs on 1001.
add_action( 'wp_head', [ $this, 'render_custom_css' ], 1000 );
// Admin head hook. Add styles & scripts if needed.
add_action( 'admin_footer', [ $this, 'admin_footer' ] );
// Clone section.
add_action( 'admin_action_clone_layout_section', [ $this, 'clone_layout_section' ] );
// Reset $this->layout if it was set too early and thus wrong.
add_action( 'wp', [ $this, 'maybe_reset_404' ], 1 );
// Polylang sync taxonomies.
add_filter( 'pll_copy_taxonomies', [ $this, 'copy_taxonomies' ], 10, 2 );
// Add layout CSS vars, 1004 to come after globals and page options.
add_filter( 'fusion_dynamic_css_array', [ $this, 'layout_css' ], 1004 );
// Handle media-query styles.
add_action( 'wp', [ $this, 'add_media_query_styles' ] );
// WCFM Plugin Compatibility.
if ( class_exists( 'WCFM' ) && class_exists( 'WooCommerce' ) ) {
add_action( 'wp', [ $this, 'wcfm_ignore_template' ] );
}
add_action( 'awb_remove_third_party_the_content_changes', [ $this, 'remove_the_content_filters' ] );
add_action( 'awb_readd_third_party_the_content_changes', [ $this, 'readd_the_content_filters' ] );
}
/**
* Creates or returns an instance of this class.
*
* @static
* @access public
* @since 2.2
*/
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 Fusion_Template_Builder();
}
return self::$instance;
}
/**
* Register the post types and taxonomies.
*
* @since 2.2
* @access public
*/
public function register_post_types() {
$is_builder = ( function_exists( 'fusion_is_preview_frame' ) && fusion_is_preview_frame() ) || ( function_exists( 'fusion_is_builder_frame' ) && fusion_is_builder_frame() );
// Layout post type, where you select templates.
$labels = [
'name' => _x( 'Avada Layouts', 'Layout general name', 'fusion-builder' ),
'singular_name' => _x( 'Layout', 'Layout singular name', 'fusion-builder' ),
'add_new' => _x( 'Add New', 'Layout item', 'fusion-builder' ),
'add_new_item' => esc_html__( 'Add New Layout', 'fusion-builder' ),
'edit_item' => esc_html__( 'Edit Layout', 'fusion-builder' ),
'new_item' => esc_html__( 'New Layout', 'fusion-builder' ),
'all_items' => esc_html__( 'All Layouts', 'fusion-builder' ),
'view_item' => esc_html__( 'View Layouts', 'fusion-builder' ),
'search_items' => esc_html__( 'Search Layouts', 'fusion-builder' ),
'not_found' => esc_html__( 'Nothing found', 'fusion-builder' ),
'not_found_in_trash' => esc_html__( 'Nothing found in Trash', 'fusion-builder' ),
'item_published' => esc_html__( 'Layout published.', 'fusion-builder' ),
'item_published_privately' => esc_html__( 'Layout published privately.', 'fusion-builder' ),
'item_reverted_to_draft' => esc_html__( 'Layout reverted to draft.', 'fusion-builder' ),
'item_scheduled' => esc_html__( 'Layout scheduled.', 'fusion-builder' ),
'item_updated' => esc_html__( 'Layout updated.', 'fusion-builder' ),
'parent_item_colon' => '',
];
$args = [
'labels' => $labels,
'public' => false,
'publicly_queryable' => $is_builder,
'exclude_from_search' => true,
'show_ui' => true,
'show_in_menu' => false,
'can_export' => true,
'query_var' => true,
'has_archive' => false,
'capability_type' => 'post',
'map_meta_cap' => true,
'hierarchical' => false,
'show_in_nav_menus' => false,
'supports' => [ 'title', 'editor', 'revisions' ],
];
register_post_type( 'fusion_tb_layout', apply_filters( 'fusion_tb_layout_args', $args ) );
// Individual Templates.
$labels = [
'name' => _x( 'Avada Layout Sections', 'Section type general name', 'fusion-builder' ),
'singular_name' => _x( 'Section', 'Section type singular name', 'fusion-builder' ),
'add_new' => _x( 'Add New', 'Section item', 'fusion-builder' ),
'add_new_item' => esc_html__( 'Add New Section', 'fusion-builder' ),
'edit_item' => esc_html__( 'Edit Section', 'fusion-builder' ),
'new_item' => esc_html__( 'New Section', 'fusion-builder' ),
'all_items' => esc_html__( 'All Sections', 'fusion-builder' ),
'view_item' => esc_html__( 'View Sections', 'fusion-builder' ),
'search_items' => esc_html__( 'Search Sections', 'fusion-builder' ),
'not_found' => esc_html__( 'Nothing found', 'fusion-builder' ),
'not_found_in_trash' => esc_html__( 'Nothing found in Trash', 'fusion-builder' ),
'item_published' => esc_html__( 'Layout published.', 'fusion-builder' ),
'item_published_privately' => esc_html__( 'Layout published privately.', 'fusion-builder' ),
'item_reverted_to_draft' => esc_html__( 'Layout reverted to draft.', 'fusion-builder' ),
'item_scheduled' => esc_html__( 'Layout scheduled.', 'fusion-builder' ),
'item_updated' => esc_html__( 'Layout updated.', 'fusion-builder' ),
'parent_item_colon' => '',
];
$args = [
'labels' => $labels,
'public' => false,
'publicly_queryable' => $is_builder,
'show_ui' => true,
'show_in_menu' => false,
'exclude_from_search' => true,
'can_export' => true,
'query_var' => true,
'has_archive' => false,
'capability_type' => 'post',
'map_meta_cap' => true,
'hierarchical' => false,
'show_in_nav_menus' => false,
'supports' => [ 'title', 'editor', 'revisions' ],
];
register_post_type( 'fusion_tb_section', apply_filters( 'fusion_tb_section_args', $args ) );
// Different template categories.
$labels = [
'name' => esc_attr__( 'Section Category', 'fusion-builder' ),
];
register_taxonomy(
'fusion_tb_category',
[ 'fusion_tb_section' ],
[
'hierarchical' => true,
'labels' => $labels,
'publicly_queryable' => $is_builder,
'show_ui' => false,
'show_admin_column' => true,
'query_var' => true,
'show_in_nav_menus' => false,
]
);
$this->set_template_terms();
}
/**
* Set the template terms that builder supports.
*
* @since 2.2
* @access public
* @return void
*/
public function set_template_terms() {
$this->types = apply_filters(
'fusion_tb_types',
[
'header' => [
'label' => esc_html__( 'Header', 'fusion-builder' ),
'icon' => 'fusiona-header',
],
'page_title_bar' => [
'label' => esc_html__( 'Page Title Bar', 'fusion-builder' ),
'icon' => 'fusiona-page_title',
],
'content' => [
'label' => esc_html__( 'Content', 'fusion-builder' ),
'alias' => esc_html__( 'Live Builder', 'fusion-builder' ),
'icon' => 'fusiona-content',
],
'footer' => [
'label' => esc_html__( 'Footer', 'fusion-builder' ),
'icon' => 'fusiona-footer',
],
]
);
}
/**
* Get the template terms that builder supports.
*
* @since 2.2
* @access public
* @return array
*/
public function get_template_terms() {
return $this->types;
}
/**
* Get the templates by term.
*
* @since 2.2
* @access public
* @return array
*/
public function get_templates_by_term() {
$templates = [];
$args = [
'post_type' => 'fusion_tb_section',
'nopaging' => true,
];
foreach ( $this->get_template_terms() as $term => $value ) {
$args['tax_query'] = [ // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query
[
'taxonomy' => 'fusion_tb_category',
'field' => 'name',
'terms' => $term,
],
];
$templates[ $term ] = get_posts( $args );
}
return $templates;
}
/**
* Reset $this->layout if it was set too early and thus wrong.
*
* @access public
* @return void
* @since 3.0.2
*/
public function maybe_reset_404() {
if ( is_404() && null !== $this->layout && isset( $this->layout->post_content ) ) {
$layout_content = json_decode( wp_unslash( $this->layout->post_content ), true );
if ( ! isset( $layout_content['conditions']['not_found'] ) ) {
$this->layout = null;
}
}
}
/**
* Copies taxonomies.
*
* @access public
* @return array
* @param array $taxonomies Taxonomies.
* @param mixed $sync Whether to sync.
* @since 3.1
*/
public function copy_taxonomies( $taxonomies, $sync ) {
$taxonomies[] = 'fusion_tb_category';
return $taxonomies;
}
/**
* Handles the update of a layout content.
*
* @access public
* @param string $id The layout ID.
* @param string $value The new post content.
* @return string
* @since 2.2
*/
public static function update_layout_content( $id, $value ) {
// TODO make a function that sanitizes value
// i.e. remove all keys that aren't terms and conditions
// i.e Check that terms are valids
// i.e Check that conditions only have valid keys and sanitize those.
// Check if it's global template.
// Else update post_content.
if ( 0 === $id || '0' === $id || 'global' === $id ) {
$updated_layout = self::update_default_layout( $value );
} else {
$post = get_post( $id );
$updated_layout = wp_parse_args(
$value,
self::$default_layout_data
);
$post->{'post_content'} = wp_slash( str_replace( "\'", "'", wp_json_encode( $updated_layout, JSON_UNESCAPED_UNICODE ) ) );
wp_update_post( $post );
}
// Reset caches.
fusion_reset_all_caches();
return $updated_layout;
}
/**
* Handles the update of a layout title.
*
* @access public
* @param string $id The layout ID.
* @param string $value The value of new title.
* @return void
* @since 2.2
*/
public static function update_layout_title( $id, $value ) {
$post = get_post( $id );
$post->{'post_title'} = esc_html( sanitize_text_field( $value ) );
wp_update_post( $post );
// Reset caches.
fusion_reset_all_caches();
}
/**
* Returns default layout
*
* @return array
* @since 2.2
*/
public static function get_default_layout() {
$data = wp_parse_args( json_decode( wp_unslash( get_option( 'fusion_tb_layout_default' ) ), true ), self::$default_layout_data );
// Cleanup: Remove empty items.
if ( isset( $data['template_terms'] ) ) {
foreach ( $data['template_terms'] as $key => $val ) {
if ( ! $val || 'publish' !== get_post_status( absint( $val ) ) ) {
unset( $data['template_terms'][ $key ] );
}
}
}
return [
'id' => 'global',
'title' => esc_html__( 'Global Layout', 'fusion-builder' ),
'data' => $data,
];
}
/**
* Returns the order of the layouts, and sets if, if called for the first time..
*
* @since 2.9
* @access public
* @return string The layout order.
*/
public function get_layout_order() {
if ( false === $this->layout_order ) {
$options = get_option( 'fusion_builder_settings', [] );
$this->layout_order = ( isset( $options['awb_layout_order'] ) && '' !== $options['awb_layout_order'] ) ? $options['awb_layout_order'] : '';
}
return $this->layout_order;
}
/**
* Returns registered layouts query results.
*
* @since 2.9
* @access public
* @param bool $is_search Whether the query is done for search results.
* @return array The queried layouts.
*/
public function get_registered_layouts_posts( $is_search = false ) {
$args = [
'post_type' => [ 'fusion_tb_layout' ],
'post_status' => [ 'any' ],
'posts_per_page' => -1,
];
if ( $is_search ) {
$args['post_status'] = 'publish';
$args['suppress_filters'] = true;
}
if ( $is_search && class_exists( 'WooCommerce' ) ) {
remove_filter( 'the_posts', [ WC()->query, 'remove_product_query_filters' ] );
$posts = fusion_cached_query( $args );
add_filter( 'the_posts', [ WC()->query, 'remove_product_query_filters' ] );
} else {
$posts = fusion_cached_query( $args );
}
$layout_order = $this->get_layout_order();
$layouts = [];
if ( $posts->have_posts() ) {
if ( '' !== $layout_order ) {
$layout_order = explode( ',', str_replace( 'global,', '', $layout_order ) );
foreach ( $posts->posts as $post ) {
$layouts[ $post->ID ] = $post;
}
$layouts = array_replace( array_flip( $layout_order ), $layouts );
} else {
$layouts = $posts->posts;
}
}
return $layouts;
}
/**
* Returns registered layouts.
*
* @since 2.2
* @access public
* @return array
*/
public function get_registered_layouts() {
$layouts = $this->get_registered_layouts_posts();
$registered_layouts = [];
// Add default layout.
$registered_layouts[0] = self::get_default_layout();
if ( ! empty( $layouts ) ) {
foreach ( $layouts as $layout ) {
if ( ! is_object( $layout ) ) {
continue;
}
$data = json_decode( str_replace( [ '\"', '\\' ], [ '\'', '' ], wp_unslash( $layout->post_content ) ), true );
$index = $layout->ID;
$registered_layouts[ $index ] = [
'id' => $layout->ID,
'title' => $layout->post_title,
'data' => wp_parse_args( $data, self::$default_layout_data ),
];
}
}
return $registered_layouts;
}
/**
* Handles the update of the default layout content.
*
* @since 2.2
* @static
* @access public
* @param string $value The value to update.
* @return string
*/
public static function update_default_layout( $value ) {
$updated_content = wp_parse_args(
$value,
[
'conditions' => [],
'template_terms' => [],
]
);
update_option( 'fusion_tb_layout_default', wp_slash( wp_json_encode( $updated_content ) ) );
return $updated_content;
}
/**
* Check if search should have a template override.
*
* @since 2.2
* @access public
* @param WP_Query $query an instance of the WP_Query object.
* @return object
*/
public function get_search_override( $query ) {
global $wp_query;
if ( ! is_admin() && $query->is_main_query() && ( $query->is_search() || $query->is_archive() ) ) {
if ( null === $this->layout ) {
$this->override_paused = true;
$layouts = $this->get_registered_layouts_posts( true );
/**
* Check if whatever is being loaded should have a template override.
*
* @since 2.2
* @access public
* @param string $type Type of override you are checking for.
* @return object
*/
if ( ! empty( $layouts ) ) {
$wp_query->is_search = $query->is_search();
foreach ( $layouts as $layout ) {
if ( $this->check_full_conditions( $layout, null ) ) {
$layout->permalink = get_permalink( $layout->ID );
$this->layout = $layout;
}
}
}
// We're on purpose using wp_reset_query() instead of wp_reset_postdata() here
// because we've altered the main query above.
wp_reset_query(); // phpcs:ignore WordPress.WP.DiscouragedFunctions
// Add global layout if no custom layout was detected.
if ( ! $this->layout ) {
$default_layout = self::get_default_layout();
// Check if our global layout has overrides before adding anything.
if ( ! empty( $default_layout['data']['template_terms'] ) ) {
$this->layout = new stdClass();
$this->layout->ID = 'global';
$this->layout->post_content = wp_json_encode( $default_layout['data'] );
}
}
/**
* Filter the layout override.
*
* @since 2.2.0
* @param stdClass|false $layout The layout override.
* @param int|string|false $c_page_id The page-ID as returned from fusion_library()->get_page_id().
* @return stdClass|false
*/
$this->layout = apply_filters( 'fusion_tb_override', $this->layout, false );
$this->set_overrides();
$this->override_paused = false;
}
if ( ! $this->layout ) {
$this->layout = null;
$this->overrides = apply_filters( 'fusion_set_overrides', [] );
}
$override = isset( $this->overrides['content'] ) ? $this->overrides['content'] : false;
/**
* Filter overrides.
*
* @since 2.2.0
* @param stdClass|false $override The override.
* @param string $type The type of override we're querying.
* @param int|string|false $c_page_id The page-ID as returned from fusion_library()->get_page_id().
* @return stdClass|false
*/
return apply_filters( 'fusion_get_override', $override, 'content', false );
}
return false;
}
/**
* Check if whatever is being loaded should have a template override.
*
* @since 2.2
* @access public
* @param string $type Type of override you are checking for.
* @return object
*/
public function get_override( $type = 'content' ) {
global $post, $wp_query, $pagenow;
$backend_pages = [ 'post.php', 'term.php' ];
// Early exit if called too early.
if ( ( ! is_admin() && ! did_action( 'wp' ) ) || doing_filter( 'fusion_set_overrides' ) || fusion_is_builder_frame() || ( ! isset( $post ) && $pagenow !== $backend_pages[1] && ! is_archive() && ! is_404() && ! is_search() ) || $this->override_paused ) {
return false;
}
$target_post = $post;
$c_page_id = fusion_library()->get_page_id();
// If $this->layout is null it has not been calculated yet.
if ( null === $this->layout ) {
$this->override_paused = true;
$layouts = $this->get_registered_layouts_posts();
if ( fusion_is_preview_frame() || ( is_admin() && in_array( $pagenow, $backend_pages ) ) ) { // phpcs:ignore WordPress.PHP.StrictInArray
if ( 'fusion_tb_section' === get_post_type() ) {
add_filter( 'fusion_app_preview_data', [ $this, 'add_post_data' ], 10, 3 );
$target_post = $this->get_target_example( $post->ID );
$option = fusion_get_page_option( 'dynamic_content_preview_type', $post->ID );
} elseif ( fusion_is_post_card() ) {
add_filter( 'fusion_app_preview_data', [ $this, 'add_post_data' ], 10, 3 );
} elseif ( class_exists( 'WooCommerce' ) && is_object( $post ) && fusion_is_shop( $post->ID ) ) {
$target_post = get_post( $c_page_id );
} elseif ( 'awb_off_canvas' === get_post_type() ) {
add_filter( 'fusion_app_preview_data', [ $this, 'add_post_data' ], 10, 3 );
$option = fusion_get_page_option( 'dynamic_content_preview_type', $post->ID );
}
// Check if front page.
if ( isset( $target_post ) && 'page' === get_option( 'show_on_front' ) && (int) get_option( 'page_on_front' ) === $target_post->ID ) {
$target_post->is_front_page = true;
}
// Check if singular.
if ( isset( $target_post ) && $target_post->post_type ) {
$target_post->is_singular = true;
}
$query_altered = false;
if ( isset( $option ) && 'search' === $option ) {
$wp_query->is_search = true;
$query_altered = true;
} elseif ( isset( $option ) && '404' === $option ) {
$wp_query->is_404 = true;
$query_altered = true;
} elseif ( isset( $option ) && 'archives' === $option ) {
$wp_query->is_archive = true;
$query_altered = true;
}
if ( $query_altered ) {
// We're on purpose using wp_reset_query() instead of wp_reset_postdata() here
// because we've altered the main query above.
wp_reset_query(); // phpcs:ignore WordPress.WP.DiscouragedFunctions
}
}
if ( ! empty( $layouts ) ) {
foreach ( $layouts as $layout ) {
if ( $this->check_full_conditions( $layout, $target_post ) ) {
$layout->permalink = get_permalink( $layout->ID );
$this->layout = $layout;
}
}
}
// Add global layout if no custom layout was detected.
if ( ! $this->layout ) {
$default_layout = self::get_default_layout();
// Check if our global layout has overrides before adding anything.
if ( ! empty( $default_layout['data']['template_terms'] ) ) {
$this->layout = new stdClass();
$this->layout->ID = 'global';
$this->layout->post_content = wp_json_encode( $default_layout['data'] );
}
}
/**
* Filter the layout override.
*
* @since 2.2.0
* @param stdClass|false $override The override.
* @param int|string|false $c_page_id The page-ID as returned from fusion_library()->get_page_id().
* @return stdClass|false
*/
$this->layout = apply_filters( 'fusion_tb_override', $this->layout, $c_page_id );
$this->set_overrides();
$this->override_paused = false;
}
if ( ! $this->layout ) {
$this->layout = false;
$this->overrides = apply_filters( 'fusion_set_overrides', [] );
}
$override = $this->layout;
if ( 'layout' !== $type ) {
$override = isset( $this->overrides[ $type ] ) ? $this->overrides[ $type ] : false;
}
/**
* Filter overrides.
*
* @since 2.2.0
* @param Post|false $override The override.
* @param string $type The type of override we're querying.
* @param int|string $c_page_id The page-ID as returned from fusion_library()->get_page_id().
* @return Post|false
*/
return apply_filters( 'fusion_get_override', $override, $type, $c_page_id );
}
/**
* Sets individual template overrides based on layout override
*
* @since 2.2.2
* @return void
*/
public function set_overrides() {
if ( $this->layout && 'global' !== $this->layout->ID ) {
$data = json_decode( str_replace( "'", "\'", wp_unslash( $this->layout->post_content ) ), true );
$types = isset( $data['template_terms'] ) ? $data['template_terms'] : false;
if ( is_array( $types ) ) {
foreach ( $types as $type_name => $template_id ) {
$template_id = apply_filters( 'fusion_layout_section_id', $template_id, $type_name, $this->layout->ID );
// If template found and is not what we are viewing/editing.
if ( $template_id && '' !== $template_id && (string) fusion_library()->get_page_id() !== (string) $template_id ) {
$template_post = get_post( $template_id );
// If the template doesn't exist (for example it has been deleted), unset it.
if ( ! $template_post || 'publish' !== $template_post->post_status ) {
continue;
}
$this->overrides[ $type_name ] = $template_post;
$this->overrides[ $type_name ]->permalink = get_permalink( $template_id );
$this->overrides[ $type_name ]->layout_id = $this->layout->ID;
}
}
}
}
$this->overrides = apply_filters( 'fusion_set_overrides', $this->overrides );
// Header override, reset options to get new filtered values, needed becaused cached ones that are early are incorrect.
if ( isset( $this->overrides['header'] ) ) {
$fusion_settings = awb_get_fusion_settings();
$fusion_settings->reset_option( 'side_header_width' );
$fusion_settings->reset_option( 'header_position' );
$fusion_settings->reset_option( 'side_header_break_point' );
}
// If not on single, but we have content override, ensure PO is read like it was a page.
if ( ! is_singular() && isset( $this->overrides['content'] ) ) {
add_filter( 'fusion_should_get_page_option', [ $this, 'should_get_option' ], 10 );
add_filter( 'fusion_get_option_post_id', [ $this, 'replace_post_id' ], 10 );
}
}
/**
* Sets overrides for each global layout section.
*
* @since 2.2.2
* @return void
*/
public function set_global_overrides() {
$globals = self::get_default_layout();
if ( isset( $globals['data'] ) && isset( $globals['data']['template_terms'] ) ) {
foreach ( $globals['data']['template_terms'] as $type_name => $template_id ) {
$template_id = apply_filters( 'fusion_layout_section_id', $template_id, $type_name, 'global' );
$template_post = get_post( $template_id );
// If the template doesn't exist (for example it has been deleted), unset it.
if ( ! $template_post || 'publish' !== $template_post->post_status ) {
continue;
}
$this->overrides[ $type_name ] = $template_post;
$this->overrides[ $type_name ]->permalink = get_permalink( $template_id );
$this->overrides[ $type_name ]->layout_id = 'global';
}
}
}
/**
* Make sure to ignore TO global option.
*
* @since 2.2.2
* @param string $value The global option for post sidebars.
* @return string
*/
public function filter_posts_global_sidebar( $value ) {
$override = $this->get_override( 'content' );
if ( ( is_singular( 'post' ) && $override ) || is_singular( 'fusion_tb_section' ) ) {
return 0;
}
return $value;
}
/**
* Use template option if set rather than global on search page.
*
* @since 2.2.2
* @param string $value The global option for search sidebar 1.
* @return string
*/
public function filter_search_sidebar_1( $value ) {
$override = $this->get_override( 'content' );
if ( $override ) {
return fusion_get_page_option( 'template_sidebar', $override->ID );
}
return $value;
}
/**
* Use template option if set rather than global for sidebar 2 on search page.
*
* @since 2.2.2
* @param string $value The global option for search sidebar 2.
* @return string
*/
public function filter_search_sidebar_2( $value ) {
$override = $this->get_override( 'content' );
if ( $override ) {
return fusion_get_page_option( 'template_sidebar_2', $override->ID );
}
return $value;
}
/**
* Make sure to ignore TO global option.
*
* @since 2.2.2
* @param string $value The global option for portfolio sidebars.
* @return string
*/
public function filter_portfolio_global_sidebar( $value ) {
$override = $this->get_override( 'content' );
if ( is_singular( 'avada_portfolio' ) && $override ) {
return 0;
}
return $value;
}
/**
* Change header position global based on layout section override.
*
* @since 3.4
* @param string $value The global option for portfolio sidebars.
* @return string
*/
public function filter_header_position( $value ) {
$header_override = $this->get_override( 'header' );
if ( $header_override ) {
$position = fusion_get_page_option( 'position', $header_override->ID );
if ( 'left' === $position || 'right' === $position ) {
return $position;
}
return 'top';
}
return $value;
}
/**
* Change side header width.
*
* @since 3.4
* @param string $value The global option for portfolio sidebars.
* @return string
*/
public function filter_side_header_width( $value ) {
$header_override = $this->get_override( 'header' );
if ( $header_override ) {
$position = fusion_get_page_option( 'position', $header_override->ID );
$width = fusion_get_page_option( 'side_header_width', $header_override->ID );
if ( 'left' === $position || 'right' === $position ) {
return $width;
}
return 0;
}
return $value;
}
/**
* Change side header breakpoint.
*
* @since 3.4
* @param string $value The global option for portfolio sidebars.
* @return string
*/
public function filter_side_header_break_point( $value ) {
$header_override = $this->get_override( 'header' );
if ( $header_override ) {
$position = fusion_get_page_option( 'position', $header_override->ID );
if ( 'left' === $position || 'right' === $position ) {
$breakpoint = fusion_get_page_option( 'header_breakpoint', $header_override->ID );
if ( 'never' === $breakpoint ) {
return 0;
}
if ( 'small' === $breakpoint || 'medium' === $breakpoint ) {
return fusion_library()->get_option( 'visibility_' . $breakpoint );
}
if ( 'custom' === $breakpoint ) {
return fusion_get_page_option( 'header_custom_breakpoint', $header_override->ID );
}
}
}
return $value;
}
/**
* Add any special case classes we need.
*
* @since 2.2.2
* @param string $value The footer special effects value in TO.
* @return string
*/
public function filter_special_effects( $value ) {
$footer_override = $this->get_override( 'footer' );
if ( $footer_override ) {
$value = fusion_get_page_option( 'special_effect', $footer_override->ID );
if ( '' === $value ) {
return 'none';
}
}
return $value;
}
/**
* Check if we have a header and if so render it.
*
* @since 2.2
* @return void
* @access public
*/
public function maybe_render_header() {
$header_override = $this->get_override( 'header' );
if ( $header_override && ! is_page_template( 'blank.php' ) ) {
add_action(
'avada_render_header',
function () use ( $header_override ) {
$this->current_override_name = 'header';
$tag = apply_filters( 'fusion_tb_section_tag', 'div', 'header' );
$position = fusion_data()->post_meta( $header_override->ID )->get( 'position' );
$side_header_markup = ! fusion_is_preview_frame() && ( 'left' === $position || 'right' === $position );
$header_id = 'left' === $position || 'right' === $position ? ' id="side-header"' : '';
echo '<' . sanitize_key( $tag ) . ' class="fusion-tb-header"' . $header_id . '>'; // phpcs:ignore WordPress.Security.EscapeOutput
if ( $side_header_markup ) {
$header_breakpoint = fusion_data()->post_meta( $header_override->ID )->get( 'header_breakpoint' );
$data_attr = 'never' === $header_breakpoint ? 'data-sticky-small-visibility="1"' : '';
$data_attr .= 'medium' !== $header_breakpoint ? 'data-sticky-medium-visibility="1"' : '';
echo '<div class="fusion-sticky-container awb-sticky-content side-header-wrapper" data-sticky-large-visibility="1" ' . $data_attr . '>'; // phpcs:ignore WordPress.Security.EscapeOutput
}
$this->render_content( $header_override );
if ( $side_header_markup ) {
echo '</div>';
}
echo '</' . sanitize_key( $tag ) . '>';
$this->current_override_name = false;
},
10
);
// Add slider from page options.
$page_id = fusion_library()->get_page_id();
$is_archive = ( is_archive() || Fusion_Helper::bbp_is_topic_tag() ) && ! ( class_exists( 'WooCommerce' ) && is_shop() );
$theme_option_slider_position = strtolower( fusion_get_option( 'slider_position' ) );
$page_option_slider_position = ( true === $is_archive )
? fusion_data()->term_meta( $page_id )->get( 'slider_position' )
: fusion_data()->post_meta( $page_id )->get( 'slider_position' );
$page_option_slider_position = $page_option_slider_position ? $page_option_slider_position : $theme_option_slider_position;
add_action(
'avada_render_header',
'avada_sliders_container',
'above' === $page_option_slider_position ? 0 : 11
);
}
}
/**
* Check if we have a page title bar and if so render it.
*
* @since 2.2
* @return void
* @access public
*/
public function maybe_render_page_title_bar() {
$page_title_bar_override = $this->get_override( 'page_title_bar' );
if ( $page_title_bar_override ) {
add_action(
'avada_override_current_page_title_bar',
function () use ( $page_title_bar_override ) {
$this->current_override_name = 'page_title_bar';
$tag = apply_filters( 'fusion_tb_section_tag', 'section', 'page_title_bar' );
echo '<' . sanitize_key( $tag ) . ' class="fusion-page-title-bar fusion-tb-page-title-bar">';
$this->render_content( $page_title_bar_override );
echo '</' . sanitize_key( $tag ) . '>';
$this->current_override_name = false;
}
);
}
}
/**
* Check if we have a content override and if so render it.
*
* @since 3.8
* @access public
* @return void
*/
public function render_content_override() {
$this->current_override_name = 'content';
$this->render_content();
$this->current_override_name = false;
}
/**
* Check if we have a footer and if so render it.
*
* @since 2.2
* @return void
* @access public
*/
public function maybe_render_footer() {
$footer_override = $this->get_override( 'footer' );
if ( $footer_override ) {
add_action(
'avada_render_footer',
function () use ( $footer_override ) {
$this->current_override_name = 'footer';
$tag = apply_filters( 'fusion_tb_section_tag', 'div', 'footer' );
echo '<' . sanitize_key( $tag ) . ' class="fusion-tb-footer fusion-footer' . ( class_exists( 'Avada' ) && 'footer_parallax_effect' === Avada()->settings->get( 'footer_special_effects' ) ? ' fusion-footer-parallax' : '' ) . '">';
echo '<div class="fusion-footer-widget-area fusion-widget-area">';
$this->render_content( $footer_override );
echo '</div></' . sanitize_key( $tag ) . '>';
$this->current_override_name = false;
}
);
}
}
/**
* Returns the name of the currently rendered override.
*
* @since 3.8
* @access public
* @return bool|string The current override.
*/
public function get_current_override_name() {
return $this->current_override_name;
}
/**
* Check if current post matched conditions of template.
*
* @static
* @since 2.2
* @param WP_Post $template Section post object.
* @return array $return Whether it passed or not.
* @access public
*/
public static function get_conditions( $template ) {
if ( $template && is_object( $template ) ) {
$data = json_decode( str_replace( "'", "\'", wp_unslash( $template->post_content ) ), true );
if ( isset( $data['conditions'] ) ) {
return self::group_conditions( $data['conditions'] );
}
}
return false;
}
/**
* Check if current post matched conditions of template.
*
* @since 2.2
* @param WP_Post $template Section post object.
* @param WP_Post $target_post The target post object.
* @return bool Whether it passed or not.
* @access public
*/
public function check_full_conditions( $template, $target_post ) {
global $pagenow;
$conditions = self::get_conditions( $template );
$backend_pages = [ 'post.php', 'term.php' ];
if ( is_array( $conditions ) ) {
foreach ( $conditions as $condition ) {
if ( isset( $condition['type'] ) && '' !== $condition['type'] && isset( $condition[ $condition['type'] ] ) ) {
$type = $condition['type'];
$exclude = 'exclude' === $condition['mode'];
if ( fusion_is_preview_frame() || ( is_admin() && in_array( $pagenow, $backend_pages ) ) ) { // phpcs:ignore WordPress.PHP.StrictInArray
$pass = 'archives' === $type ? $this->builder_check_archive_condition( $condition ) : $this->builder_check_singular_condition( $condition, $target_post );
} else {
$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;
}
}
}
}
// The default behaviour.
return false;
}
/**
* Check if archive condition is true.
*
* @since 2.2
* @param array $condition Condition array to check.
* @return bool $return Whether it passed or not.
* @access public
*/
public function builder_check_archive_condition( $condition ) {
global $pagenow;
$archive_type = isset( $condition['archives'] ) ? $condition['archives'] : '';
$exclude = isset( $condition['mode'] ) && 'exclude' === $condition['mode'];
$condition_type = isset( $condition['type'] ) ? $condition['type'] : '';
$sub_condition = isset( $condition[ $archive_type ] ) ? $condition[ $archive_type ] : '';
$is_admin = is_admin();
$post_id = is_admin() ? get_the_id() : fusion_library()->get_page_id();
if ( '' === $sub_condition ) {
if ( 'all_archives' === $archive_type ) {
if ( $is_admin ) {
return $exclude ? 'term.php' !== $pagenow && ! fusion_is_shop( $post_id ) : 'term.php' === $pagenow || fusion_is_shop( $post_id );
}
return $exclude ? ! is_archive() : is_archive();
}
// Shop page.
if ( 'archive_of_product' === $archive_type ) {
return $exclude ? ! fusion_is_shop( $post_id ) : fusion_is_shop( $post_id );
}
if ( 'author_archive' === $archive_type ) {
if ( $is_admin ) {
return $exclude ? 'profile.php' !== $pagenow : 'profile.php' === $pagenow;
}
return $exclude ? ! is_author() : is_author();
}
// Check if it's a archive page.
if ( 'term.php' === $pagenow ) {
if ( $is_admin ) {
return $exclude ? $archive_type !== $_GET['taxonomy'] : $archive_type === $_GET['taxonomy']; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput, WordPress.Security.NonceVerification
}
$queried_object = get_queried_object();
if ( ! is_null( $queried_object ) && property_exists( $queried_object, 'taxonomy' ) ) {
return $exclude ? ! $queried_object->taxonomy === $archive_type : $queried_object->taxonomy === $archive_type;
}
}
// Only check live editor, cannot edit search or taxonomy archive on back-end.
if ( ! $is_admin ) {
if ( 'search_results' === $archive_type ) {
return $exclude ? ! is_search() : is_search();
}
$queried_object = get_queried_object();
if ( 'archives' === $condition_type && taxonomy_exists( $archive_type ) && ! is_null( $queried_object ) && property_exists( $queried_object, 'taxonomy' ) ) {
return $exclude ? ! ( $queried_object->taxonomy === $archive_type ) : $queried_object->taxonomy === $archive_type;
}
}
return $exclude;
}
// Check for specific author pages.
if ( false !== strpos( $archive_type, 'author_archive_' ) ) {
$author_ids = [];
foreach ( array_keys( $sub_condition ) as $id ) {
$author_ids[] = explode( '|', $id )[1];
}
$curauth = ( get_query_var( 'author_name' ) ) ? get_user_by( 'slug', get_query_var( 'author_name' ) ) : get_userdata( get_query_var( 'author' ) );
if ( ! $curauth ) {
return $exclude;
}
// Intentionally not strict comparison.
return $exclude ? ! in_array( $curauth->ID, $author_ids ) : in_array( $curauth->ID, $author_ids ); // phpcs:ignore WordPress.PHP.StrictInArray
}
// Check for especific terms.
if ( false !== strpos( $archive_type, 'taxonomy_of_' ) && ! is_archive() ) {
$taxonomy = str_replace( 'taxonomy_of_', '', $archive_type );
$terms = [];
foreach ( array_keys( $sub_condition ) as $id ) {
$terms[] = explode( '|', $id )[1];
}
switch ( $taxonomy ) {
case 'category':
return $exclude ? ! in_category( $terms ) : in_category( $terms );
case 'post_tag':
return $exclude ? ! has_tag( $terms ) : has_tag( $terms );
default:
return $exclude ? ! has_term( $terms, $taxonomy ) : has_term( $terms, $taxonomy );
}
}
// Check for specific author pages.
if ( false !== strpos( $archive_type, 'author_archive_' ) ) {
$author_ids = [];
foreach ( array_keys( $sub_condition ) as $id ) {
$author_ids[] = explode( '|', $id )[1];
}
$curauth = ( get_query_var( 'author_name' ) ) ? get_user_by( 'slug', get_query_var( 'author_name' ) ) : get_userdata( get_query_var( 'author' ) );
if ( ! $curauth ) {
return $exclude;
}
// Intentionally not strict comparison.
return $exclude ? ! in_array( $curauth->ID, $author_ids ) : in_array( $curauth->ID, $author_ids ); // phpcs:ignore WordPress.PHP.StrictInArray
}
// Check for general archive pages.
if ( is_archive() || 'term.php' === $pagenow ) {
$terms = [];
foreach ( array_keys( $sub_condition ) as $id ) {
$terms[] = explode( '|', $id )[1];
}
if ( $is_admin && isset( $_GET['tag_ID'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
return $exclude ? ! in_array( $_GET['tag_ID'], $terms ) : in_array( $_GET['tag_ID'], $terms ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput, WordPress.Security.NonceVerification, WordPress.PHP.StrictInArray
}
$queried_object = get_queried_object();
if ( is_object( $queried_object ) && property_exists( $queried_object, 'term_id' ) ) {
// Intentionally not strict comparison.
return $exclude ? ! in_array( $queried_object->term_id, $terms ) : in_array( $queried_object->term_id, $terms ); // phpcs:ignore WordPress.PHP.StrictInArray
}
}
return $exclude;
}
/**
* Check if singular condition is true.
*
* @since 2.2
* @param array $condition Condition array to check.
* @param WP_Post $target_post The target post object.
* @return bool Whether it passed or not.
* @access public
*/
public function builder_check_singular_condition( $condition, $target_post ) {
global $post;
$singular_type = isset( $condition['singular'] ) ? $condition['singular'] : '';
$exclude = isset( $condition['mode'] ) && 'exclude' === $condition['mode'];
$sub_condition = isset( $condition[ $singular_type ] ) ? $condition[ $singular_type ] : '';
$post_type = str_replace( 'singular_', '', $singular_type );
// Check for specific post type of page.
if ( '' === $sub_condition ) {
if ( 'front_page' === $singular_type ) {
if ( ! $target_post ) {
return $exclude;
}
if ( fusion_is_preview_frame() ) {
return $exclude ? ! is_front_page() : is_front_page();
} else {
return $exclude ? ! $target_post->is_front_page : $target_post->is_front_page;
}
}
if ( 'not_found' === $singular_type ) {
return $exclude ? ! is_404() : is_404();
}
// Is post type.
if ( ! $target_post ) {
return $exclude;
}
$is_single = $post_type === $target_post->post_type ? true : false; // phpcs:ignore WordPress.Security.NonceVerification
return $exclude ? ! $is_single : $is_single;
}
// Check if page matches condition id.
if ( $sub_condition && false !== strpos( $singular_type, 'specific_' ) ) {
$specific_posts = [];
foreach ( array_keys( $sub_condition ) as $id ) {
$specific_posts[] = explode( '|', $id )[1];
}
if ( ! $target_post ) {
return $exclude;
}
// Intentionally not strict comparison.
return $exclude ? ! in_array( $target_post->ID, $specific_posts, false ) : in_array( $target_post->ID, $specific_posts, false );
}
// Hierarchy check.
if ( false !== strpos( $singular_type, 'children_of' ) ) {
$ancestors = get_post_ancestors( $target_post );
$is_children = false;
foreach ( array_keys( $sub_condition ) as $id ) {
$parent = explode( '|', $id )[1];
if ( in_array( $parent, $ancestors ) ) { // phpcs:ignore WordPress.PHP.StrictInArray
$is_children = true;
break;
}
}
return $exclude ? ! $is_children : $is_children;
}
return $exclude;
}
/**
* Decide which template to include.
*
* @since 2.2
* @param string $template template path.
* @access public
*/
public function template_include( $template ) {
if ( $this->override_paused ) {
return $template;
}
if ( $this->get_override( 'content' ) || is_singular( 'fusion_tb_section' ) || is_singular( 'fusion_template' ) ) {
$new_template = locate_template( [ 'template-page.php' ] );
if ( ! empty( $new_template ) ) {
return $new_template;
} else {
return FUSION_BUILDER_PLUGIN_DIR . 'templates/template-page.php';
}
}
if ( fusion_is_post_card() ) {
$new_template = locate_template( [ 'template-card.php' ] );
if ( ! empty( $new_template ) ) {
return $new_template;
} else {
return FUSION_BUILDER_PLUGIN_DIR . 'templates/template-card.php';
}
} elseif ( fusion_is_mega_menu() ) {
$new_template = locate_template( [ 'template-mega-menu.php' ] );
if ( ! empty( $new_template ) ) {
return $new_template;
} else {
return FUSION_BUILDER_PLUGIN_DIR . 'templates/template-mega-menu.php';
}
}
return $template;
}
/**
* Filter the wrapping content in.
*
* @since 2.2
* @param mixed $override Pass post object to to be used.
* @param boolean $live_editor Is it live editor.
* @param boolean $return Whether to return or not.
* @access public
*/
public function render_content( $override = false, $live_editor = false, $return = false ) {
global $post;
$this->rendering_override_loop++;
$post_object = $override ? $override : $this->get_override( 'content' );
if ( $post_object ) {
add_filter( 'fusion_is_hundred_percent_template', [ $this, 'return_true' ] );
if ( ! $live_editor ) {
// Override means target post load. Means lets make actual post content non editable in live editor.
do_action( 'fusion_pause_live_editor_filter' );
}
$this->remove_third_party_the_content_changes( $override );
add_filter( 'the_content', 'fusion_builder_fix_shortcodes' );
$content = apply_filters( 'the_content', $post_object->post_content );
remove_filter( 'the_content', 'fusion_builder_fix_shortcodes' );
$this->readd_third_party_the_content_changes( $override );
$content = str_replace( ']]>', ']]>', $content );
if ( ! $live_editor ) {
do_action( 'fusion_resume_live_editor_filter' );
}
remove_filter( 'fusion_is_hundred_percent_template', [ $this, 'return_true' ] );
} else {
// No override means editing template in live editor, in which case we do not pause filter.
$content = apply_filters( 'the_content', $post->post_content );
$content = str_replace( ']]>', ']]>', $content );
}
$this->rendering_override_loop--;
if ( $return ) {
return $content;
}
echo $content; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
/**
* Remove the third party changes of the_content filter.
*
* @access public
* @since 2.2
* @param object|bool $override The override or false.
* @return void
*/
public function remove_third_party_the_content_changes( $override = false ) {
global $avada_events_calender, $wp_query, $post;
// Make sure the_content filters run on bbPress pages, to get elements rendered.
if ( 2 > $this->rendering_override_loop && class_exists( 'bbPress' ) && Fusion_Helper::is_bbpress() && ! Fusion_Helper::is_buddypress() && ! bbp_is_template_included() && bbp_is_theme_compat_active() ) {
bbp_restore_all_filters( 'the_content' );
}
if ( class_exists( 'Tribe__Events__Main' ) ) {
// Event Tickets Plus.
try {
$ar_template = tribe( 'tickets.attendee_registration.template' );
} catch ( Exception $e ) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement
$ar_template = false;
}
if ( function_exists( 'tribe' ) && class_exists( 'Tribe__Tickets__Attendee_Registration__Template' ) && is_object( $ar_template ) && $ar_template->is_on_ar_page() && $wp_query->is_main_query() && ( ! $post instanceof WP_Post || ! has_shortcode( $post->post_content, 'tribe_attendee_registration' ) ) ) {
remove_filter( 'the_content', tribe_callback( 'tickets-plus.attendee-registration.view', 'get_page_content' ) );
}
// Make sure TEC ticket forms don't get double added. Removing / re-adding is not congruent.
if ( ! is_null( $avada_events_calender ) ) {
remove_filter( 'the_content', [ $avada_events_calender, 'single_events_blocks_sharing_box' ], 10 );
}
// Tec Pro 6.0+ Event Series.
if ( function_exists( 'tribe' ) && class_exists( 'TEC\Events_Pro\Custom_Tables\V1\Templates\Series_Filters' ) && has_filter( 'the_content', [ tribe( 'TEC\Events_Pro\Custom_Tables\V1\Templates\Series_Filters' ), 'inject_content' ] ) ) {
remove_filter( 'the_content', [ tribe( 'TEC\Events_Pro\Custom_Tables\V1\Templates\Series_Filters' ), 'inject_content' ] );
}
}
// Make sure the_content filters run on Events Manager pages, to get elements rendered.
if ( class_exists( 'EM_Event_Post' ) ) {
remove_filter( 'the_content', [ 'EM_Event_Post', 'the_content' ] );
}
if ( $override ) {
// Download Manager plugin.
if ( class_exists( 'WordPressDownloadManager' ) ) {
remove_filter( 'the_content', 'wpdm_downloadable' );
}
// MemberPress plugin.
if ( 1 === $this->rendering_override_loop && defined( 'MEPR_PLUGIN_NAME' ) ) {
remove_filter( 'the_content', 'MeprAppCtrl::page_route', 100 );
remove_filter( 'the_content', 'MeprGroupsCtrl::render_pricing_boxes', 10 );
remove_filter( 'the_content', 'MeprProductsCtrl::display_registration_form', 10 );
remove_filter( 'the_content', 'MeprRulesCtrl::rule_content', 999999, 1 );
}
// Member plugin.
if ( function_exists( 'members_content_permissions_protect' ) ) {
remove_filter( 'the_content', 'members_content_permissions_protect', 95 );
}
// WooCommerce Membership.
if ( function_exists( 'wc_memberships' ) ) {
remove_filter( 'the_content', [ wc_memberships()->get_restrictions_instance()->get_posts_restrictions_instance(), 'handle_restricted_post_content_filtering' ], 999 );
}
// Ultimate Member.
add_filter( 'um_ignore_restricted_content', '__return_true' );
// Remove LearnDash the_content filters.
if ( class_exists( 'SFWD_LMS' ) ) {
SFWD_LMS::content_filter_control( false );
if ( class_exists( 'CTLearnDash' ) ) {
$custom_ld_template = CTLearnDash::get_instance();
remove_filter( 'the_content', [ $custom_ld_template, 'render' ], 1001 );
}
}
// Remove Jetpack sharing icons.
if ( defined( 'WP_SHARING_PLUGIN_VERSION' ) ) {
remove_filter( 'the_content', 'sharing_display', 19 );
}
}
// DW Question Answer - Single question.
if ( is_singular( 'dwqa-question' ) ) {
global $dwqa;
$dwqa->template->restore_all_filters( 'the_content' );
}
// Remove PrivateContent the_content filters.
if ( isset( $GLOBALS['is_pc_bundle'] ) && $GLOBALS['is_pc_bundle'] ) {
remove_filter( 'the_content', 'pc_perform_contents_restriction', 999 );
}
// Cooked plugin.
if ( class_exists( 'Cooked_Plugin' ) ) {
global $_cooked_content_unfiltered;
$_cooked_content_unfiltered = true;
}
// Tutor LMS plugin.
if ( defined( 'TUTOR_VERSION' ) ) {
add_filter( 'tutor_dashboard_page_id', '__return_false' );
add_filter( 'instructor_register_page', '__return_false' );
add_filter( 'student_register_page', '__return_false' );
}
add_filter( 'dpsp_is_location_displayable', '__return_false' );
// Remove Thrive Leads.
if ( function_exists( 'tve_leads_get_default_form_types' ) ) {
foreach ( tve_leads_get_default_form_types() as $_type => $config ) {
if ( ! isset( $GLOBALS['tve_lead_forms'][ $_type ] ) || ( 'widget' !== $_type && 'php_insert' !== $_type && empty( $config['wp_hook'] ) ) ) {
continue;
}
if ( isset( $config['wp_hook'] ) ) {
remove_action( $config['wp_hook'], 'tve_leads_display_form_' . $_type, isset( $config['priority'] ) ? $config['priority'] : 10 );
}
}
}
// WP Customer Area plugin.
if ( class_exists( 'CUAR_CustomerPagesAddOn' ) && function_exists( 'cuar_addon' ) ) {
$cp_addon = cuar_addon( 'customer-pages' );
remove_filter( 'the_content', [ $cp_addon, 'define_main_content_filter' ], 9998 );
}
// Event Tickets Plus.
if ( function_exists( 'tribe_callback' ) ) {
remove_filter( 'the_content', tribe_callback( 'tickets-plus.attendee-registration.view', 'get_page_content' ) );
}
// FlexMLS IDX.
if ( class_exists( 'flexmlsConnectPage' ) ) {
remove_filter( 'the_content', [ 'flexmlsConnectPage', 'custom_post_content' ] );
}
// WP Members plugin.
if ( 1 === $this->rendering_override_loop && class_exists( 'WP_Members' ) ) {
global $wpmem;
remove_filter( 'the_content', [ $wpmem, 'do_securify' ], 99 );
}
// Optima Express plugin.
if ( class_exists( 'iHomefinderVirtualPageDispatcher' ) ) {
remove_filter( 'the_content', [ iHomefinderVirtualPageDispatcher::getInstance(), 'getContent' ], 20 );
}
// GraviteView plugin.
if ( class_exists( 'GravityView_Plugin' ) ) {
remove_action( 'the_content', [ '\GV\View', 'content' ] );
}
// PrivateContent - Bundle Pack.
if ( function_exists( 'pc_perform_contents_restriction' ) ) {
remove_filter( 'the_content', 'pc_perform_contents_restriction', 9999999 );
}
do_action( 'awb_remove_third_party_the_content_changes' );
}
/**
* Re-add the third party changes of the_content filter.
*
* @access public
* @since 2.2
* @param object|bool $override The override or false.
* @return void
*/
public function readd_third_party_the_content_changes( $override = false ) {
global $avada_events_calender, $wp_query, $post;
do_action( 'awb_readd_third_party_the_content_changes' );
if ( function_exists( 'pc_perform_contents_restriction' ) ) {
add_filter( 'the_content', 'pc_perform_contents_restriction', 9999999 );
}
if ( class_exists( 'GravityView_Plugin' ) ) {
add_action( 'the_content', [ '\GV\View', 'content' ] );
}
if ( class_exists( 'iHomefinderVirtualPageDispatcher' ) ) {
add_filter( 'the_content', [ iHomefinderVirtualPageDispatcher::getInstance(), 'getContent' ], 20 );
}
if ( 1 === $this->rendering_override_loop && class_exists( 'WP_Members' ) ) {
global $wpmem;
add_filter( 'the_content', [ $wpmem, 'do_securify' ], 99 );
}
if ( 2 > $this->rendering_override_loop && class_exists( 'bbPress' ) && Fusion_Helper::is_bbpress() && ! Fusion_Helper::is_buddypress() && ! bbp_is_template_included() && bbp_is_theme_compat_active() ) {
bbp_remove_all_filters( 'the_content' );
}
if ( class_exists( 'flexmlsConnectPage' ) ) {
global $fmc_special_page_caught;
if ( isset( $fmc_special_page_caught['fmc-page'] ) && ! is_null( $fmc_special_page_caught['fmc-page'] ) ) {
add_filter( 'the_content', [ 'flexmlsConnectPage', 'custom_post_content' ] );
}
}
if ( class_exists( 'Tribe__Events__Main' ) ) {
try {
$ar_template = tribe( 'tickets.attendee_registration.template' );
} catch ( Exception $e ) { // phpcs:ignore Generic.CodeAnalysis.EmptyStatement
$ar_template = false;
}
if ( function_exists( 'tribe' ) && class_exists( 'Tribe__Tickets__Attendee_Registration__Template' ) && is_object( $ar_template ) && $ar_template->is_on_ar_page() && $wp_query->is_main_query() && ( ! $post instanceof WP_Post || ! has_shortcode( $post->post_content, 'tribe_attendee_registration' ) ) ) {
remove_filter( 'the_content', tribe_callback( 'tickets-plus.attendee-registration.view', 'get_page_content' ) );
}
if ( ! is_null( $avada_events_calender ) ) {
add_filter( 'the_content', [ $avada_events_calender, 'single_events_blocks_sharing_box' ], 10 );
}
$queried_object = get_queried_object();
if ( function_exists( 'tribe' ) && class_exists( 'TEC\Events_Pro\Custom_Tables\V1\Series\Post_Type' ) && $queried_object instanceof WP_Post && tribe( 'TEC\Events_Pro\Custom_Tables\V1\Series\Post_Type' )->is_same_type( $queried_object ) ) {
add_filter( 'the_content', [ tribe( 'TEC\Events_Pro\Custom_Tables\V1\Templates\Series_Filters' ), 'inject_content' ] );
}
}
remove_filter( 'dpsp_is_location_displayable', '__return_false' );
if ( defined( 'TUTOR_VERSION' ) ) {
remove_filter( 'tutor_dashboard_page_id', '__return_false' );
remove_filter( 'instructor_register_page', '__return_false' );
remove_filter( 'student_register_page', '__return_false' );
}
if ( class_exists( 'Cooked_Plugin' ) ) {
global $_cooked_content_unfiltered;
$_cooked_content_unfiltered = false;
}
if ( isset( $GLOBALS['is_pc_bundle'] ) && $GLOBALS['is_pc_bundle'] ) {
add_filter( 'the_content', 'pc_perform_contents_restriction', 999 );
}
if ( is_singular( 'dwqa-question' ) ) {
global $dwqa;
$dwqa->template->remove_all_filters( 'the_content' );
}
if ( $override ) {
if ( defined( 'WP_SHARING_PLUGIN_VERSION' ) ) {
add_filter( 'the_content', 'sharing_display', 19 );
}
if ( class_exists( 'SFWD_LMS' ) ) {
SFWD_LMS::content_filter_control( true );
if ( class_exists( 'CTLearnDash' ) ) {
$custom_ld_template = CTLearnDash::get_instance();
add_filter( 'the_content', [ $custom_ld_template, 'render' ], 1001 );
}
}
// Ultimate Member.
remove_filter( 'um_ignore_restricted_content', '__return_true' );
// WooCommerce Membership.
if ( function_exists( 'wc_memberships' ) ) {
add_filter( 'the_content', [ wc_memberships()->get_restrictions_instance()->get_posts_restrictions_instance(), 'handle_restricted_post_content_filtering' ], 999 );
}
if ( function_exists( 'members_content_permissions_protect' ) ) {
add_filter( 'the_content', 'members_content_permissions_protect', 95 );
}
if ( 1 === $this->rendering_override_loop && defined( 'MEPR_PLUGIN_NAME' ) ) {
add_filter( 'the_content', 'MeprAppCtrl::page_route', 100 );
add_filter( 'the_content', 'MeprGroupsCtrl::render_pricing_boxes', 10 );
add_filter( 'the_content', 'MeprProductsCtrl::display_registration_form', 10 );
add_filter( 'the_content', 'MeprRulesCtrl::rule_content', 999999, 1 );
}
if ( class_exists( 'WordPressDownloadManager' ) ) {
add_filter( 'the_content', 'wpdm_downloadable' );
}
}
if ( class_exists( 'EM_Event_Post' ) ) {
add_filter( 'the_content', [ 'EM_Event_Post', 'the_content' ] );
}
if ( function_exists( 'tve_leads_get_default_form_types' ) ) {
foreach ( tve_leads_get_default_form_types() as $_type => $config ) {
if ( ! isset( $GLOBALS['tve_lead_forms'][ $_type ] ) || ( 'widget' !== $_type && 'php_insert' !== $_type && empty( $config['wp_hook'] ) ) ) {
continue;
}
if ( isset( $config['wp_hook'] ) ) {
add_action( $config['wp_hook'], 'tve_leads_display_form_' . $_type, isset( $config['priority'] ) ? $config['priority'] : 10 );
}
}
}
// WP Customer Area plugin.
if ( class_exists( 'CUAR_CustomerPagesAddOn' ) && function_exists( 'cuar_addon' ) ) {
$cp_addon = cuar_addon( 'customer-pages' );
add_filter( 'the_content', [ $cp_addon, 'define_main_content_filter' ], 9998 );
}
}
/**
* Removes the_content filters from third party plugins.
*
* @since 3.11.8
* @access public
* @return void
*/
public function remove_the_content_filters() {
if ( ! empty( $this->content_filters ) ) {
foreach ( $this->content_filters as $content_filter ) {
remove_filter( 'the_content', $content_filter['function'], $content_filter['priority'] );
}
} else {
global $wp_filter;
if ( isset( $wp_filter['the_content'] ) ) {
foreach ( $wp_filter['the_content'] as $index => $actions ) {
foreach ( $actions as $name => $action ) {
// Memberdash plugin.
if ( is_array( $action['function'] ) && isset( $action['function'][0] ) && is_object( $action['function'][0] ) ) {
if ( 'MS_Controller_Frontend' === get_class( $action['function'][0] ) && ( false !== strpos( $name, 'register_form' ) || false !== strpos( $name, 'verification_notification' ) || false !== strpos( $name, 'payment_table' ) || false !== strpos( $name, 'gateway_form' ) ) ) {
$this->handle_content_filter( $action['function'], $index );
}
if ( 'SimpleWpMembership' === get_class( $action['function'][0] ) && false !== strpos( $name, 'filter_content' ) ) {
$this->handle_content_filter( $action['function'], $index );
}
if ( ( 'MS_View_Shortcode_Login' === get_class( $action['function'][0] ) || 'MS_View_Frontend_Activities' === get_class( $action['function'][0] ) || 'MS_View_Frontend_Invoices' === get_class( $action['function'][0] ) || 'MS_View_Frontend_Profile' === get_class( $action['function'][0] ) ) && false !== strpos( $name, 'to_html' ) ) {
$this->handle_content_filter( $action['function'], $index );
}
if ( 'MS_Rule_Content_Model' === get_class( $action['function'][0] ) && ( false !== strpos( $name, 'check_special_page' ) || false !== strpos( $name, 'replace_more_tag_content' ) ) ) {
$this->handle_content_filter( $action['function'], $index );
}
if ( 'MS_Controller_Gateway' === get_class( $action['function'][0] ) && ( false !== strpos( $name, 'gateway_form' ) || false !== strpos( $name, 'purchase_info_content' ) || false !== strpos( $name, 'purchase_error_content' ) ) ) {
$this->handle_content_filter( $action['function'], $index );
}
}
}
}
}
}
}
/**
* Readds the_content filters from third party plugins.
*
* @since 3.11.8
* @access public
* @return void
*/
public function readd_the_content_filters() {
foreach ( $this->content_filters as $content_filter ) {
add_filter( 'the_content', $content_filter['function'], $content_filter['priority'] );
}
}
/**
* Handles third party the_content filters by removing them and adding to internal storage.
*
* @since 3.11.8
* @access public
* @param array|string $function The filter callback
* @param int $priority The priority.
* @return void
*/
public function handle_content_filter( $function, $priority ) {
remove_filter( 'the_content', $function, $priority );
$this->content_filters[] = [
'function' => $function,
'priority' => $priority,
];
}
/**
* Init shortcode files specific to templates.
*
* @since 2.2
* @access public
*/
public function init_shortcodes() {
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/author.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/comments.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/content.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/pagination.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/related.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/featured-slider.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/archives.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/meta.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/post-card-archives.php';
// WooCommerce.
if ( class_exists( 'WooCommerce' ) ) {
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-price.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-stock.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-rating.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-cart.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-product-images.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-short-description.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-reviews.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-additional-info.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-tabs.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-related.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-archives.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-filters-active.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-filters-price.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-filters-rating.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-filters-attribute.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-order-details.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-order-customer-details.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-order-table.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-order-downloads.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/components/woo-order-additional-info.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/woo-checkout-billing.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/woo-checkout-tabs.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/woo-checkout-shipping.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/woo-checkout-payment.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/woo-checkout-order-review.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/woo-notices.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/woo-upsells.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/fusion-woo-checkout-form.php';
require_once FUSION_BUILDER_PLUGIN_DIR . 'shortcodes/woo-mini-cart.php';
}
}
/**
* Make sure page is 100% width if using an override.
*
* @since 2.2
* @access public
* @param bool $fullwidth Whether it is fullwidth or not.
*/
public function is_hundred_percent_template( $fullwidth ) {
$override = $this->get_override( 'content' );
if ( $override || is_singular( 'fusion_tb_section' ) ) {
$post_id = $override ? $override->ID : get_the_id();
return ( 'no' !== fusion_get_page_option( 'fusion_tb_section_width_100', $post_id ) );
}
return $fullwidth;
}
/**
* If we are on front-end and have override, use template sidebar names.
*
* @since 2.2
* @access public
* @param array $options Full sidebar options array.
* @param int $post_type Post type for post being viewed.
* @return array.
*/
public function load_template_sidebars( $options, $post_type ) {
if ( ! is_admin() ) {
$override = $this->get_override( 'content' );
if ( is_singular( 'fusion_tb_section' ) || $override ) {
return [ 'template_sidebar', 'template_sidebar_2', 'template_sidebar_position', false ];
}
}
return $options;
}
/**
* Ensures that even search and 404 pages get the template option.
*
* @since 2.2
* @access public
* @param bool $return Whether to get page option or not.
* @return bool
*/
public function should_get_option( $return ) {
return true;
}
/**
* Replaces ID for dynamic css retrieval.
*
* @since 2.2
* @access public
* @param int $post_id Post id for what we want.
* @return int.
*/
public function replace_post_id( $post_id ) {
$override = $this->get_override( 'content' );
return ( $override ) ? $override->ID : $post_id;
}
/**
* Load the templates for live editor.
*
* @since 2.2
* @access public
*/
public function load_component_templates() {
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-author.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-archives.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-comments.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-content.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-meta.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-pagination.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-related.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-featured-slider.php';
// WooCommerce.
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-woo-price.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-woo-stock.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-woo-rating.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-woo-cart.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-woo-product-images.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-woo-short-description.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-woo-reviews.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-woo-additional-info.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-woo-tabs.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-woo-related.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-woo-archives.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-woo-filters.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-woo-order-details.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-woo-order-customer-details.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-woo-order-table.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-woo-order-downloads.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-woo-order-additional-info.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/fusion-tb-woo-checkout-billing.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/fusion-tb-woo-checkout-tabs.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/fusion-tb-woo-checkout-shipping.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/fusion-tb-woo-checkout-payment.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/fusion-tb-woo-checkout-order-review.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/fusion-tb-woo-notices.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/fusion-tb-woo-upsells.php';
// Post Card.
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/post-card-image.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/components/fusion-tb-post-card-archives.php';
include FUSION_BUILDER_PLUGIN_DIR . 'front-end/templates/post-card-cart.php';
}
/**
* Load the views for the components.
*
* @since 2.2
* @access public
*/
public function load_component_views() {
// TODO: needs added to compiled JS file.
wp_enqueue_script( 'fusion_builder_tb_author', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-author.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_tb_comments', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-comments.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_tb_pagination', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-pagination.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_tb_content', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-content.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_tb_meta', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-meta.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_tb_related', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-related.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_tb_featured_images_slider', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-featured-slider.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_tb_archives', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-archives.js', [], FUSION_BUILDER_VERSION, true );
// WooCommerce.
wp_enqueue_script( 'fusion_builder_tb_woo_price', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-woo-price.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_tb_woo_stock', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-woo-stock.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_tb_woo_rating', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-woo-rating.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_tb_woo_cart', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-woo-cart.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_tb_woo_product_images', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-woo-product-images.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_tb_woo_short_description', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-woo-short-description.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_tb_woo_reviews', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-woo-reviews.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_tb_woo_additional_info', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-woo-additional-info.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_tb_woo_tabs', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-woo-tabs.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_tb_woo_related', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-woo-related.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_tb_woo_archives', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-woo-archives.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_tb_woo_filters', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-woo-filters.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_woo_order_details', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-woo-order-details.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_woo_order_customer_details', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-woo-order-customer-details.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_woo_order_table', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-woo-order-table.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_woo_order_downloads', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-woo-order-downloads.js', [], FUSION_BUILDER_VERSION, true );
wp_enqueue_script( 'fusion_builder_woo_order_additional_info', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-woo-order-additional-info.js', [], FUSION_BUILDER_VERSION, true );
// Post Card.
wp_enqueue_script( 'fusion_builder_tb_post_card_archives', FUSION_BUILDER_PLUGIN_URL . 'front-end/views/components/view-post-card-archives.js', [], FUSION_BUILDER_VERSION, true );
}
/**
* Get example target post if exists.
*
* @since 2.2
* @access public
* @param int $page_id page id.
* @param string $type Post type.
* @return mixed
*/
public function get_target_example( $page_id = false, $type = false ) {
$page_id = ! $page_id ? get_the_id() : $page_id;
$post = false;
if ( ! $type ) {
$terms = get_the_terms( $page_id, 'fusion_tb_category' );
$type = is_array( $terms ) ? $terms[0]->name : false;
}
$post = $this->get_dynamic_content_selection( $page_id );
if ( ! $post ) {
$post = Fusion_Dummy_Post::get_dummy_post();
}
return apply_filters( 'fusion_tb_target_example', $post, $page_id, $type );
}
/**
* Get the page option from the template if not set in post.
*
* @since 2.2
* @access public
* @param array $data Full data array.
* @param string $page_id Id for post.
* @param string $post_type Post type for post being edited.
* @return mixed
*/
public function add_post_data( $data, $page_id, $post_type ) {
// Section category is used to filter components.
$terms = get_the_terms( $page_id, 'fusion_tb_category' );
$type = is_array( $terms ) ? $terms[0]->name : false;
$data['template_category'] = $type;
$post = $this->get_target_example( $page_id, $type );
if ( $post ) {
$post_type_obj = get_post_type_object( $post->post_type );
$is_term = $post instanceof WP_Term;
// We need to pause filtering to get real content.
do_action( 'fusion_pause_live_editor_filter' );
$content = apply_filters( 'the_content', $post->post_content ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
do_action( 'fusion_resume_live_editor_filter' );
// Get flattened page values.
$page_values = ! $is_term ? fusion_data()->post_meta( $post->ID )->get_all_meta() : fusion_data()->term_meta( $post->ID )->get_all_meta();
if ( is_array( $page_values ) ) {
$page_values['_thumbnail_id'] = get_post_thumbnail_id( $post->ID );
}
$data['examplePostDetails'] = [
'post_id' => $post->ID,
'post_permalink' => get_permalink( $post ),
'post_title' => -99 === $post->ID ? apply_filters( 'the_title', $post->post_title, $post->ID ) : get_the_title( $post->ID ),
'post_content' => $content,
'post_name' => $post->post_name,
'post_type' => $post->post_type,
'post_type_name' => is_object( $post_type_obj ) ? $post_type_obj->labels->singular_name : esc_html__( 'Page', 'fusion-builder' ),
'post_status' => -99 === $post->ID ? $post->post_status : get_post_status( $post->ID ),
'post_password' => $post->post_password,
'post_date' => $post->post_date,
'post_meta' => $page_values,
'is_term' => $is_term,
];
if ( $is_term ) {
$data['examplePostDetails']['post_title'] = $post->name;
}
$data = apply_filters( 'fusion_example_post_details', $data, $post );
}
return $data;
}
/**
* Add new template.
*
* @since 2.2
* @access public
* @return void
*/
public function add_new_template() {
check_admin_referer( 'fusion_tb_new_post' );
if ( ! current_user_can( apply_filters( 'awb_role_manager_access_capability', 'manage_options', 'fusion_tb_section' ) ) ) {
return;
}
if ( ! isset( $_GET['fusion_tb_category'] ) || '' === $_GET['fusion_tb_category'] ) {
// Redirect back to form page.
wp_safe_redirect( esc_url( admin_url( 'admin.php?page=avada-layout-sections' ) ) );
die();
}
$category = sanitize_text_field( wp_unslash( $_GET['fusion_tb_category'] ) );
$template = [
'post_title' => isset( $_GET['name'] ) ? sanitize_text_field( wp_unslash( $_GET['name'] ) ) : '',
'post_status' => current_user_can( 'publish_posts' ) ? 'publish' : 'pending',
'post_type' => 'fusion_tb_section',
];
$template_id = wp_insert_post( $template, true );
if ( is_wp_error( $template_id ) ) {
$error_string = $template_id->get_error_message();
wp_die( esc_html( $error_string ) );
}
$template_type = wp_set_object_terms( $template_id, $category, 'fusion_tb_category' );
if ( is_wp_error( $template_type ) ) {
$error_string = $template_type->get_error_message();
wp_die( esc_html( $error_string ) );
}
// Just redirect to back-end editor. In future tie it to default editor option.
wp_safe_redirect( awb_get_new_post_edit_link( $template_id ) );
die();
}
/**
* Add new layout.
*
* @since 2.2
* @access public
* @return void
*/
public function add_new_layout() {
check_admin_referer( 'fusion_tb_new_layout' );
if ( ! current_user_can( apply_filters( 'awb_role_manager_access_capability', 'manage_options', 'fusion_tb_section' ) ) ) {
return;
}
$layout = [
'post_title' => isset( $_GET['name'] ) ? sanitize_text_field( wp_unslash( $_GET['name'] ) ) : '',
'post_status' => current_user_can( 'publish_posts' ) ? 'publish' : 'pending',
'post_type' => 'fusion_tb_layout',
];
$layout_id = wp_insert_post( $layout, true );
if ( is_wp_error( $layout_id ) ) {
$error_string = $layout_id->get_error_message();
wp_die( esc_html( $error_string ) );
}
Fusion_Builder_Admin::save_layout_order( $layout_id, 'add' );
// Reset caches.
fusion_reset_all_caches();
$referer = wp_get_referer();
if ( $referer ) {
wp_safe_redirect( $referer );
}
die();
}
/**
* Override target post data.
*
* @since 2.2
* @access public
* @param array $post_data Post data to target.
* @return array
*/
public function dynamic_data( $post_data ) {
if ( 'fusion_tb_section' === $post_data['post_type'] || fusion_is_post_card() || 'awb_off_canvas' === $post_data['post_type'] ) {
$post = $this->get_target_example();
if ( $post ) {
$post_data['id'] = $post->ID;
$post_data['post_type'] = get_post_type( $post );
} else {
$post_data['archive'] = true;
}
}
return $post_data;
}
/**
* Override target post data.
*
* @since 2.2
* @access public
* @param int $id Post ID to target.
* @return int
*/
public function dynamic_id( $id ) {
$post_type = false;
if ( false !== strpos( $id, '-archive' ) ) {
$term = get_term_by( 'term_taxonomy_id', str_replace( '-archive', '', $id ) );
if ( isset( $term->taxonomy ) ) {
$taxonomy = get_taxonomy( $term->taxonomy );
if ( false !== $taxonomy ) {
$post_type = $taxonomy->object_type[0];
}
}
} else {
$post_type = get_post_type( $id );
}
if ( 'fusion_tb_section' === $post_type || fusion_is_post_card() || 'awb_off_canvas' === get_post_type( $id ) ) {
$post = $this->get_target_example( $id );
if ( $post ) {
return $post->ID;
}
}
return $id;
}
/**
* Checks and returns dynamic content selection data.
*
* @since 2.2
* @access public
* @param int $id Post ID to get values from.
* @return array|string $post Post data.
*/
public function get_dynamic_content_selection( $id = '' ) {
$id = ! $id ? get_the_id() : $id;
$post = $option = $value = false;
// Filter data.
if ( class_exists( 'Fusion_App' ) ) {
do_action( 'fusion_filter_data' );
}
$option = fusion_get_page_option( 'dynamic_content_preview_type', $id );
$value = fusion_get_page_option( 'preview_' . $option, $id );
if ( 'term' === $option && '' !== $value ) {
$args = [
'taxonomy' => $value,
'hide_empty' => true,
'number' => 1,
];
$terms = get_terms( $args );
// Re-index array.
if ( is_array( $terms ) && ! empty( $terms ) ) {
$terms = array_values( $terms );
return $terms[0];
}
} elseif ( ! empty( $option ) && ( ( ! empty( $value ) && '0' !== $value ) || ( is_array( $value ) && isset( $value[0] ) ) ) ) {
$post = get_post( is_array( $value ) && isset( $value[0] ) ? $value[0] : $value );
} elseif ( 'default' !== $option && '' !== $option ) {
$args = [
'numberposts' => 1,
'post_type' => $option,
];
$post = get_posts( $args );
if ( is_array( $post ) && isset( $post[0] ) ) {
return $post[0];
}
}
return $post;
}
/**
* Checks and returns post type for archives component.
*
* @since 2.2
* @access public
* @param array $defaults current params array.
* @return array $defaults Updated params array.
*/
public function archives_type( $defaults ) {
// No DB changes, we can skip the nonce checks in this function.
// phpcs:disable WordPress.Security.NonceVerification
global $post;
$type = $post_id = $option = false;
if ( fusion_is_preview_frame() || isset( $_GET['awb-studio-content'] ) ) {
$type = fusion_get_page_option( 'dynamic_content_preview_type', $post->ID );
$option = fusion_get_page_option( 'preview_archives', $post->ID );
$post_id = $post->ID;
}
if ( isset( $_POST['fusion_meta'] ) && isset( $_POST['post_id'] ) && false === $option ) {
$meta = fusion_string_to_array( $_POST['fusion_meta'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
$option = isset( $meta['_fusion']['preview_archives'] ) ? $meta['_fusion']['preview_archives'] : 'post';
$type = isset( $meta['_fusion']['dynamic_content_preview_type'] ) && in_array( $meta['_fusion']['dynamic_content_preview_type'], [ 'search', 'archives' ], true ) ? $meta['_fusion']['dynamic_content_preview_type'] : false;
$post_id = sanitize_text_field( wp_unslash( $_POST['post_id'] ) );
}
$defaults['post_type'] = 'search' !== $type && false !== $option ? $option : 'any';
// Emulate search for studio.
if ( isset( $_GET['awb-studio-content'] ) && isset( $_GET['search'] ) && 'search' === $type ) {
$defaults['s'] = trim( strip_tags( $_GET['search'] ) ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput, WordPress.Security.NonceVerification, WordPress.WP.AlternativeFunctions
$defaults['post_type'] = 'post';
}
// phpcs:enable WordPress.Security.NonceVerification
return $defaults;
}
/**
* Checks and returns taxonomy for archives component.
*
* @since 3.6
* @access public
* @param array $defaults current params array.
* @return array $defaults Updated params array.
*/
public function taxonomy_type( $defaults ) {
// No DB changes, we can skip the nonce checks in this function.
// phpcs:disable WordPress.Security.NonceVerification
global $post;
$type = $option = false;
if ( fusion_is_preview_frame() || isset( $_GET['awb-studio-content'] ) ) {
$type = fusion_get_page_option( 'dynamic_content_preview_type', $post->ID );
$option = fusion_get_page_option( 'preview_term', $post->ID );
}
if ( isset( $_POST['fusion_meta'] ) && isset( $_POST['post_id'] ) && false === $option ) {
$meta = fusion_string_to_array( $_POST['fusion_meta'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
$option = isset( $meta['_fusion']['preview_term'] ) ? $meta['_fusion']['preview_term'] : 'category';
$type = isset( $meta['_fusion']['dynamic_content_preview_type'] ) ? $meta['_fusion']['dynamic_content_preview_type'] : false;
}
if ( 'term' === $type && false !== $option ) {
$defaults['taxonomy'] = $option;
$terms = get_terms(
[
'taxonomy' => $option,
'fields' => 'ids',
'orderby' => 'id',
'order' => 'DESC',
]
);
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
$defaults['include'] = implode( ',', $terms );
}
}
// phpcs:enable WordPress.Security.NonceVerification
return $defaults;
}
/**
* Flag to pause override of content.
*
* @since 2.2
* @return void
*/
public function pause_content_filter() {
$this->override_paused = true;
}
/**
* Flag to resume override of content.
*
* @since 2.2
* @return void
*/
public function resume_content_filter() {
$this->override_paused = false;
}
/**
* Fetch templates of a type.
*
* @since 2.2
* @param string $type The template type.
* @return object
*/
public function get_templates( $type = 'content' ) {
$args = [
'post_type' => [ 'fusion_tb_section' ],
'posts_per_page' => -1,
'tax_query' => [ // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query
[
'taxonomy' => 'fusion_tb_category',
'field' => 'name',
'terms' => $type,
],
],
];
return fusion_cached_query( $args )->posts;
}
/**
* Live editor saved, reset caches when layout section is saved.
*
* @access public
* @since 2.2
* @return void
*/
public function reset_all_caches() {
$app = Fusion_App();
$post_id = $app->get_data( 'post_id' );
$post_type = get_post_type( $post_id );
// Reset caches only if it really is a layout section.
if ( 'fusion_tb_section' === $post_type ) {
fusion_reset_all_caches();
}
}
/**
* Add necessary data for builder.
*
* @access public
* @since 2.2
* @param array $data The data already added.
* @return array $data The data with panel data added.
*/
public function add_builder_data( $data ) {
$data['template_override'] = [
'content' => $this->get_override( 'content' ),
'footer' => $this->get_override( 'footer' ),
'page_title_bar' => $this->get_override( 'page_title_bar' ),
'header' => $this->get_override( 'header' ),
];
return $data;
}
/**
* Link to admin bar for builder.
*
* @access public
* @since 2.2
* @param Object $admin_bar admin bar.
* @return void
*/
public function builder_trigger( $admin_bar ) {
$live_editor = apply_filters( 'fusion_load_live_editor', true );
if ( $live_editor ) {
return;
}
$override = $this->get_override( 'content' );
if ( ! $override || ! ( is_404() || is_search() ) ) {
return;
}
$customize_url = get_the_guid( $override );
$customize_url = add_query_arg( 'fb-edit', true, $customize_url );
$admin_bar->add_node(
[
'id' => 'fb-edit',
'title' => esc_html__( 'Live Builder', 'fusion-builder' ),
'href' => $customize_url,
]
);
}
/**
* Get override notice text.
*
* @access public
* @since 2.2
* @param object $override Post object for template.
* @param string $type Type of template override.
* @return string
*/
public function get_override_text( $override, $type = 'content' ) {
if ( ! is_admin() && ! ( function_exists( 'fusion_is_preview_frame' ) && fusion_is_preview_frame() ) ) {
return;
}
$post_type = get_post_type();
if ( ! $post_type ) {
return;
}
$post_type_object = get_post_type_object( $post_type );
$labels = get_post_type_labels( $post_type_object );
/* Translators: The layout-section type. */
$type_label = ( 'layout' === $type ) ? esc_html__( 'Layout', 'fusion-builder' ) : sprintf( esc_html__( '%s Layout Section', 'fusion-builder' ), esc_html( $this->types[ $type ]['label'] ) );
$edit_link = get_edit_post_link( $override );
$title = get_the_title( $override );
if ( ! $override->ID ) {
$edit_link = admin_url( 'admin.php?page=avada-layouts' );
$title = __( 'Global', 'fusion-builder' );
}
if ( $override->ID ) {
$layout_edit_link = admin_url( "post.php?post={$override->ID}&action=edit" );
if ( function_exists( 'fusion_is_preview_frame' ) && fusion_is_preview_frame() ) {
$layout_edit_link = add_query_arg( 'fb-edit', '1', get_the_permalink( $override->ID ) );
}
return sprintf(
/* translators: %1$s: The current post type. %2$s: "header", "footer" or "page title bar". %3$s: Layouts screen title & link. %4$s: Link & title for the specific override. */
esc_html__( 'This %1$s is currently using a custom %2$s. Go to %3$s screen, or edit your %4$s', 'fusion-builder' ),
$labels->singular_name,
$type_label,
'<a target="_blank" href="' . esc_url( admin_url( 'admin.php?page=avada-layouts' ) ) . '">' . esc_html__( 'Layout', 'fusion-builder' ) . '</a>',
'<a target="_blank" href="' . esc_url( $layout_edit_link ) . '">' . esc_html( $title ) . '</a>'
);
}
return sprintf(
/* translators: 1: The current post type and the edit link. 2: "footer" or "page title bar". 3: template title & link. */
esc_html__( 'This %1$s is currently using a custom %2$s - %3$s.', 'fusion-builder' ),
$labels->singular_name,
$type_label,
'<a target="_blank" rel="noopener noreferrer" href="' . esc_url( admin_url( 'admin.php?page=avada-layouts' ) ) . '">' . esc_html( $title ) . '</a>'
);
}
/**
* Check if post type is template.
*
* @access public
* @since 3.0
* @param string $type Type of template override.
* @return bool
*/
public function is_template( $type ) {
$post_id = is_admin() ? get_the_id() : fusion_library()->get_page_id();
if ( 'fusion_tb_section' !== get_post_type( $post_id ) ) {
return false;
}
if ( $type ) {
$terms = get_the_terms( $post_id, 'fusion_tb_category' );
$category = is_array( $terms ) ? $terms[0]->name : false;
return $type === $category;
}
return true;
}
/**
* Change which tabs should show depending on template type.
*
* @access public
* @since 2.2
* @param array $pagetype_data Array of tabs for each post type.
* @param string $posttype Current post type.
* @return array
*/
public function template_tabs( $pagetype_data, $posttype ) {
if ( 'fusion_tb_section' === $posttype ) {
$post_id = is_admin() ? get_the_id() : fusion_library()->get_page_id();
$terms = get_the_terms( $post_id, 'fusion_tb_category' );
$category = is_array( $terms ) ? $terms[0]->name : false;
// Check type of template.
if ( 'footer' === $category || 'page_title_bar' === $category || 'header' === $category ) {
$pagetype_data['fusion_tb_section'] = [ 'template' ];
}
}
return $pagetype_data;
}
/**
* Renders the template custom-CSS.
*
* @access public
* @since 2.2.0
* @return void
*/
public function render_custom_css() {
$types = $this->get_template_terms();
foreach ( $types as $type => $args ) {
// Get the override.
$override = $this->get_override( $type );
// No need to do anything if we don't have an override for this type.
if ( ! $override ) {
continue;
}
// Get the custom-CSS.
$css = get_post_meta( $override->ID, '_fusion_builder_custom_css', true );
// Skip if there's no CSS.
if ( ! $css ) {
continue;
}
// Output the styles.
echo '<style type="text/css" id="fusion-builder-template-' . esc_attr( $type ) . '-css">';
echo wp_strip_all_tags( $css ); // phpcs:ignore WordPress.Security.EscapeOutput
echo '</style>';
}
}
/**
* Returns layout template conditions
*
* @access public
* @since 2.2.0
* @return array
*/
public function get_layout_conditions() {
$sections = [
'page' => $this->get_layout_section_conditions( 'page' ),
'post' => $this->get_layout_section_conditions( 'post' ),
'archive' => $this->get_layout_section_conditions_for_archives(),
];
$post_types = get_post_types(
[
'public' => true,
'show_in_nav_menus' => true,
'publicly_queryable' => true,
]
);
// Add bbpress topics.
if ( class_exists( 'bbPress' ) ) {
$post_types['topic'] = 'topic';
}
$post_types = apply_filters( 'fusion_layout_conditions_post_types', $post_types );
sort( $post_types );
// Remove post type because is already in sections.
unset( $post_types['post'] );
// Create a section for each post type.
foreach ( $post_types as $post_type ) {
$sections[ $post_type ] = $this->get_layout_section_conditions( $post_type );
}
$sections['other'] = [
'label' => esc_html__( 'Other', 'fusion-builder' ),
'conditions' => [
[
'id' => 'search_results',
'label' => esc_html__( 'Search Results', 'fusion-builder' ),
'type' => 'archives',
],
[
'id' => 'not_found',
'label' => esc_html__( '404 Page', 'fusion-builder' ),
'type' => 'singular',
],
],
];
if ( class_exists( 'WooCommerce' ) ) {
$sections['other']['conditions'][] = [
'id' => 'woo_order_received',
'label' => esc_html__( 'WooCommerce Thank You Page', 'fusion-builder' ),
'type' => 'singular',
];
}
return $sections;
}
/**
* Returns layout single section conditions
*
* @access public
* @since 2.2.0
* @param string $post_type - The post type name.
* @return array
*/
public function get_layout_section_conditions( $post_type ) {
$section = [];
$post_type_object = get_post_type_object( $post_type );
if ( ! $post_type ) {
return $section;
}
$section = [
'label' => $post_type_object->label,
'post_type' => $post_type,
];
// All condition.
$section['conditions'][] = [
'id' => 'singular_' . $post_type,
/* Translators: The post-type label. */
'label' => sprintf( esc_html__( 'All %s', 'fusion-builder' ), $post_type_object->label ),
'type' => 'singular',
];
// Specific page conditions.
if ( 'page' === $post_type ) {
$section['conditions'][] = [
'id' => 'front_page',
'label' => __( 'Front Page', 'fusion-builder' ),
'type' => 'singular',
];
}
$section['conditions'][] = [
'id' => 'specific_' . $post_type,
/* Translators: The post-type label. */
'label' => sprintf( esc_html__( 'Specific %s', 'Avada' ), $post_type_object->label ),
'type' => 'singular',
'multiple' => true,
];
if ( is_post_type_hierarchical( $post_type ) ) {
$section['conditions'][] = [
'id' => 'children_of_' . $post_type,
/* Translators: The post-type label. */
'label' => sprintf( esc_html__( 'Children of Specific %s', 'fusion-builder' ), $post_type_object->label ),
'type' => 'singular',
'multiple' => true,
];
}
$taxonomies = get_object_taxonomies( $post_type, 'objects' );
foreach ( $taxonomies as $taxonomy_id => $taxonomy ) {
if ( ! $taxonomy->public || ! $taxonomy->show_ui ) {
continue;
}
$section['conditions'][] = [
'id' => 'taxonomy_of_' . $taxonomy_id,
/* translators: 1: The post-type label. 2: The taxonomy label. */
'label' => sprintf( esc_html__( '%1$s with Specific %2$s', 'fusion-builder' ), $post_type_object->label, $taxonomy->label ),
'type' => 'archives',
'multiple' => true,
];
}
return $section;
}
/**
* Returns layout archives section conditions
*
* @access public
* @since 2.2.0
* @return array
*/
public function get_layout_section_conditions_for_archives() {
$section = [
'label' => esc_html__( 'Archives', 'fusion-builder' ),
'conditions' => [
[
'id' => 'all_archives',
'label' => esc_html__( 'All Archives Pages', 'fusion-builder' ),
'type' => 'archives',
],
],
];
// Post type archives.
$post_types = get_post_types(
[
'public' => true,
'show_in_nav_menus' => true,
'publicly_queryable' => true,
]
);
sort( $post_types );
// Create an option for each post type.
foreach ( $post_types as $post_type ) {
$post_type_object = get_post_type_object( $post_type );
if ( $post_type_object->has_archive || 'post' === $post_type ) {
$section['conditions'][] = [
'id' => 'archive_of_' . $post_type,
'type' => 'archives',
/* Translators: The post-type label. */
'label' => sprintf( esc_html__( '%s Archive Types', 'fusion-builder' ), $post_type_object->label ),
];
}
}
// Date archive.
$section['conditions'][] = [
'id' => 'date_archive',
'label' => esc_html__( 'All Date Pages', 'fusion-builder' ),
'type' => 'archives',
];
// Author archives conditions.
$section['conditions'][] = [
'id' => 'author_archive',
'label' => esc_html__( 'All Author Pages', 'fusion-builder' ),
'type' => 'archives',
];
$section['conditions'][] = [
'id' => 'author_archive_',
'label' => esc_html__( 'Specific Author Page', 'fusion-builder' ),
'type' => 'archives',
'multiple' => true,
];
$taxonomies = get_taxonomies(
[
'public' => true,
'show_ui' => true,
'_builtin' => false,
],
'objects'
);
ksort( $taxonomies );
$taxonomies = array_merge(
[
'category' => get_taxonomy( 'category' ),
'post_tag' => get_taxonomy( 'post_tag' ),
],
$taxonomies
);
foreach ( $taxonomies as $taxonomy ) {
$section['conditions'][] = [
'id' => $taxonomy->name,
/* Translators: The post-type label. */
'label' => sprintf( esc_html__( 'All %s', 'fusion-builder' ), $taxonomy->label ),
'type' => 'archives',
];
$section['conditions'][] = [
'id' => 'archive_of_' . $taxonomy->name,
/* Translators: The post-type label. */
'label' => sprintf( esc_html__( 'Specific %s', 'fusion-builder' ), $taxonomy->label ),
'type' => 'archives',
'multiple' => true,
];
}
return $section;
}
/**
* Returns layout single section child conditions
*
* @access public
* @since 2.2.0
* @param string $parent The parent condition.
* @param int $page The current page.
* @param string $search The serach string.
* @return array
*/
public function get_layout_child_conditions( $parent, $page = 1, $search = '' ) {
$is_post_type = strpos( $parent, 'specific_' ) || strpos( $parent, 'children_of_' );
$is_author = strpos( $parent, 'author_archive_' );
$posts_per_page = 10;
$conditions = [];
if ( false !== strpos( $parent, 'children_of_' ) || false !== strpos( $parent, 'specific_' ) ) {
$post_type = preg_replace( '/specific_|children_of_/', '', $parent );
$args = [
'post_status' => [ 'publish', 'private' ],
'post_type' => $post_type,
'posts_per_page' => $posts_per_page,
'paged' => $page,
's' => $search,
];
$posts = get_posts( $args );
foreach ( $posts as $post ) {
$conditions [] = [
'id' => $parent . '|' . $post->ID,
'parent' => $parent,
'label' => $post->post_title,
'type' => 'singular',
];
}
} elseif ( false !== $is_author ) {
$args = [
'number' => $posts_per_page,
'paged' => $page,
'search' => $search,
];
$users = get_users( $args );
foreach ( $users as $user ) {
$conditions[] = [
'id' => $parent . '|' . $user->ID,
'parent' => $parent,
'label' => $user->display_name,
'type' => 'archives',
];
}
} else {
$taxonomy = preg_replace( '/taxonomy_of_|archive_of_/', '', $parent );
$terms = get_terms(
[
'taxonomy' => $taxonomy,
'hide_empty' => false,
'number' => $posts_per_page,
'offset' => ( $page - 1 ) * $posts_per_page,
'search' => $search,
]
);
foreach ( $terms as $term ) {
$conditions[] = [
'id' => $parent . '|' . $term->term_id,
'parent' => $parent,
'label' => $term->name,
'slug' => $term->slug,
'type' => 'archives',
];
}
}
return $conditions;
}
/**
* Saves a new section.
*
* @access public
* @since 3.0
*/
public function clone_layout_section() {
if ( ! ( isset( $_GET['item'] ) || isset( $_POST['item'] ) || ( isset( $_REQUEST['action'] ) && 'clone_layout_section' === $_REQUEST['action'] ) ) ) { // phpcs:ignore WordPress.Security
wp_die( esc_attr__( 'No section to clone.', 'fusion-builder' ) );
}
if ( isset( $_REQUEST['_fusion_section_clone_nonce'] ) && check_admin_referer( 'clone_section', '_fusion_section_clone_nonce' ) && current_user_can( 'edit_others_posts' ) ) {
// Get the post being copied.
$id = isset( $_GET['item'] ) ? wp_unslash( $_GET['item'] ) : wp_unslash( $_POST['item'] ); // phpcs:ignore WordPress.Security
$post = get_post( $id );
// Copy the section and insert it.
if ( isset( $post ) && $post ) {
$this->clone_section( $post );
// Redirect to the all sections screen.
wp_safe_redirect( admin_url( 'admin.php?page=avada-layout-sections' ) );
exit;
} else {
/* translators: The ID not found. */
wp_die( sprintf( esc_attr__( 'Cloning failed. Section not found. ID: %s', 'fusion-builder' ), htmlspecialchars( $id ) ) ); // phpcs:ignore WordPress.Security
}
}
}
/**
* Clones a section.
*
* @access public
* @since 3.0
* @param object $post The post object.
* @return int
*/
public function clone_section( $post ) {
// Ignore revisions.
if ( 'revision' === $post->post_type ) {
return;
}
$post_meta = fusion_data()->post_meta( $post->ID )->get_all_meta();
$new_post_parent = $post->post_parent;
$new_post = [
'menu_order' => $post->menu_order,
'comment_status' => $post->comment_status,
'ping_status' => $post->ping_status,
'post_author' => $post->post_author,
'post_content' => $post->post_content,
'post_excerpt' => $post->post_excerpt,
'post_mime_type' => $post->post_mime_type,
'post_parent' => $new_post_parent,
'post_password' => $post->post_password,
'post_status' => 'publish',
/* translators: The post title. */
'post_title' => sprintf( esc_attr__( '%s ( Cloned )', 'fusion-builder' ), $post->post_title ),
'post_type' => $post->post_type,
];
// Add new section post.
$new_post_id = wp_insert_post( $new_post );
// Set a proper slug.
$post_name = wp_unique_post_slug( $post->post_name, $new_post_id, 'publish', $post->post_type, $new_post_parent );
$new_post = [];
$new_post['ID'] = $new_post_id;
$new_post['post_name'] = $post_name;
wp_update_post( $new_post );
// Post terms.
wp_set_object_terms(
$new_post_id,
wp_get_object_terms(
$post->ID,
'fusion_tb_category',
[ 'fields' => 'ids' ]
),
'fusion_tb_category'
);
// Clone section meta.
if ( ! empty( $post_meta ) ) {
foreach ( $post_meta as $key => $val ) {
fusion_data()->post_meta( $new_post_id )->set( $key, $val );
}
}
return $new_post_id;
}
/**
* Reset caches when a template or layout gets deleted.
*
* @access public
* @since 2.2.0
* @param int $pid The post-ID.
* @param WP_Post $post The post object.
* @return void
*/
public function clean_post_cache( $pid, $post ) {
if ( ! is_object( $post ) || ! isset( $post->post_type ) ) {
return;
}
if ( 'fusion_tb_section' === $post->post_type || 'fusion_tb_layout' === $post->post_type ) {
fusion_reset_all_caches();
}
}
/**
* Print extra scripts and styles in the admin footer.
*
* @access public
* @since 2.2.0
* @return void
*/
public function admin_footer() {
if ( ! $this->get_override( 'content' ) ) {
return;
}
?>
<script>
let pageTemplateDropdown = document.getElementById( 'page_template' );
if ( pageTemplateDropdown ) {
pageTemplateDropdown.setAttribute( 'disabled', true );
}
</script>
<?php
}
/**
* Return true.
* Simple helper to facilitate overriding filters.
* We use this one instead of the WP default __return_true 'cause it's more specific
* and will allow us to remove this hook without removing any user overrides.
*
* @since 7.0
* @return true
*/
public function return_true() {
return true;
}
/**
* Adds media-query styles.
*
* @access public
* @since 7.10.2
* @return void
*/
public function add_media_query_styles() {
$header = $this->get_override( 'header' );
if ( $header ) {
$position = fusion_data()->post_meta( $header->ID )->get( 'position' );
if ( 'left' === $position || 'right' === $position || fusion_is_preview_frame() ) {
$header_breakpoint = fusion_data()->post_meta( $header->ID )->get( 'header_breakpoint' );
if ( 'never' !== $header_breakpoint || fusion_is_preview_frame() ) {
Fusion_Media_Query_Scripts::$media_query_assets[] = [
'awb-side-header',
FUSION_BUILDER_PLUGIN_DIR . 'assets/css/side-header.min.css',
[],
FUSION_BUILDER_VERSION,
Fusion_Media_Query_Scripts::get_media_query_from_key( 'fusion-min-shbp' ),
];
}
}
}
}
/**
* Add CSS for layout options.
*
* @since 7.4
* @param string $dynamic_css Dynamic CSS.
* @return string
*/
public function layout_css( $dynamic_css ) {
$header = $this->get_override( 'header' );
if ( $header ) {
$position = fusion_data()->post_meta( $header->ID )->get( 'position' );
$header_color = fusion_data()->post_meta( $header->ID )->get( 'awb_header_bg_color' );
if ( 'left' === $position || 'right' === $position || fusion_is_preview_frame() ) {
$header_breakpoint = fusion_data()->post_meta( $header->ID )->get( 'header_breakpoint' );
if ( 'never' === $header_breakpoint && ! fusion_is_preview_frame() ) {
Fusion_Dynamic_CSS::enqueue_style( FUSION_BUILDER_PLUGIN_DIR . 'assets/css/side-header.min.css', FUSION_BUILDER_PLUGIN_URL . 'assets/css/side-header.min.css' );
}
$width = (int) fusion_data()->post_meta( $header->ID )->get( 'side_header_width' );
Fusion_Dynamic_CSS::add_css_var(
[
'name' => '--side_header_width',
'value' => ( ! $width ? 200 : $width ) . 'px',
'element' => ':root',
]
);
}
if ( $header_color ) {
Fusion_Dynamic_CSS::add_css_var(
[
'name' => '--awb_header_bg_color',
'value' => $header_color,
'element' => '.fusion-tb-header',
]
);
}
}
return $dynamic_css;
}
/**
* Remove hook for WCFM dashboard template.
*
* @since 3.9
* @return void
*/
public function wcfm_ignore_template() {
global $WCFM, $WCFMvm, $post; // phpcs:ignore WordPress.NamingConventions
if ( wc_post_content_has_shortcode( 'wc_frontend_manager' ) && is_user_logged_in() ) {
remove_action( 'page_template', [ $WCFM->frontend, 'wcfm_dashboard_template' ] ); // phpcs:ignore WordPress.NamingConventions
}
if ( wc_post_content_has_shortcode( 'wcfm_vendor_membership' ) && apply_filters( 'wcfm_is_allow_membership_empty_template', true ) ) {
remove_action( 'page_template', [ $WCFMvm->frontend, 'wcfm_membership_template' ] ); // phpcs:ignore WordPress.NamingConventions
}
}
}
/**
* Instantiates the Fusion_Template_Builder class.
* Make sure the class is properly set-up.
*
* @since object 2.2
* @return object Fusion_App
*/
function Fusion_Template_Builder() { // phpcs:ignore WordPress.NamingConventions
return Fusion_Template_Builder::get_instance();
}
Fusion_Template_Builder();