Files
roi-theme/wp-content/plugins/thrive-ultimatum/tcb-bridge/tcb_hooks.php
root a22573bf0b Commit inicial - WordPress Análisis de Precios Unitarios
- 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>
2025-11-03 21:04:30 -06:00

1332 lines
40 KiB
PHP
Executable File

<?php
/**
* Used to group all the functionality of the TCB bridge into the existing TCB plugin (or the bundled tcb plugin)
* This is included for both stand-alone TCB installations and for bundled tcb installations
*/
/**
* Filter that gets called when the following situation occurs:
* TCB is installed and enabled, but there is no active license activated
* in this case, we should only allow users to edit: tve_ult_campaign
*/
add_filter( 'tcb_skip_license_check', 'tve_ult_tcb_license_override' );
/**
* called when enqueuing scripts from the editor on editor page. it needs to check if TU has a valid license
*/
add_filter( 'tcb_user_can_edit', 'tve_ult_editor_check_license' );
/**
* called when enqueuing scripts on editor pages. It checks if the separate TCB plugin has the required version
*/
add_filter( 'tcb_user_can_edit', 'tve_ult_editor_check_tcb_version' );
/**
* get the editing layout for designs
*/
add_filter( 'tcb_custom_post_layouts', 'tve_ult_editor_layout', 10, 3 );
/**
* modify the localization parameters for the javascript on the editor page (in editing mode)
*/
add_filter( 'tcb_editor_javascript_params', 'tve_ult_editor_javascript_params', 10, 3 );
/**
* main entry point for template-related actions: choose new template, reset current template
*/
add_action( 'wp_ajax_' . TVE_Ult_Const::ACTION_TEMPLATE, 'tve_ult_template_action' );
/**
* main entry point for state-related actions: add state, delete state, edit state name
*/
add_action( 'wp_ajax_' . TVE_Ult_Const::ACTION_STATE, 'tve_ult_state_action' );
/**
* action hook that overrides the default tve_save_post action from the editor
* used to save the editor contents in custom post fields specific
*/
add_action( 'tcb_ajax_' . TVE_Ult_Const::ACTION_SAVE_DESIGN_CONTENT, 'tve_ult_editor_save_content' );
/**
* we need to modify the preview URL for tve_form_type post types
*/
add_filter( 'tcb_editor_preview_link_query_args', 'tve_ult_editor_append_preview_link_args', 10, 2 );
/**
* TCB 2.0 HOOKS !!
*/
/**
* Adds ULTIMATUM product to TCB
*/
add_filter( 'tcb_element_instances', 'tve_ult_add_product_to_tcb', 10, 1 );
/**
* Remove Some Plugin Instances From TCB - Ultimatum Editor
*/
add_filter( 'tcb_remove_instances', 'tve_ult_remove_element_instances', 10, 1 );
/**
* Includes the TQB Modal template files
*/
add_filter( 'tcb_modal_templates', 'tve_ult_modal_files', 10, 1 );
/**
* Adds extra script(s) to the main frame
*/
add_action( 'tcb_main_frame_enqueue', 'tve_ult_add_script_to_main_frame', 10, 0 );
/**
* Setup Ajax Action Hook
*/
add_action( 'wp_ajax_tve_ult_fetch_countdown_for_editor', 'tve_ult_fetch_countdown_for_editor' );
/**
* Adds extra SVG icons to editor page
*/
add_action( 'tcb_editor_iframe_after', 'tve_ult_output_extra_control_panel_svg', 10, 0 );
/**
* Output extra iFrame SVG
*/
add_action( 'tcb_output_extra_editor_svg', 'tve_ult_output_extra_iframe_svg', 10, 0 );
/**
* Include Ultimatum Countdown Component Menu
*/
add_filter( 'tcb_menu_path_ultimatum_countdown', 'tve_ult_include_ultimatum_countdown_menu', 10, 1 );
/**
* Enables Template Tab in Settings Section
*/
add_filter( 'tcb_has_templates_tab', 'tve_ult_enable_template_tab', 10, 1 );
/**
* Disable Revision Manager For Ultimatum Pages
*/
add_filter( 'tcb_has_revision_manager', 'tve_ult_disable_revision_manager', 10, 1 );
/**
* Disable Page Events for Ultimatum Pages
*/
add_filter( 'tcb_can_use_page_events', 'tve_ult_disable_page_events', 10, 1 );
/**
* Outputs the state HTML for the form being edited
*/
add_action( 'tcb_hook_editor_footer', 'tve_ult_output_editor_states' );
/**
* Disable Countdown Controls(except Color) Ultimatum Editor//
*/
add_filter( 'tcb_countdown_controls', 'tve_ult_disable_controls', 10, 1 );
/**
* Disable Countdown Evergreen Menu Layout in Ultimatum Editor
*/
add_filter( 'tcb_menu_path_countdownevergreen', 'tve_ult_disable_menu_layouts', 10, 1 );
/**
* Modify TCB Close Url For Ultimatum Editor
*/
add_filter( 'tcb_close_url', 'tve_ult_tcb_close_url', 10, 1 );
/**
* Add some Ultimatum post types to Architect Post Grid Element Banned Types
*/
add_filter( 'tcb_post_grid_banned_types', 'tve_ult_tcb_add_post_grid_banned_types', 10, 1 );
add_filter( 'architect.branding', 'tve_ult_architect_branding' );
/**
* Adds TU query string variation to preview link
*/
add_filter( 'preview_post_link', 'tve_ult_preview_post_link', 10, 2 );
/**
* called when trying to edit a post to check TU capability with TA deactivated
*/
add_filter( 'tcb_user_has_plugin_edit_cap', 'tve_ult_user_can_use_plugin' );
/**
* filter for structuring extra actions needed in the editor page
*/
add_filter( 'tcb_event_manager_action_tabs', 'tve_ult_editor_actions' );
add_filter( 'tcb_event_action_classes', 'tve_ult_load_action_classes' );
add_filter( 'tcb_backbone_templates', 'tve_ult_editor_backbone_templates' );
add_filter( 'tcb_post_visibility_options_availability', 'tve_ult_post_visibility_options' );
/**
* Adds Template Tab Menu Items
*/
add_action( 'tcb_right_sidebar_top_settings', static function() {
$post_type = get_post_type();
if ( tve_ult_is_editable( $post_type ) ) {
include TVE_Ult_Const::plugin_path( 'tcb-bridge/editor-layouts/element-menus/reset-settings.php' );
}
} );
add_action( 'tcb_right_sidebar_content_settings', static function() {
$post_type = get_post_type();
if ( tve_ult_is_editable( $post_type ) ) {
include TVE_Ult_Const::plugin_path( 'tcb-bridge/editor-layouts/element-menus/content-settings.php' );
}
} );
/**
* Overwrite tcb attributes on ultimatum post types
*/
add_filter( 'tve_lcns_attributes', static function ( $attributes, $post_type ) {
$tag = 'tu';
if ( in_array( $post_type, [
TVE_Ult_Const::POST_TYPE_NAME_FOR_SCHEDULE,
TVE_Ult_Const::POST_TYPE_NAME_FOR_CAMPAIGN,
], true ) ) {
return [
'source' => $tag,
'exp' => ! TD_TTW_User_Licenses::get_instance()->has_active_license( $tag ),
'gp' => TD_TTW_User_Licenses::get_instance()->is_in_grace_period( $tag ),
'show_lightbox' => TD_TTW_User_Licenses::get_instance()->show_gp_lightbox( $tag ),
'link' => tvd_get_individual_plugin_license_link( $tag ),
'product' => 'Thrive Ultimatum',
];
}
return $attributes;
}, 10, 2 );
/**
* Ultimatum custom actions
*
* @param $action_tabs
*
* @return mixed
*/
function tve_ult_editor_actions( $action_tabs ) {
$classes = tve_ult_load_action_classes( array() );
$post_id = get_the_ID();
if ( tve_ult_is_editable( $post_id ) ) {
$action_tabs['custom']['actions']['tve_ult_close'] = array(
'class' => $classes['tve_ult_close'],
'order' => 20,
'available' => true,
);
}
return $action_tabs;
}
/**
* Post visibility options blacklist
*
* @param $post_types
*
* @return array
*/
function tve_ult_post_visibility_options( $post_types ) {
$post_types = array_merge( $post_types, array(
TVE_Ult_Const::POST_TYPE_NAME_FOR_CAMPAIGN,
TVE_Ult_Const::POST_TYPE_NAME_FOR_SCHEDULE,
) );
return $post_types;
}
/**
* Ultimatum custom actions classes
*
* @param $actions
*
* @return mixed
*/
function tve_ult_load_action_classes( $actions ) {
require_once dirname( __FILE__ ) . '/event-manager/actions/Thrive_Ultimatum_Form_Close_Action.php';
$actions['tve_ult_close'] = 'Thrive_Ultimatum_Form_Close_Action';
return $actions;
}
/**
* Ultimatum templates
*
* @param array $templates
*
* @return array
*/
function tve_ult_editor_backbone_templates( $templates = array() ) {
$templates = array_merge( $templates, tve_dash_get_backbone_templates( plugin_dir_path( dirname( __FILE__ ) ) . 'inc/backbone', 'backbone' ) );
return $templates;
}
/**
* Check if the post can be edited by checking access and key
*
* @param $valid
*
* @return bool
*/
function tve_ult_user_can_use_plugin( $valid ) {
if ( ! empty( $_REQUEST['post_id'] ) && tve_ult_is_editable( $_REQUEST['post_id'] ) ) {
$valid = true;
}
if ( empty( $_GET[ TVE_Ult_Const::DESIGN_QUERY_KEY_NAME ] ) ) {
return $valid;
}
if ( ! TU_Product::has_access() ) {
return false;
}
return true;
}
/**
* Adds TU query string variation to preview link
*
* @param $preview_link
* @param $post
*
* @return string
*/
function tve_ult_preview_post_link( $preview_link, $post ) {
if ( tve_ult_is_editable( get_post_type( $post ) ) && ! empty( $_GET[ TVE_Ult_Const::DESIGN_QUERY_KEY_NAME ] ) ) {
$preview_link = add_query_arg( array(
TVE_Ult_Const::DESIGN_QUERY_KEY_NAME => $_GET[ TVE_Ult_Const::DESIGN_QUERY_KEY_NAME ],
), $preview_link );
}
return $preview_link;
}
/**
* Adds Ultimatum Product To TCB
*
* @param array $elements
*
* @return mixed
*/
function tve_ult_add_product_to_tcb( $elements = array() ) {
$post_type = get_post_type();
if ( empty( $post_type ) || tve_ult_is_editable( $post_type ) ) {
require_once TVE_Ult_Const::plugin_path( 'tcb-bridge/editor-elements/class-tcb-ultimatum-shortcode-element.php' );
require_once TVE_Ult_Const::plugin_path( 'tcb-bridge/editor-elements/class-tcb-ultimatum-bar-element.php' );
require_once TVE_Ult_Const::plugin_path( 'tcb-bridge/editor-elements/class-tcb-ultimatum-widget-element.php' );
require_once TVE_Ult_Const::plugin_path( 'tcb-bridge/editor-elements/class-tcb-ultimatum-close-bar-element.php' );
$elements['ultimatum_shortcode'] = new TCB_Ultimatum_Shortcode_Element( 'ultimatum_shortcode' );
$elements['ultimatum_bar'] = new TCB_Ultimatum_Bar_Element( 'ultimatum_bar' );
$elements['ultimatum_widget'] = new TCB_Ultimatum_Widget_Element( 'ultimatum_widget' );
if ( tve_ult_allow_cloud_templates() ) {
$elements['ultimatum_close'] = new TCB_Ultimatum_Close_Bar_Element( 'ultimatum_close' );
}
} else {
require_once TVE_Ult_Const::plugin_path( 'tcb-bridge/editor-elements/class-tcb-ultimatum-countdown-element.php' );
$elements['ultimatum_countdown'] = new TCB_Ultimatum_Countdown_Element( 'ultimatum_countdown' );
}
return $elements;
}
/**
* Disable Menu Layout For Some Elements in Ultimatum Editor
*
* @param string $menu_path
*
* @return bool|string
*/
function tve_ult_disable_menu_layouts( $menu_path = '' ) {
$post_type = get_post_type();
if ( tve_ult_is_editable( $post_type ) ) {
return false;
}
return $menu_path;
}
/**
* Disables all Countdown controls(except Color) on TU editor
*
* @param $controls
*
* @return mixed
*/
function tve_ult_disable_controls( $controls ) {
$post_type = get_post_type();
if ( tve_ult_is_editable( $post_type ) ) {
$disabled_controls = array(
'.tve-control:not([data-view="CountdownPalette"]):not([data-view="Color"]):not([data-view="Size"]):not([data-view="ShowSep"]):not([data-view="VisibleTiles"])',
'.control-grid:not(.color-picker-control):not(.color-picker-input):not([data-view="VisibleTiles"] *):not([data-view="Size"] *):not([data-view="ShowSep"] *):not([data-view="CountdownPalette"] *)',
);
if ( ! empty( $controls['countdown'] ) ) {
$controls['countdown']['disabled_controls'] = $disabled_controls;
}
if ( ! empty( $controls['countdown_old'] ) ) {
$controls['countdown_old']['disabled_controls'] = $disabled_controls;
}
}
return $controls;
}
/**
* Remove Elements Instances
*
* @param array $elements
*
* @return array
*/
function tve_ult_remove_element_instances( $elements = array() ) {
$post_type = get_post_type();
if ( tve_ult_is_editable( $post_type ) ) {
/**
* Remove Thrive Leads ShortCode
*/
if ( ! empty( $elements['tl_shortcode'] ) ) {
unset( $elements['tl_shortcode'] );
}
/**
* Remove Quiz Builder ShortCode
*/
if ( ! empty( $elements['quiz'] ) ) {
unset( $elements['quiz'] );
}
}
return $elements;
}
/**
* Includes the Ultimatum Modal template files
*
* @param array $files existing modal files
*
* @return array
*/
function tve_ult_modal_files( $files = array() ) {
$post_type = get_post_type();
if ( tve_ult_is_editable( $post_type ) ) {
if ( tve_ult_allow_cloud_templates() ) {
$files[] = TVE_Ult_Const::plugin_path( 'tcb-bridge/editor-lightbox/design-cloud-templates.php' );
} else {
$files[] = TVE_Ult_Const::plugin_path( 'tcb-bridge/editor-lightbox/design-templates.php' );
$files[] = TVE_Ult_Const::plugin_path( 'tcb-bridge/editor-lightbox/design-reset.php' );
}
$files[] = TVE_Ult_Const::plugin_path( 'tcb-bridge/editor-lightbox/design-save.php' );
$files[] = TVE_Ult_Const::plugin_path( 'tcb-bridge/editor-lightbox/add-edit-state.php' );
} else {
$files[] = TVE_Ult_Const::plugin_path( 'tcb-bridge/editor-lightbox/campaign-shotcodes.php' );
}
return $files;
}
/**
* Modifies Thrive Architect close URL when in Ultimatum Editor
*
* @param string $close_url
*
* @return string
*/
function tve_ult_tcb_close_url( $close_url = '' ) {
$post_type = get_post_type();
if ( tve_ult_is_editable( $post_type ) ) {
$close_url = 'javascript:window.close();';
}
return $close_url;
}
/**
* Add some Ultimatum post types to Architect Post Grid Element Banned Types
*
* @param $banned_types
*
* @return array
*/
function tve_ult_tcb_add_post_grid_banned_types( $banned_types ) {
$banned_types[] = TVE_Ult_Const::POST_TYPE_NAME_FOR_CAMPAIGN;
$banned_types[] = TVE_Ult_Const::POST_TYPE_NAME_FOR_SCHEDULE;
return $banned_types;
}
/**
* Adds Extra Scripts to Main Frame
*/
function tve_ult_add_script_to_main_frame() {
$post_type = get_post_type();
if ( tve_ult_is_editable( $post_type ) ) {
global $design;
if ( empty( $design ) ) {
$design = tve_ult_get_design( $_GET[ TVE_Ult_Const::DESIGN_QUERY_KEY_NAME ] );
}
$template_type = tve_ult_get_template_name( $design['post_type'] );
$allow_cloud_tpls = tve_ult_allow_cloud_templates();
$page_data = array(
'design_id' => $design['id'],
'post_id' => $design['post_parent'],
'tpl_action' => TVE_Ult_Const::ACTION_TEMPLATE,
'state_action' => TVE_Ult_Const::ACTION_STATE,
'ajaxurl' => admin_url( 'admin-ajax.php' ),
'has_content' => ! empty( $design['content'] ),
'security' => wp_create_nonce( 'tve-ult-verify-track-sender-672' ),
'L' => array(
'fetching_saved_templates' => __( 'Fetching saved templates...', 'thrive-ult' ),
'tpl_name_required' => __( 'Please enter a template name, it will be easier to reload it after.', 'thrive-ult' ),
'tpl_existing_name' => __( 'That template name already exists, please use another name', 'thrive-ult' ),
'state_name_required' => __( 'Please enter a name for the state so you can easily identify it', 'thrive-ult' ),
),
'design_type' => $template_type,
'with_cloud_tpl' => $allow_cloud_tpls,
);
if ( $allow_cloud_tpls ) {
if ( empty( $design['content'] ) ) {
$page_data['placeholder'] = tcb_template( 'elements/element-placeholder', array(
'icon' => $template_type,
'class' => 'tcb-ct-placeholder tve-ult-cloud-placeholder',
'title' => __( 'Insert template', 'thrive-ult' ),
), true );
}
$page_data['saved_tpls'] = TU_Template_Manager::get_saved_templates_data( $template_type );
}
tve_ult_enqueue_script( 'tve-ult-internal-editor', TVE_Ult_Const::plugin_url( 'tcb-bridge/assets/js/ult-tcb-internal.min.js' ), array( 'tve-main' ) );
wp_localize_script( 'tve-ult-internal-editor', 'tve_ult_page_data', $page_data );
tve_ult_enqueue_style( 'tve-ult-main-frame-css', TVE_Ult_Const::plugin_url( 'tcb-bridge/assets/css/main-frame.css' ) );
} else {
tve_ult_enqueue_script( 'tve-ult-external-editor', TVE_Ult_Const::plugin_url( 'tcb-bridge/assets/js/ult-tcb-external.min.js' ), array( 'tve-main' ) );
$tve_ult_page_data = array(
'ajaxurl' => admin_url( 'admin-ajax.php' ),
'security' => wp_create_nonce( 'tve_ult_external_editor_ajax_request' ),
);
$tve_ult_page_data = tve_ult_append_shortcode_campaigns( $tve_ult_page_data );
wp_localize_script( 'tve-ult-external-editor', 'tve_ult_page_data', $tve_ult_page_data );
}
}
/**
* Return The HTML Code for displaying the Countdown Preview Inside TCB Editor
*/
function tve_ult_fetch_countdown_for_editor() {
if ( ! check_ajax_referer( 'tve_ult_external_editor_ajax_request', '_nonce', false ) ) {
header( $_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found' );
echo esc_attr( __( 'Invalid request.', 'thrive-ult' ) );
wp_die();
}
$design_id = ! empty( $_POST['tve_ult_shortcode'] ) ? intval( $_POST['tve_ult_shortcode'] ) : 0;
if ( empty( $design_id ) ) {
header( $_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found' );
echo esc_attr( __( 'Invalid parameter: tve_ult_shortcode.', 'thrive-ult' ) );
wp_die();
}
$design = tve_ult_get_design( $design_id );
$config = array(
'tve_ult_campaign' => $design['post_parent'],
'tve_ult_shortcode' => $design_id,
);
$html = '';
$html .= '<div class="thrive-shortcode-config" style="display: none !important">__CONFIG_ultimatum_shortcode__' . json_encode( $config ) . '__CONFIG_ultimatum_shortcode__</div>';
$html .= str_replace( array(
'id="tve_editor"',
'tve_editor_main_content',
), '', tve_ult_render_shortcode( $config ) );
wp_send_json( $html );
}
/**
* Outputs Extra SVG Icons to editor page (Control Panel)
*/
function tve_ult_output_extra_control_panel_svg() {
$post_type = get_post_type();
/**
* Include this for all pages besides Ultimatum Pages
*/
if ( ! tve_ult_is_editable( $post_type ) ) {
include TVE_Ult_Const::plugin_path( 'tcb-bridge/assets/css/fonts/ultimatum-main.svg' );
}
}
/**
* Outputs Extra SVG Icons to editor page (Editor)
*/
function tve_ult_output_extra_iframe_svg() {
$post_type = get_post_type();
/**
* Include this for all pages besides Ultimatum Pages
*/
if ( ! tve_ult_is_editable( $post_type ) ) {
include TVE_Ult_Const::plugin_path( 'tcb-bridge/assets/css/fonts/ultimatum-editor.svg' );
}
}
/**
* Returns the new Ultimatum Countdown Component Menu path
*
* @return string
*/
function tve_ult_include_ultimatum_countdown_menu() {
$post_type = get_post_type();
/**
* Include this for all pages besides Ultimatum Pages
*/
if ( ! tve_ult_is_editable( $post_type ) ) {
return TVE_Ult_Const::plugin_path( 'tcb-bridge/editor-layouts/menus/ultimatum-countdown.php' );
}
}
/**
* Enables Template Tab in Settings Section
*
* @param bool $status
*
* @return bool
*/
function tve_ult_enable_template_tab( $status ) {
$post_type = get_post_type();
if ( tve_ult_is_editable( $post_type ) ) {
return true;
}
return $status;
}
/**
* Disable Revision Manager for Ultimatum Pages
*
* @param bool $status
*
* @return bool
*/
function tve_ult_disable_revision_manager( $status = true ) {
$post_type = get_post_type();
if ( tve_ult_is_editable( $post_type ) ) {
return ! $status;
}
return $status;
}
/**
* Disable Page Events for Ultimatum Pages
*
* @param bool $allow
*
* @return bool
*/
function tve_ult_disable_page_events( $allow = true ) {
$post_type = get_post_type();
if ( tve_ult_is_editable( $post_type ) ) {
return false;
}
return $allow;
}
/**
* Output the HTML for the Ultimatum form states
*/
function tve_ult_output_editor_states() {
$post_type = get_post_type();
if ( tve_ult_is_editable( $post_type ) ) {
$last_edited_state_key = get_post_meta( get_the_ID(), TVE_Ult_Const::META_PREFIX_NAME_FOR_EDIT_STATE . $_GET[ TVE_Ult_Const::DESIGN_QUERY_KEY_NAME ], true );
if ( ! empty( $last_edited_state_key ) ) {
$current_design = tve_ult_get_design( $last_edited_state_key );
}
include TVE_Ult_Const::plugin_path( 'tcb-bridge/editor/states.php' );
}
}
//--------------------------------
/**
* called when there is no active license for TCB, but it is installed and enabled
* the function returns true only for pieces of content that "belong" to Thrive Ultimatum, so only the following:
*
* @param bool $value
*
* @return bool whether or not the current piece of content can be edited with TCB core functions
*/
function tve_ult_tcb_license_override( $value ) {
/* this means that the license check should be skipped, possibly from thrive leads */
if ( $value ) {
return true;
}
$post_type = get_post_type();
return tve_ult_is_editable( $post_type );
}
/**
* Checks if TU license if valid (only if the user is trying to edit a design)
*
* @param bool $valid
*
* @return bool
*/
function tve_ult_editor_check_license( $valid ) {
if ( empty( $_GET[ TVE_Ult_Const::DESIGN_QUERY_KEY_NAME ] ) ) {
return $valid;
}
if ( ! tve_ult_license_activated() ) {
add_action( 'wp_print_footer_scripts', 'tve_leads_license_warning' );
return false;
}
return true;
}
/**
* Check if TCB version is valid
*
* @param bool $valid
*
* @return bool
*/
function tve_ult_editor_check_tcb_version( $valid ) {
if ( empty( $_GET[ TVE_Ult_Const::DESIGN_QUERY_KEY_NAME ] ) ) {
return $valid;
}
if ( ! $valid ) {
return false;
}
if ( ! tve_ult_check_tcb_version() ) {
add_action( 'wp_print_footer_scripts', 'tve_ult_tcb_version_warning' );
return false;
}
return true;
}
/**
* show a box with a warning message notifying the user to update the TCB plugin to the latest version
* this will be shown only when the TCB version is lower than a minimum required version
*/
function tve_ult_tcb_version_warning() {
return include TVE_Ult_Const::plugin_path( 'admin/views/tcb_version_incompatible.php' );
}
/**
* show a box with a warning message and a link to take the user to the license activation page
* this will be called only when no valid / activated license has been found
*
* @return mixed
*/
function tve_ult_license_warning() {
return include TVE_Ult_Const::plugin_path( 'admin/views/license_inactive.php' );
}
/**
* Callback for "tcb_custom_post_layouts" filter applied by TCB
*
* @param $current_templates
* @param $post_id
* @param $post_type
*
* @return array of layouts
*/
function tve_ult_editor_layout( $current_templates, $post_id, $post_type ) {
global $design;
if ( ! tve_ult_is_editable( $post_type ) ) {
return $current_templates;
}
/* handles the following case: user refreshes the page when editing a child state - the child state should be directly opened after refresh */
if ( is_editor_page() ) {
$last_edited_state_key = get_post_meta( $post_id, TVE_Ult_Const::META_PREFIX_NAME_FOR_EDIT_STATE . $_GET[ TVE_Ult_Const::DESIGN_QUERY_KEY_NAME ], true );
if ( ! empty( $last_edited_state_key ) ) {
$design = tve_ult_get_design( $last_edited_state_key );
}
}
if ( empty( $design ) ) {
$design = tve_ult_get_design( $_GET[ TVE_Ult_Const::DESIGN_QUERY_KEY_NAME ] );
}
if ( empty( $design ) ) {
return $current_templates;
}
$current_templates['campaign_design'] = TVE_Ult_Const::plugin_path() . 'tcb-bridge/editor/campaign/' . TU_Template_Manager::type( $design['post_type'] ) . '.php';
if ( ! empty( $design[ TVE_Ult_Const::FIELD_TEMPLATE ] ) ) {
$config = tve_ult_editor_get_template_config( $design[ TVE_Ult_Const::FIELD_TEMPLATE ] );
/* custom fonts for the design */
if ( ! empty( $config['fonts'] ) ) {
foreach ( $config['fonts'] as $font ) {
wp_enqueue_style( 'tve-ult-font-' . md5( $font ), $font );
}
}
/* include also the CSS for each design template */
if ( ! empty( $config['css'] ) ) {
$css_handle = 'tve-ult-' . TU_Template_Manager::type( $design[ TVE_Ult_Const::FIELD_TEMPLATE ] ) . '-' . str_replace( '.css', '', $config['css'] );
tve_ult_enqueue_style( $css_handle, TVE_Ult_Const::plugin_url( 'tcb-bridge/editor-templates/css/' . TU_Template_Manager::type( $design['post_type'] ) . '/' . $config['css'] ) );
}
/**
* reset the design html to default
*/
if ( file_exists( TVE_Ult_Const::plugin_path( '.ui-develop' ) ) ) {
$design[ TVE_Ult_Const::FIELD_CONTENT ] = tve_ult_editor_get_template_content( $design );
tve_ult_save_design( $design );
}
}
tve_ult_enqueue_style( 'tve-ult-design', TVE_Ult_Const::plugin_url( 'tcb-bridge/assets/css/editor.css' ) );
if ( ! is_editor_page() ) {
//this is the preview page
tve_ult_enqueue_default_scripts();
}
$globals = ! empty( $design[ TVE_Ult_Const::FIELD_GLOBALS ] ) ? $design[ TVE_Ult_Const::FIELD_GLOBALS ] : array();
if ( ! empty( $globals['js_sdk'] ) ) {
foreach ( $globals['js_sdk'] as $handle ) {
$link = tve_social_get_sdk_link( $handle );
$js[ 'tve_js_sdk_' . $handle ] = $link;
wp_script_is( 'tve_js_sdk_' . $handle ) || wp_enqueue_script( 'tve_js_sdk_' . $handle, $link, array(), false );
}
}
add_action( 'wp_enqueue_scripts', 'tve_ult_enqueue_design_scripts' );
return $current_templates;
}
/**
* Check if a Thrive Ultimatum post is editable with TCB
*
* @param $post_or_type
* string post type
* int post it
*
* @return bool
*/
function tve_ult_is_editable( $post_or_type ) {
$post_or_type = is_numeric( $post_or_type ) ? get_post_type( $post_or_type ) : $post_or_type;
return in_array( $post_or_type, array(
TVE_Ult_Const::POST_TYPE_NAME_FOR_CAMPAIGN,
) );
}
/**
* This is the main controller for editor and preview page
*
* @param array $design
* @param array $is_editor_or_preview true if we are on the editor / preview page
*
* @return string
*/
function tve_ult_editor_custom_content( $design, $is_editor_or_preview = true ) {
if ( empty( $design ) ) {
return __( 'Design cannot be empty', 'thrive-ult' );
}
$tve_saved_content = $design[ TVE_Ult_Const::FIELD_CONTENT ];
/**
* if in editor page or preview, replace the data-date attribute for the countdown timers with the current_date + 1 day (just for demo purposes)
*/
if ( $is_editor_or_preview ) {
$tomorrow = tve_ult_current_time( 'timestamp' ) + DAY_IN_SECONDS;
$tve_saved_content = preg_replace( '#data-dd="(\d+)"#', '', $tve_saved_content );
$tve_saved_content = preg_replace( '#data-date="(\d+)-(\d+)-(\d+)"#', 'data-dd="2" data-date="' . date( 'Y-m-d', $tomorrow ) . '"', $tve_saved_content );
$tve_saved_content = preg_replace( '#data-hour="(\d+)"#', 'data-hour="' . date( 'H', $tomorrow ) . '"', $tve_saved_content );
$tve_saved_content = preg_replace( '#data-timezone="(.+?)"#', 'data-timezone="' . tve_ult_get_timezone_format() . '"', $tve_saved_content );
$tve_saved_content = preg_replace( '#data-min="(.+?)"#', 'data-min="' . date( 'i' ) . '"', $tve_saved_content );
}
/* this will hold the html for the tinymce editor instantiation, only if we're on the editor page */
$tinymce_editor = $page_loader = '';
$is_editor_page = $is_editor_or_preview && tve_ult_is_editor_page();
/**
* this means we are getting the content to output it on a targeted page => include also the custom CSS rules
*/
$custom_css = tve_ult_editor_output_custom_css( $design, true );
/**
* style family class should always be Flat
*/
$style_family_class = 'tve_flt';
$style_family_id = $is_editor_or_preview ? ' id="' . $style_family_class . '" ' : ' ';
$wrap = array(
'start' => '<div' . $style_family_id . 'class="' . $style_family_class . '">',
'end' => '</div>',
);
$wrap['start'] .= '<div id="tve_editor" class="tve_shortcode_editor">';
$wrap['end'] .= '</div>';
if ( $is_editor_page ) {
// add_action( 'wp_footer', 'tve_output_wysiwyg_editor' );
$page_loader = '';
} else {
$tve_saved_content = tve_restore_script_tags( $tve_saved_content );
/* prepare Events configuration */
tve_parse_events( $tve_saved_content );
}
/**
* custom Thrive shortcodes
*/
$tve_saved_content = tve_thrive_shortcodes( $tve_saved_content, $is_editor_page );
/* render the content added through WP Editor (element: "WordPress Content") */
$tve_saved_content = tve_do_wp_shortcodes( $tve_saved_content, $is_editor_page );
if ( ! $is_editor_page ) {
$tve_saved_content = shortcode_unautop( $tve_saved_content );
$tve_saved_content = do_shortcode( $tve_saved_content );
}
$tve_saved_content = preg_replace_callback( '/__CONFIG_lead_generation__(.+?)__CONFIG_lead_generation__/s', 'tcb_lg_err_inputs', $tve_saved_content );
if ( ! $is_editor_page ) {
$tve_saved_content = apply_filters( 'tcb_clean_frontend_content', $tve_saved_content );
}
/**
* append any needed custom CSS - only on regular pages, and not on editor / preview page
*/
return ( $is_editor_or_preview ? '' : '' . $custom_css ) . $wrap['start'] . $tve_saved_content . $wrap['end'] . $tinymce_editor . $page_loader;
}
/**
* Appends any required parameters to the global JS configuration array on the editor page
*
* @param $js_params
* @param $post_id
* @param $post_type
*
* @return mixed
*/
function tve_ult_editor_javascript_params( $js_params, $post_id, $post_type ) {
if ( ! tve_ult_is_editable( $post_id ) || empty( $_GET[ TVE_Ult_Const::DESIGN_QUERY_KEY_NAME ] ) ) {
return $js_params;
}
global $design;
if ( empty( $design ) ) {
$last_edited_state_key = get_post_meta( $post_id, TVE_Ult_Const::META_PREFIX_NAME_FOR_EDIT_STATE . $_GET[ TVE_Ult_Const::DESIGN_QUERY_KEY_NAME ], true );
if ( ! empty( $last_edited_state_key ) ) {
if ( ! ( $design = tve_ult_get_design( $last_edited_state_key ) ) ) {
return $js_params;
}
}
}
$_version = get_bloginfo( 'version' );
/** clear out any data that's not necessary on the editor and add form variation custom data */
$js_params['landing_page'] = '';
$js_params['landing_page_config'] = array();
$js_params['landing_pages'] = array();
$js_params['page_events'] = array();
$js_params['landing_page_lightbox'] = array();
$js_params['style_families'] = array(
'Flat' => tve_editor_css() . '/thrive_flat.css?ver=' . $_version,
);
$js_params['style_classes'] = array(
'Flat' => 'tve_flt',
);
$js_params['custom_post_data'] = array(
TVE_Ult_Const::DESIGN_QUERY_KEY_NAME => $design['id'],
'disabled_controls' => array(
'page_events' => 1,
'text' => array( 'more_link' ),
'event_manager' => array(),
),
);
$js_params['save_post_action'] = TVE_Ult_Const::ACTION_SAVE_DESIGN_CONTENT;
$js_params['tve_globals'] = isset( $design[ TVE_Ult_Const::FIELD_GLOBALS ] ) ? $design[ TVE_Ult_Const::FIELD_GLOBALS ] : array( 'e' => 1 );
$js_params['show_more_tag'] = false;
return $js_params;
}
/**
* Handles template-related actions:
*/
function tve_ult_template_action() {
add_filter( 'tcb_is_editor_page_ajax', '__return_true' );
add_filter( 'tcb_is_editor_page_raw_ajax', '__return_true' );
check_ajax_referer( 'tve-ult-verify-track-sender-672', 'security' );
if ( ! TU_Product::has_access() || empty( $_POST['post_id'] ) || ! current_user_can( 'edit_post', $_POST['post_id'] ) || empty( $_POST['design_id'] ) || empty( $_POST['custom'] ) ) {
$response = array(
'success' => false,
'message' => __( 'Ultimatum Template: Invalid Parameters', 'thrive-ult' ),
);
wp_send_json( $response );
}
if ( ! ( $design = tve_ult_get_design( $_POST['design_id'] ) ) ) {
$response = array(
'success' => false,
'message' => __( 'Ultimatum Template: Invalid Design', 'thrive-ult' ),
);
wp_send_json( $response );
}
TU_Template_Manager::getInstance( $design )->api( $_POST['custom'] );
}
/**
* Handles state-related actions
*/
function tve_ult_state_action() {
if ( ! TU_Product::has_access() || empty( $_POST['post_id'] ) || ! current_user_can( 'edit_post', $_POST['post_id'] ) || empty( $_POST['design_id'] ) || empty( $_POST['custom_action'] ) ) {
$response = array(
'success' => false,
'message' => __( 'Ultimatum State: Invalid Parameters', 'thrive-ult' ),
);
wp_send_json( $response );
}
add_filter( 'tcb_is_editor_page_ajax', '__return_true' );
add_filter( 'tcb_is_editor_page_raw_ajax', '__return_true' );
$design = tve_ult_get_design( $_POST['design_id'] );
if ( empty( $design ) ) {
$response = array(
'success' => false,
'message' => __( 'Ultimatum State: Invalid Design', 'thrive-ult' ),
);
wp_send_json( $response );
}
require_once TVE_Ult_Const::plugin_path( 'inc/classes/class-tu-state-manager.php' );
TU_State_Manager::getInstance( $design )->api( $_POST['custom_action'] );
}
/**
* Gets the default design content from a pre-defined template
*
* @param $design array
* @param $template_key string formatted like {design_type}|{template_name}
*
* @return string for content
*/
function tve_ult_editor_get_template_content( &$design, $template_key = null ) {
if ( $template_key === null && ! empty( $design ) && ! empty( $design[ TVE_Ult_Const::FIELD_TEMPLATE ] ) ) {
$template_key = $design[ TVE_Ult_Const::FIELD_TEMPLATE ];
}
if ( empty( $template_key ) ) {
return '';
}
list( $type, $template ) = explode( '|', $template_key );
$base = TVE_Ult_Const::plugin_path() . 'tcb-bridge/editor-templates';
$templates = TU_Template_Manager::get_templates( $type );
if ( ! isset( $templates[ $template ] ) || ! is_file( $base . '/' . $type . '/' . $template . '.php' ) ) {
return '';
}
ob_start();
include $base . '/' . $type . '/' . $template . '.php';
$content = ob_get_contents();
ob_end_clean();
/** we need to make sure we don't have any left-over data from the previous template */
$design[ TVE_Ult_Const::FIELD_INLINE_CSS ] = '';
$design[ TVE_Ult_Const::FIELD_USER_CSS ] = '';
$design[ TVE_Ult_Const::FIELD_CUSTOM_FONTS ] = array();
$design[ TVE_Ult_Const::FIELD_ICON_PACK ] = '';
$design[ TVE_Ult_Const::FIELD_MASONRY ] = '';
$design[ TVE_Ult_Const::FIELD_TYPEFOCUS ] = '';
/** also read in any other configuration values that might be required for this design */
$config = tve_ult_editor_get_template_config( $template_key );
if ( ! empty( $config[ TVE_Ult_Const::FIELD_GLOBALS ] ) ) {
$design[ TVE_Ult_Const::FIELD_GLOBALS ] = $config[ TVE_Ult_Const::FIELD_GLOBALS ];
} else {
$design[ TVE_Ult_Const::FIELD_GLOBALS ] = array( 'e' => 1 );
}
return $content;
}
/**
* Get the configuration array used in editor for a specific design template
*
* @param string $key
*
* @return array
*/
function tve_ult_editor_get_template_config( $key ) {
if ( strpos( $key, '|' ) === false ) {
return array();
}
list( $design_type, $key ) = TU_Template_Manager::tpl_type_key( $key );
$config = require TVE_Ult_Const::plugin_path() . 'tcb-bridge/editor-templates/_config.php';
return isset( $config[ $design_type ][ $key ] ) ? $config[ $design_type ][ $key ] : array();
}
/**
* TCB Enqueues fonts and returns them for a specific design
*
* @param $design array
*
* @return array
*/
function tve_ult_editor_enqueue_custom_fonts( $design ) {
if ( empty( $design[ TVE_Ult_Const::FIELD_CUSTOM_FONTS ] ) ) {
return array();
}
return tve_enqueue_fonts( $design[ TVE_Ult_Const::FIELD_CUSTOM_FONTS ] );
}
/**
* Outputs custom CSS for a design
* The Custom CSS is only saved once in the default state (in the "parent" state)
*
* @param mixed $design can be either a numeric value - for variation_key or an already loaded variation array
* @param bool $return whether to output the CSS or return it
*
* @return string the CSS, if $return was true
*/
function tve_ult_editor_output_custom_css( $design, $return = false ) {
if ( is_numeric( $design ) ) {
$design = tve_ult_get_design( $design );
}
if ( empty( $design ) || ! is_array( $design ) ) {
return '';
}
$css = '';
if ( ! empty( $design[ TVE_Ult_Const::FIELD_INLINE_CSS ] ) ) { /* inline style rules = custom colors */
$css .= sprintf( '<style type="text/css" class="tve_custom_style">%s</style>', $design[ TVE_Ult_Const::FIELD_INLINE_CSS ] );
}
/** user-defined Custom CSS rules for the form */
$custom_css = '';
/** first, check for a parent state */
if ( ! empty( $design['parent_id'] ) ) {
$parent_state = tve_ult_get_design( $design['parent_id'] );
if ( ! empty( $parent_state ) && ! empty( $parent_state[ TVE_Ult_Const::FIELD_USER_CSS ] ) ) {
$custom_css = $parent_state[ TVE_Ult_Const::FIELD_USER_CSS ] . $custom_css;
}
}
/**
* fallback / backwards-compatibility: get the CustomCSS from the state itself
*/
if ( ! empty( $design[ TVE_Ult_Const::FIELD_USER_CSS ] ) ) {
$custom_css = $design[ TVE_Ult_Const::FIELD_USER_CSS ] . $custom_css;
}
if ( ! empty( $custom_css ) ) {
$css .= sprintf(
'<style type="text/css"%s class="tve_user_custom_style">%s</style>',
$return ? '' : ' id="tve_head_custom_css"', // if we return the CSS, do not append the id to the stylesheet
$custom_css
);
}
if ( ! is_editor_page() && function_exists( 'tve_get_shared_styles' ) ) {
$css .= tve_get_shared_styles( $design[ TVE_Ult_Const::FIELD_CONTENT ] );
}
$css = apply_filters( 'tcb_custom_css', $css );
if ( $return === true ) {
return $css;
}
echo $css;
}
/**
* called via AJAX
* receives editor content and various fields needed throughout the editor
*
* @return array
*/
function tve_ult_editor_save_content() {
$response = array(
'success' => true,
);
if ( empty( $_POST['post_id'] ) || ! current_user_can( 'edit_post', $_POST['post_id'] ) || empty( $_POST[ TVE_Ult_Const::DESIGN_QUERY_KEY_NAME ] ) ) {
$response = array(
'success' => false,
'message' => __( 'Invalid Parameters', 'thrive-ult' ),
);
return $response;
}
if ( ob_get_contents() ) {
ob_clean();
}
$design = tve_ult_get_design( $_POST[ TVE_Ult_Const::DESIGN_QUERY_KEY_NAME ] );
if ( empty( $design ) ) {
$response = array(
'success' => false,
'message' => __( 'Could not find the design you are editing... Is it possible that someone deleted it from the admin panel?', 'thrive-ult' ),
);
return $response;
}
tve_ultimatum_save_optimized_assets( $_POST['post_id'], $_POST[ TVE_Ult_Const::DESIGN_QUERY_KEY_NAME ] );
$design[ TVE_Ult_Const::FIELD_CONTENT ] = $_POST['tve_content'];
$design[ TVE_Ult_Const::FIELD_INLINE_CSS ] = trim( $_POST['inline_rules'] );
$design[ TVE_Ult_Const::FIELD_USER_CSS ] = $_POST['tve_custom_css'];
$design[ TVE_Ult_Const::FIELD_GLOBALS ] = ! empty( $_POST['tve_globals'] ) ? $_POST['tve_globals'] : array( 'e' => 1 );
$design[ TVE_Ult_Const::FIELD_CUSTOM_FONTS ] = tve_ult_get_custom_font_links( empty( $_POST['custom_font_classes'] ) ? array() : $_POST['custom_font_classes'] );
$design[ TVE_Ult_Const::FIELD_ICON_PACK ] = empty( $_POST['has_icons'] ) ? 0 : 1;
$design[ TVE_Ult_Const::FIELD_MASONRY ] = empty( $_POST['tve_has_masonry'] ) ? 0 : 1;
$design[ TVE_Ult_Const::FIELD_TYPEFOCUS ] = empty( $_POST['tve_has_typefocus'] ) ? 0 : 1;
if ( ! empty( $_POST['tve_ult_tpl'] ) ) {
$design[ TVE_Ult_Const::FIELD_TEMPLATE ] = $_POST['tve_ult_tpl'];
}
if ( ! empty( $design['parent_id'] ) && ( $parent_state = tve_ult_get_design( $design['parent_id'] ) ) ) {
$parent_state[ TVE_Ult_Const::FIELD_USER_CSS ] = $_POST['tve_custom_css'];
$design[ TVE_Ult_Const::FIELD_USER_CSS ] = '';
tve_ult_save_design( $parent_state );
}
tve_ult_save_design( $design );
return $response;
}
/**
* Transform an array of font classes into links to the actual google font
*
* @param array $custom_font_classes the classes used for custom fonts
*
* @return array
*/
function tve_ult_get_custom_font_links( $custom_font_classes = array() ) {
$all_fonts = tve_get_all_custom_fonts();
$post_fonts = array();
foreach ( array_unique( $custom_font_classes ) as $cls ) {
foreach ( $all_fonts as $font ) {
if ( Tve_Dash_Font_Import_Manager::isImportedFont( $font->font_name ) ) {
$post_fonts[] = Tve_Dash_Font_Import_Manager::getCssFile();
} elseif ( $font->font_class == $cls && ! tve_is_safe_font( $font ) ) {
$post_fonts[] = tve_custom_font_get_link( $font );
break;
}
}
}
return array_unique( $post_fonts );
}
/**
* Append the design id as a parameter for the preview link
* Link that is built for the "Preview" button in the editor
* This should always lead to the main (Default) state of the design
*
* @param $current_args
* @param $post_id
*
* @return $current_args array
*/
function tve_ult_editor_append_preview_link_args( $current_args, $post_id ) {
if ( tve_ult_is_editable( $post_id ) && ! empty( $_GET[ TVE_Ult_Const::DESIGN_QUERY_KEY_NAME ] ) ) {
$current_args [ TVE_Ult_Const::DESIGN_QUERY_KEY_NAME ] = $_GET[ TVE_Ult_Const::DESIGN_QUERY_KEY_NAME ];
}
return $current_args;
}
/**
* @param string $logo_url
*
* @return string
*/
function tve_ult_architect_branding( $logo_url ) {
if ( tve_ult_is_editable( get_post_type() ) ) {
$logo_url = TVE_Ult_Const::plugin_url( 'admin/img/logo_90x90.png' );
}
return $logo_url;
}
function tve_ult_allow_cloud_templates() {
return defined( 'TVE_VERSION' ) && ( TVE_VERSION === '0.dev' || version_compare( TVE_VERSION, '2.6.1', '>' ) );
}