- WordPress core y plugins - Tema Twenty Twenty-Four configurado - Plugin allow-unfiltered-html.php simplificado - .gitignore configurado para excluir wp-config.php y uploads 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
642 lines
26 KiB
PHP
Executable File
642 lines
26 KiB
PHP
Executable File
<?php
|
|
/* global constants */
|
|
defined( 'TVE_TCB_ROOT_PATH' ) || define( 'TVE_TCB_ROOT_PATH', plugin_dir_path( __FILE__ ) );
|
|
defined( 'TVE_VERSION' ) || DEFINE( 'TVE_VERSION', include TVE_TCB_ROOT_PATH . 'version.php' );
|
|
defined( 'TVE_TCB_DB_VERSION' ) || define( 'TVE_TCB_DB_VERSION', '1.2' );
|
|
defined( 'TVE_LANDING_PAGE_TEMPLATE' ) || DEFINE( 'TVE_LANDING_PAGE_TEMPLATE', plugins_url() . '/thrive-visual-editor/landing-page/templates' );
|
|
defined( 'TVE_LANDING_PAGE_TEMPLATE_DOWNLOADED' ) || DEFINE( 'TVE_LANDING_PAGE_TEMPLATE_DOWNLOADED', plugins_url() . '/../uploads/tcb_lp_templates/templates' );
|
|
/* will we need another key for Thrive Leads ? */
|
|
defined( 'TVE_EDITOR_FLAG' ) || define( 'TVE_EDITOR_FLAG', 'tve' );
|
|
defined( 'TVE_FRAME_FLAG' ) || define( 'TVE_FRAME_FLAG', 'tcbf' );
|
|
defined( 'TVE_GLOBAL_CSS_PREFIX' ) || define( 'TVE_GLOBAL_CSS_PREFIX', ':not(#tve)' );
|
|
defined( 'TVE_TCB_CORE_INCLUDED' ) || define( 'TVE_TCB_CORE_INCLUDED', true );
|
|
defined( 'TCB_THUMBNAIL_META_KEY' ) || define( 'TCB_THUMBNAIL_META_KEY', '_tcb_template_thumb' );
|
|
define( 'TCB_CT_POST_TYPE', 'tcb_content_template' );
|
|
define( 'TVE_CLOUD_TEMPLATES_FOLDER', 'tcb_content_templates' );
|
|
define( 'TCB_MIN_WP_VERSION', '4.8' );
|
|
define( 'TVE_GLOBAL_COLOR_VAR_CSS_PREFIX', '--tcb-color-' );
|
|
define( 'TVE_LP_COLOR_VAR_CSS_PREFIX', '--tcb-tpl-color-' );
|
|
define( 'TVE_DYNAMIC_VAR_CSS_PREFIX', '--tcb-dynamic-' );
|
|
define( 'TVE_DYNAMIC_BACKGROUND_URL_VAR_CSS_PREFIX', '--tcb-dynamic-background-url-' );
|
|
define( 'TVE_DYNAMIC_COLOR_VAR_CSS_PREFIX', '--tcb-dynamic-color-' );
|
|
define( 'TVE_LOCAL_COLOR_VAR_CSS_PREFIX', '--tcb-local-color-' );
|
|
define( 'TVE_GLOBAL_GRADIENT_VAR_CSS_PREFIX', '--tcb-gradient-' );
|
|
define( 'TVE_LP_GRADIENT_VAR_CSS_PREFIX', '--tcb-tpl-gradient-' );
|
|
define( 'TVE_LOCAL_GRADIENT_VAR_CSS_PREFIX', '--tcb-local-gradient-' );
|
|
define( 'TVE_MAIN_COLOR_H', '--tcb-main-master-h' ); //Main Color Hue
|
|
define( 'TVE_MAIN_COLOR_S', '--tcb-main-master-s' ); //Main Color Saturation
|
|
define( 'TVE_MAIN_COLOR_L', '--tcb-main-master-l' ); //Main Color Lightness
|
|
define( 'TVE_MAIN_COLOR_A', '--tcb-main-master-a' ); //Main Color Alpha
|
|
define( 'TVE_GLOBAL_STYLE_CLS_PREFIX', 'tcb-global-' );
|
|
define( 'TVE_GLOBAL_STYLE_BUTTON_CLS_PREFIX', TVE_GLOBAL_STYLE_CLS_PREFIX . 'button-' );
|
|
define( 'TVE_GLOBAL_STYLE_SECTION_CLS_PREFIX', TVE_GLOBAL_STYLE_CLS_PREFIX . 'section-' );
|
|
define( 'TVE_GLOBAL_STYLE_CONTENTBOX_CLS_PREFIX', TVE_GLOBAL_STYLE_CLS_PREFIX . 'contentbox-' );
|
|
define( 'TVE_GLOBAL_STYLE_LINK_CLS_PREFIX', TVE_GLOBAL_STYLE_CLS_PREFIX . 'link-' );
|
|
define( 'TVE_GLOBAL_STYLE_TEXT_CLS_PREFIX', TVE_GLOBAL_STYLE_CLS_PREFIX . 'text-' );
|
|
defined( 'TVE_ICON_API' ) || define( 'TVE_ICON_API', '//landingpages.thrivethemes.com/cloud-api/icons-api.php' );
|
|
defined( 'TVE_IS_PROCESSING_CUSTOM_CSS' ) || define( 'TVE_IS_PROCESSING_CUSTOM_CSS', 'tve_is_processing_custom_css' );
|
|
|
|
defined( 'TVE_EXTENDED_MEMORY_LIMIT' ) || define( 'TVE_EXTENDED_MEMORY_LIMIT', '512M' );
|
|
|
|
/**
|
|
* Used to store the TCB Flag HTML Element
|
|
* Used also in TA Visual Builder
|
|
*/
|
|
defined( 'TVE_FLAG_HTML_ELEMENT' ) || define( 'TVE_FLAG_HTML_ELEMENT', '<div class="tcb_flag" style="display: none"></div>' );
|
|
|
|
global $tve_style_family_classes;
|
|
$tve_style_family_classes = [ 'Flat' => 'tve_flt' ];
|
|
|
|
// global options
|
|
global $tve_thrive_shortcodes;
|
|
|
|
/*
|
|
* theme shortcodes available in TCB
|
|
* list of shortcode identifier => callback function
|
|
* the callback function will be called with an array of attributes and must return a html code to be inserted into the DOM
|
|
*/
|
|
$tve_thrive_shortcodes = [
|
|
'post_symbol' => 'tcb_symbol_shortcode',
|
|
'optin' => 'tve_do_optin_shortcode',
|
|
'posts_list' => 'tve_do_posts_list_shortcode',
|
|
'custom_menu' => 'tve_do_custom_menu_shortcode',
|
|
'custom_phone' => 'tve_do_custom_phone_shortcode',
|
|
'post_grid' => 'tve_do_post_grid_shortcode',
|
|
'widget_menu' => 'tve_render_widget_menu',
|
|
'leads_shortcode' => 'tve_do_leads_shortcode',
|
|
'tve_leads_additional_fields_filters' => 'tve_leads_additional_fields_filters',
|
|
'social_default' => 'tve_social_render_default',
|
|
'tvo_shortcode' => 'tvo_render_shortcode',
|
|
'ultimatum_shortcode' => 'tve_ult_render_shortcode',
|
|
'quiz_shortcode' => 'tqb_render_shortcode',
|
|
'thrive_widget' => 'thrive_widget_render',
|
|
];
|
|
|
|
/**
|
|
* If a file called .flag-staging-templates exists, turn off caching of cloud templates
|
|
*/
|
|
if ( file_exists( plugin_dir_path( __FILE__ ) . ' . flag - staging - templates' ) && ! defined( 'TCB_CLOUD_API_LOCAL' ) ) {
|
|
define( 'TVE_STAGING_TEMPLATES', true );
|
|
define( 'TCB_CLOUD_API_LOCAL', 'https://staging.landingpages.thrivethemes.com/cloud-api/index-api.php' );
|
|
defined( 'TCB_TEMPLATE_DEBUG' ) || define( 'TCB_TEMPLATE_DEBUG', true );
|
|
defined( 'TCB_CLOUD_DEBUG' ) || define( 'TCB_CLOUD_DEBUG', true );
|
|
defined( 'TL_CLOUD_DEBUG' ) || define( 'TL_CLOUD_DEBUG', true );
|
|
}
|
|
|
|
if ( file_exists( plugin_dir_path( __FILE__ ) . '.flag-nocache' ) ) {
|
|
defined( 'TCB_TEMPLATE_DEBUG' ) || define( 'TCB_TEMPLATE_DEBUG', true );
|
|
defined( 'TCB_CLOUD_DEBUG' ) || define( 'TCB_CLOUD_DEBUG', true );
|
|
defined( 'TL_CLOUD_DEBUG' ) || define( 'TL_CLOUD_DEBUG', true );
|
|
}
|
|
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/traits/trait-is-singleton.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/traits/trait-has-ranges.php';
|
|
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-custom-fields-shortcode.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/compat.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/backwards.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/helpers/social.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/helpers/cloud.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/functions.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-editor-ajax.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-editor.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-elements.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-color-manager.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-font-manager.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-icon-manager.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-editor-meta-boxes.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/lightspeed/class-main.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-post.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-utils.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-content-handler.php';
|
|
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-search-form.php';
|
|
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/post-list/class-tcb-post-list.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/post-list/class-tcb-post-list-content.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/post-list/class-tcb-post-list-author-image.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/post-list/class-tcb-post-list-featured-image.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/post-list/class-tcb-post-list-user-image.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/post-list/class-tcb-post-list-shortcodes.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/post-list/pagination/class-tcb-pagination.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/post-list/pagination/class-tcb-pagination-load-more.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/post-list/pagination/class-tcb-pagination-none.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/post-list/pagination/class-tcb-pagination-numeric.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/logo/class-tcb-logo.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/post-list-filter/class-tcb-post-list-filter.php';
|
|
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/woocommerce/classes/class-main.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/smash-balloon/classes/class-main.php';
|
|
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/notifications/class-main.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/conditional-display/class-main.php';
|
|
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/video-reporting/class-main.php';
|
|
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/user-templates/class-main.php';
|
|
/* we must include these before tve_global_options_init() */
|
|
TCB\UserTemplates\Main::includes();
|
|
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/automator/class-main.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/symbols/class-tcb-symbols-post-type.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/symbols/class-tcb-symbol-template.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/symbols/class-tcb-symbols-dashboard.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/symbols/class-tcb-symbols-taxonomy.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/symbols/class-tcb-symbols-block.php';
|
|
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-menu-walker.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'landing-page/inc/class-tcb-lp-palettes.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'landing-page/inc/class-tcb-landing-page.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-lightbox.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-login-element-handler.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-user-profile-handler.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-menu-settings.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/helpers/form.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/helpers/file-upload.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/helpers/form-hooks.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-show-when.php';
|
|
require_once TVE_TCB_ROOT_PATH . 'inc/classes/class-tcb-scripts.php';
|
|
|
|
/* init the Event Manager */
|
|
require_once TVE_TCB_ROOT_PATH . 'event-manager/init.php';
|
|
|
|
//Check if the stock images service is disabled. If it is, don't include the class.
|
|
$stock_images_disabled_transient = get_transient( '_thrive_tvd_tve_stock_images_disable_service' );
|
|
//If the transient is not set, we use the option value.
|
|
$stock_images_disabled_check = false === $stock_images_disabled_transient ? get_option( 'tve_stock_images_disable_service' ) : $stock_images_disabled_transient;
|
|
|
|
//Ensure class is called only under admin, and when it is not disabled.
|
|
if ( '1' !== $stock_images_disabled_check && is_admin() ) {
|
|
// Require the Stock images class.
|
|
require_once TVE_TCB_ROOT_PATH . 'admin/includes/class-tcb-stock-images.php';
|
|
new TCB_Stock_library();
|
|
}
|
|
|
|
add_action( 'admin_init', 'tve_revert_page_to_theme' );
|
|
|
|
/* ajax calls through WP API */
|
|
add_action( 'wp_ajax_tve_social_count', 'tve_social_ajax_count' );
|
|
add_action( 'wp_ajax_nopriv_tve_social_count', 'tve_social_ajax_count' );
|
|
add_action( 'wp_ajax_tve_cf_submit', 'tve_submit_contact_form' );
|
|
add_action( 'wp_ajax_nopriv_tve_cf_submit', 'tve_submit_contact_form' );
|
|
add_action( 'admin_action_tve_new_post', 'tve_new_post' );
|
|
|
|
add_filter( 'wp_img_tag_add_loading_attr', 'tve_image_lazy_load', 10, 3 );
|
|
|
|
/**
|
|
* AJAX call to return the TCB-added content for a post
|
|
*/
|
|
add_action( 'wp_ajax_tve_get_seo_content', 'tve_get_seo_content' );
|
|
|
|
/**
|
|
* Sends an ajax response containing the TCB-saved post content, stripped of tags for yoast SEO integration
|
|
*
|
|
* @return void
|
|
*/
|
|
function tve_get_seo_content() {
|
|
$id = isset( $_POST['post_id'] ) ? (int) $_POST['post_id'] : 0;
|
|
|
|
if ( ! $id ) {
|
|
wp_send_json( [
|
|
'post_id' => 0,
|
|
'content' => '',
|
|
] );
|
|
}
|
|
/**
|
|
* Mimic the the_content filter on the post - this will return all TCB content
|
|
*/
|
|
global $post;
|
|
$post = get_post( $id );
|
|
|
|
global $wp_query;
|
|
$wp_query->query( [ 'p' => $id, 'post_type' => $post->post_type ] );
|
|
|
|
/* Make sure Architect content is parsed */
|
|
add_filter( 'the_content', 'tve_clean_wp_editor_content', - 100 );
|
|
add_filter( 'the_content', 'tve_editor_content', PHP_INT_MAX );
|
|
|
|
$content = apply_filters( 'tve_get_seo_content', '', $id );
|
|
|
|
if ( empty( $content ) ) {
|
|
/* used ob_start to avoid any output generated by tve_editor_content) */
|
|
ob_start();
|
|
the_content();
|
|
$content = ob_get_clean();
|
|
}
|
|
|
|
$content = str_replace( [ 'data-src', 'data-url' ], [ 'src', 'url' ], $content );
|
|
|
|
wp_send_json( array(
|
|
'post_id' => $id,
|
|
'content' => $content,
|
|
'is_edited_with_tar' => (int) get_post_meta( $id, 'tcb_editor_enabled', true ),
|
|
) );
|
|
}
|
|
|
|
add_action( 'wp_enqueue_scripts', 'tve_enqueue_editor_scripts' );
|
|
|
|
/**
|
|
* always enqueue the dash frontend script
|
|
*/
|
|
add_filter( 'tve_dash_enqueue_frontend', '__return_true' );
|
|
|
|
/**
|
|
* hook for social share counts via ajax
|
|
*/
|
|
add_filter( 'tve_dash_main_ajax_tcb_social', 'tve_social_dash_ajax_share_counts', 10, 2 );
|
|
|
|
/**
|
|
* Autoresponder APIs AJAX calls
|
|
*/
|
|
if ( wp_doing_ajax() || apply_filters( 'tve_leads_include_auto_responder', false ) ) {
|
|
/**
|
|
* submit Lead Generation form element via AJAX
|
|
*/
|
|
add_action( 'wp_ajax_nopriv_tve_api_form_submit', 'tve_api_form_submit' );
|
|
add_action( 'wp_ajax_tve_api_form_submit', 'tve_api_form_submit' );
|
|
add_action( 'wp_ajax_nopriv_tve_custom_form_submit', 'tve_custom_form_submit' );
|
|
add_action( 'wp_ajax_tve_custom_form_submit', 'tve_custom_form_submit' );
|
|
}
|
|
|
|
/** CONTENT REVISION HOOKS */
|
|
/**
|
|
* Append fields to be tracked of changes
|
|
* This filter is called in revisions view
|
|
*/
|
|
add_filter( '_wp_post_revision_fields', 'tve_post_revision_fields', 10, 1 );
|
|
/** Restore content to revision */
|
|
add_action( 'wp_restore_post_revision', 'tve_restore_post_to_revision', 11, 2 );
|
|
/** Decide if post has changed and save a revision for it */
|
|
add_filter( 'wp_save_post_revision_post_has_changed', 'tve_post_has_changed', 10, 3 );
|
|
|
|
add_action( 'wp_enqueue_scripts', 'tve_remove_conflicting_scripts', PHP_INT_MAX );
|
|
|
|
// add the same tve_editor_filter but on this case on Landing Page templates - only applies to TCB
|
|
add_filter( 'tve_landing_page_content', 'tve_editor_content' );
|
|
|
|
// add TCB buttons to admin post/page listing screen
|
|
add_filter( 'page_row_actions', 'thrive_page_row_buttons', 10, 2 );
|
|
add_filter( 'post_row_actions', 'thrive_page_row_buttons', 10, 2 );
|
|
|
|
add_action( 'wp_head', function () {
|
|
/* we need to always load this into the head section, because some themes styles will overwrite the font settings */
|
|
tve_load_font_css();
|
|
tve_load_global_variables();
|
|
|
|
/* load meta tags so scrapers can find them */
|
|
tve_load_meta_tags();
|
|
|
|
\TCB\Lightspeed\Main::preload_assets( get_the_ID() );
|
|
} );
|
|
|
|
// add thrive edit link to admin bar
|
|
add_filter( 'tve_dash_admin_bar_nodes', 'thrive_editor_admin_bar' );
|
|
|
|
// To fight against themes creating custom wpautop scripts and injecting rogue <br/> and <p> tags into content we have to apply shortcodes early, then add our content to the page
|
|
// at priority 101, hence the two separate "the_content" actions
|
|
if ( ! is_admin() ) {
|
|
add_action( 'wp', 'tve_wp_action' );
|
|
function tve_wp_action() {
|
|
add_filter( 'the_content', 'tve_clean_wp_editor_content', - 100 );
|
|
add_filter( 'the_content', 'tve_editor_content', is_editor_page() ? PHP_INT_MAX : 10 );
|
|
if ( tcb_editor()->is_inner_frame() ) {
|
|
global $post;
|
|
if ( ! empty( $post->post_password ) ) {
|
|
/* remove password protection on editor pages */
|
|
add_filter( 'post_password_required', '__return_false' );
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
require_once( TVE_TCB_ROOT_PATH . 'admin/class-tcb-admin.php' );
|
|
}
|
|
|
|
// manipulate social sharing hooks so that they work with TCB
|
|
if ( has_filter( 'dd_hook_wp_content' ) ) {
|
|
remove_filter( 'the_content', 'dd_hook_wp_content' );
|
|
add_filter( 'the_content', 'dd_hook_wp_content', 103 );
|
|
}
|
|
|
|
// make sure WP editor page doesn't overwrite TCB content
|
|
add_filter( 'is_protected_meta', 'tve_hide_custom_fields', 10, 2 );
|
|
|
|
add_action( 'thrive_dashboard_loaded', 'tcb_dashboard_loaded' );
|
|
|
|
/* hook for displaying the main editor page ( control panel + content frame ) - only if the tve param is present */
|
|
if ( ! empty( $_REQUEST[ TVE_EDITOR_FLAG ] ) ) {
|
|
if ( is_admin() ) {
|
|
add_action( 'init', array( tcb_editor(), 'on_admin_init' ), 20 );
|
|
/* Disable cache on editor page*/
|
|
add_action( 'init', array( tcb_editor(), 'disable_content_cache' ), 20 );
|
|
}
|
|
add_action( 'post_action_architect', array( tcb_editor(), 'post_action_architect' ), 0 );
|
|
}
|
|
|
|
add_action( 'rest_api_init', 'tcb_rest_api_init' );
|
|
|
|
function tcb_rest_api_init() {
|
|
tcb_create_admin_rest_routes();
|
|
|
|
TCB_Post_List::rest_api_init();
|
|
TCB_Logo::rest_api_init();
|
|
TCB_Post_List_Filter::rest_api_init();
|
|
|
|
if ( ! empty( $_POST['tar_editor_page'] ) && TCB_Product::has_external_access() ) {
|
|
TCB_Utils::restore_post_waf_content();
|
|
}
|
|
}
|
|
|
|
// hook for detecting if a post is setup as a Custom Editable piece of content
|
|
add_action( 'template_redirect', 'tcb_custom_editable_content', 9 );
|
|
|
|
/**
|
|
* filter used to clean meta-data stuff from the content, when displaying it on frontend, e.g.: lead generation code being saved in the HTML causes SEO issues
|
|
*/
|
|
add_filter( 'tcb_clean_frontend_content', 'tcb_clean_frontend_content' );
|
|
|
|
/**
|
|
* init the Pinterest SDK
|
|
*/
|
|
add_action( 'tve_socials_init_pinterest', 'tve_socials_init_pinterest' );
|
|
|
|
add_filter( 'tve_filter_custom_fonts_for_enqueue_in_editor', 'tve_filter_custom_fonts_for_enqueue_in_editor' );
|
|
|
|
/**
|
|
* shows a message in the main media uploader window that states: "Only .xxx files are allowed"
|
|
*/
|
|
add_action( 'post-upload-ui', 'tve_media_restrict_filetypes' );
|
|
|
|
add_action( 'init', function () {
|
|
|
|
/* use settings API to store non post-level settings */
|
|
tve_global_options_init();
|
|
|
|
/* hook to defined location of translations files */
|
|
tve_load_plugin_textdomain();
|
|
|
|
/* only TCB-specific classes should be loaded here */
|
|
tve_load_tcb_classes();
|
|
|
|
\TCB\Notifications\Main::init();
|
|
|
|
\TCB\ConditionalDisplay\Main::init();
|
|
|
|
\TCB\UserTemplates\Main::init();
|
|
|
|
\TCB\Integrations\SmashBalloon\Main::init();
|
|
|
|
TCB_Menu_Settings::init();
|
|
|
|
TCB_Editor_Meta_Boxes::init();
|
|
|
|
\TCB\VideoReporting\Main::init();
|
|
} );
|
|
|
|
\TCB\Lightspeed\Main::init();
|
|
|
|
add_action( 'wp_footer', array( tcb_editor(), 'inner_frame_menus' ), 100 );
|
|
add_action( 'wp', array( tcb_editor(), 'clean_inner_frame' ) );
|
|
|
|
/**
|
|
* Actions used for handling the interim login ( login via popup in TCB editor page )
|
|
*/
|
|
add_filter( 'tvd_auth_check_data', 'tcb_auth_check_data' );
|
|
|
|
add_action( 'thrive_prepare_migrations', 'tcb_prepare_db_migrations' );
|
|
|
|
|
|
if ( ! function_exists( 'tve_editor_url' ) ) {
|
|
/**
|
|
* @return string the absolute url to this plugin's folder
|
|
*
|
|
* @param string $file optional, a path inside the plugin folder
|
|
*/
|
|
function tve_editor_url( $file = null ) {
|
|
return rtrim( TVE_EDITOR_URL . ( null !== $file ? ltrim( $file, '/\\' ) : '' ), '/' );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Enable unavailable shortcode tooltips inside the editor
|
|
*/
|
|
add_filter( 'td_smartsite_shortcode_tooltip', 'is_editor_page_raw' );
|
|
|
|
/**
|
|
* Symbol css backwards compatible
|
|
*/
|
|
add_filter( 'tcb_symbol_css_before', 'symbols_css_backwards_compatible', 10, 2 );
|
|
|
|
/* Replace tve_editor from css with global css prefix ( :not(#tve) )*/
|
|
add_filter( 'tcb_custom_css', 'tcb_custom_css' );
|
|
|
|
/**
|
|
*Replaces element type with post_list if the type is post_list_featured
|
|
*/
|
|
add_filter( 'tcb_cloud_templates_replace_featured_type', [ 'TCB_Post_List', 'featured_type_replace' ] );
|
|
|
|
/**
|
|
*Replaces element tag with post_list_featured if the type is post_list_featured
|
|
*/
|
|
add_filter( 'tcb_cloud_templates_replace_featured_tag', [ 'TCB_Post_List', 'post_list_tag_replace' ], 10, 2 );
|
|
|
|
/**
|
|
* Checks if the post type is not blacklisted
|
|
*/
|
|
add_filter( 'tve_allowed_post_type', 'tar_is_post_type_allowed', 10, 2 );
|
|
|
|
/**
|
|
* Default styles - printed earlier than global style, only on non-editor pages
|
|
*/
|
|
add_action( 'wp_head', function () {
|
|
if ( tcb_should_print_unified_styles() ) {
|
|
tcb_print_frontend_styles();
|
|
}
|
|
}, 90, 0 );
|
|
|
|
/**
|
|
* Backwards compatibility
|
|
* Replace #tve_editor with the new selector
|
|
*
|
|
* Also checks if the disable css option is checked from Thrive Dashboard.
|
|
* If so, we strip the import statements from the css string
|
|
*
|
|
* Gets called from all products that have TAR as a dependency
|
|
*
|
|
* @param $css
|
|
*
|
|
* @return string
|
|
*/
|
|
function tcb_custom_css( $css ) {
|
|
// Remove extra double quotes from the css.
|
|
$css = str_replace( array( '"\\"', '\\""' ), '"', $css );
|
|
|
|
if ( function_exists( 'tve_dash_is_google_fonts_blocked' ) && tve_dash_is_google_fonts_blocked() ) {
|
|
$css = preg_replace( '/@import url\((\\\)?\"(http:|https:)?\/\/fonts\.(googleapis|gstatic)\.com([^)]*)\);/', '', $css );
|
|
}
|
|
|
|
/**
|
|
* Whether the css should be minified or not
|
|
*/
|
|
if ( apply_filters( 'tve_should_minify_css', true ) ) {
|
|
$css = tve_minify_css( $css );
|
|
}
|
|
|
|
return str_replace( '#tve_editor', tcb_selection_root(), $css );
|
|
}
|
|
|
|
/**
|
|
* Try some css minification
|
|
*
|
|
* @param string $css
|
|
*
|
|
* @return string
|
|
*/
|
|
function tve_minify_css( $css = '' ) {
|
|
|
|
/* replace new line with empty space */
|
|
$css = preg_replace( '/\n|\r/m', '', $css );
|
|
|
|
/* replace more than two spaces with just one space */
|
|
$css = preg_replace( '/\s{2,}/m', '', $css );
|
|
|
|
/* remove spaces before and after , : and ; */
|
|
$css = preg_replace_callback( '/\s*([,;{}])(?!:)\s*/m', static function ( $match ) {
|
|
return $match[1];
|
|
}, $css );
|
|
|
|
return $css;
|
|
}
|
|
|
|
/**
|
|
* render all necessary things for page-level event manager
|
|
*
|
|
* @param array $events
|
|
*/
|
|
if ( ! function_exists( 'tve_page_events' ) ) {
|
|
function tve_page_events( $events = [] ) {
|
|
$triggers = tve_get_event_triggers( 'page' );
|
|
$actions = tve_get_event_actions( 'page' );
|
|
|
|
/* hold all the javascript callbacks required for the identified actions */
|
|
$javascript_callbacks = isset( $GLOBALS['tve_event_manager_callbacks'] ) ? $GLOBALS['tve_event_manager_callbacks'] : [];
|
|
|
|
/* holds all the Global JS required by different actions and event triggers on page load */
|
|
$registered_javascript_globals = isset( $GLOBALS['tve_event_manager_global_js'] ) ? $GLOBALS['tve_event_manager_global_js'] : [];
|
|
|
|
/* hold all instances of the Action classes in order to output stuff in the footer, we need to get out of the_content filter */
|
|
$registered_actions = isset( $GLOBALS['tve_event_manager_actions'] ) ? $GLOBALS['tve_event_manager_actions'] : [];
|
|
|
|
/* each trigger instance might also need a bit of javascript to trigger it */
|
|
$registered_triggers = isset( $GLOBALS['tve_event_manager_triggers'] ) ? $GLOBALS['tve_event_manager_triggers'] : [];
|
|
|
|
/*
|
|
* all page level events
|
|
*/
|
|
foreach ( $events as $index => $event_config ) {
|
|
if ( empty( $event_config['t'] ) || empty( $event_config['a'] ) || ! isset( $triggers[ $event_config['t'] ] ) || ! isset( $actions[ $event_config['a'] ] ) ) {
|
|
continue;
|
|
}
|
|
/** @var TCB_Event_Action_Abstract $action */
|
|
$action = $actions[ $event_config['a'] ];
|
|
$registered_actions [] = [
|
|
'class' => $action,
|
|
'event_config' => $event_config,
|
|
];
|
|
|
|
/** @var TCB_Event_Trigger_Abstract $trigger */
|
|
$trigger = $triggers[ $event_config['t'] ];
|
|
$registered_triggers [] = [
|
|
'class' => $trigger,
|
|
'event_config' => $event_config,
|
|
];
|
|
|
|
if ( ! isset( $javascript_callbacks[ $event_config['a'] ] ) ) {
|
|
$javascript_callbacks[ $event_config['a'] ] = $action->getJsActionCallback();
|
|
}
|
|
if ( ! isset( $registered_javascript_globals[ 'action_' . $event_config['a'] ] ) ) {
|
|
$registered_javascript_globals[ 'action_' . $event_config['a'] ] = $action;
|
|
}
|
|
if ( ! isset( $registered_javascript_globals[ 'trigger_' . $event_config['t'] ] ) ) {
|
|
$registered_javascript_globals[ 'trigger_' . $event_config['t'] ] = $trigger;
|
|
}
|
|
}
|
|
|
|
if ( empty( $javascript_callbacks ) ) {
|
|
return;
|
|
}
|
|
|
|
/* we need to add all the javascript callbacks into the page */
|
|
/* this cannot be done using wp_localize_script WP function, as each if the callback will actually be JS code */
|
|
///euuuughhh
|
|
|
|
$GLOBALS['tve_event_manager_callbacks'] = $javascript_callbacks;
|
|
$GLOBALS['tve_event_manager_global_js'] = $registered_javascript_globals;
|
|
$GLOBALS['tve_event_manager_actions'] = $registered_actions;
|
|
$GLOBALS['tve_event_manager_triggers'] = $registered_triggers;
|
|
|
|
/* execute the mainPostCallback on all of the related actions, some of them might need to register stuff (e.g. lightboxes) */
|
|
foreach ( $GLOBALS['tve_event_manager_actions'] as $key => $item ) {
|
|
if ( empty( $item['main_post_callback_'] ) ) {
|
|
$GLOBALS['tve_event_manager_actions'][ $key ]['main_post_callback_'] = true;
|
|
$item['class']->mainPostCallback( $item['event_config'] );
|
|
}
|
|
}
|
|
|
|
/* remove previously assigned callback, if any */
|
|
remove_action( 'wp_print_footer_scripts', 'tve_print_footer_events', - 50 );
|
|
add_action( 'wp_print_footer_scripts', 'tve_print_footer_events', - 50 );
|
|
}
|
|
}
|
|
|
|
|
|
add_filter( 'tve_frontend_options_data', 'tve_frontend_data' );
|
|
|
|
/**
|
|
* Smart complete related stuff added through a filter so other plugins can use smart complete when TAr doesnt laod the frontend files directly
|
|
*
|
|
* @param $frontend_options
|
|
*
|
|
* @return mixed
|
|
*/
|
|
function tve_frontend_data( $frontend_options ) {
|
|
$is_editor = is_editor_page();
|
|
$frontend_options['ip'] = tve_dash_get_ip();
|
|
$frontend_options['current_user'] = tve_current_user_data();
|
|
|
|
if ( isset( $frontend_options['is_single'] ) && $frontend_options['is_single'] === '1' ) {
|
|
$post_id = get_the_ID();
|
|
$frontend_options['post_id'] = $post_id;
|
|
$frontend_options['post_title'] = get_the_title();
|
|
$frontend_options['post_type'] = get_post_type();
|
|
$frontend_options['post_url'] = get_permalink();
|
|
if ( ! $is_editor ) {
|
|
$tcb_post = tcb_post( $post_id );
|
|
$frontend_options['is_lp'] = $tcb_post->is_landing_page();
|
|
}
|
|
}
|
|
|
|
if ( ! $is_editor ) {
|
|
$frontend_options['post_request_data'] = empty( $_POST ) ? [] : $_POST;
|
|
}
|
|
|
|
return $frontend_options;
|
|
}
|
|
|
|
add_action( 'after_switch_theme', 'tve_reset_cloud_templates' );
|
|
|
|
/**
|
|
* On theme switch we delete the Cloud Template Cache from transients
|
|
*/
|
|
function tve_reset_cloud_templates() {
|
|
delete_transient( tve_get_cloud_templates_transient_name() );
|
|
}
|
|
|
|
add_action( 'wp_footer', function () {
|
|
/**
|
|
* In case the login element has refresh page and success message enabled then after refresh this show the success message
|
|
*/
|
|
echo "<script type='text/javascript'>";
|
|
include( 'editor/js/inline/toast-message.js' );
|
|
echo '</script>';
|
|
} );
|