$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 .= '
__CONFIG_ultimatum_shortcode__' . json_encode( $config ) . '__CONFIG_ultimatum_shortcode__
'; $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' => '', 'end' => '', ); $wrap['start'] .= '
'; $wrap['end'] .= '
'; 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( '', $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( '', $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', '>' ) ); }