3367 lines
112 KiB
PHP
3367 lines
112 KiB
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;
|
|
|
|
remove_filter( 'the_content', 'prepend_attachment' );
|
|
|
|
// 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' );
|
|
|
|
add_filter( 'the_content', 'prepend_attachment' );
|
|
|
|
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();
|