error( __( 'You do not have this capability anymore', 'thrive-ult') ); } if ( ! check_ajax_referer( 'tve_ult_admin_ajax_request', '_nonce', false ) ) { $this->error( sprintf( __( 'Invalid request', 'thrive-ult') ) ); } $route = $this->param( 'route' ); $route = preg_replace( '#([^a-zA-Z0-9-])#', '', $route ); $method_name = $route . 'Action'; if ( ! method_exists( $this, $method_name ) ) { $this->error( sprintf( __( 'Method %s not implemented', 'thrive-ult'), $method_name ) ); } return $this->{$method_name}(); } /** * Show the Display Settings popup for a campaign */ protected function displaySettingsCampaignAction() { $memory_limit = (int) ini_get( 'memory_limit' ); if ( $memory_limit < 256 ) { ini_set( 'memory_limit', '256M' ); } require_once TVE_Ult_Const::plugin_path() . 'inc/classes/display_settings/class-thrive-display-settings-manager.php'; $display_settings_manager = new Thrive_Ult_Display_Settings_Manager( $this->param( 'campaign_id' ) ); return $display_settings_manager->get_popup_data(); } /** * Save display settings for a Campaign * * @return array */ protected function displaySettingsSaveAction() { require_once TVE_Ult_Const::plugin_path() . 'inc/classes/display_settings/class-thrive-display-settings-manager.php'; $display_settings_manager = new Thrive_Ult_Display_Settings_Manager( $this->param( 'campaign_id' ) ); $result = $display_settings_manager->save_options(); /** * check if there is a knonwn cache plugin installed and clear the cache if that's the case */ $cache_plugin = tve_dash_detect_cache_plugin(); if ( $cache_plugin ) { tve_dash_cache_plugin_clear( $cache_plugin ); } return array( 'success' => $result === true ? true : false, 'message' => $result !== true ? 'Error while saving: ' . $result : '', ); } /** * Save a template containing display settings * * @return array */ public function displaySettingsSaveTemplateAction() { require_once TVE_Ult_Const::plugin_path() . 'inc/classes/display_settings/class-thrive-display-settings-manager.php'; $display_settings_manager = new Thrive_Ult_Display_Settings_Manager(); $result = $display_settings_manager->save_template(); return array( 'success' => $result === true ? true : false, 'message' => $result !== true ? sprintf( __( 'Error while saving: %s', 'thrive-ult'), $result ) : '', 'templates' => $result === true ? apply_filters( 'thrive_display_options_get_templates', array() ) : array(), ); } /** * Load a saved Campaign Display Settings template */ public function displaySettingsLoadTemplateAction() { require_once TVE_Ult_Const::plugin_path() . 'inc/classes/display_settings/class-thrive-display-settings-manager.php'; $display_settings_manager = new Thrive_Ult_Display_Settings_Manager(); $display_settings_manager->load_template(); } /** * Performs actions for campaigns based on request's method and model * Dies with error if the operation was not executed * * @return mixed */ protected function campaignsAction() { $model = json_decode( file_get_contents( 'php://input' ), true ); $method = empty( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] ) ? 'GET' : $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']; if ( ( $custom = $this->param( 'custom' ) ) ) { switch ( $custom ) { case 'chart_data': return tve_ult_get_chart_data( $this->param( 'ID' ) ); break; case 'update_order': $ordered = $this->param( 'new_order', array() ); foreach ( $ordered as $post_id => $order ) { update_post_meta( $post_id, TVE_Ult_Const::META_NAME_FOR_CAMPAIGN_ORDER, $order ); } return $ordered; break; default: return array(); } } switch ( $method ) { case 'POST': case 'PUT': case 'PATCH': if ( ! ( $item = tve_ult_save_campaign( $model ) ) ) { $this->error( __( 'Could not save', 'thrive-ult') ); } return $item; break; case 'DELETE': if ( ! ( $deleted = tve_ult_delete_campaign( $this->param( 'ID' ), true ) ) ) { $this->error( __( 'Could not delete', 'thrive-ult') ); } return $deleted; break; case 'GET': $campaign = tve_ult_get_campaign( $this->param( 'ID', 0 ), array( 'get_designs' => true, 'designs_hierarchy' => true, 'get_events' => true, ) ); if ( $campaign === false ) { $this->error( __( 'Item not found', 'thrive-ult') ); } /* we also need to load the display settings for the campaign - to show the summary */ require_once TVE_Ult_Const::plugin_path() . 'inc/classes/display_settings/class-thrive-display-settings-manager.php'; $display_settings_manager = new Thrive_Ult_Display_Settings_Manager( $this->param( 'ID' ) ); $_data = $display_settings_manager->get_popup_data(); $campaign->display_settings = $_data['hangers']; $campaign->display_settings_tpl = $_data['savedTemplates']; $timeline = new TU_Timeline( $campaign ); $timeline->prepare_events(); return $campaign; break; } } /** * Save the Date Settings * * @return array|null */ protected function dateSettingsAction() { $model = json_decode( file_get_contents( 'php://input' ), true ); $method = empty( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] ) ? 'GET' : $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']; switch ( $method ) { case 'POST': case 'PUT': case 'PATCH': if ( ! tve_ult_save_date_settings( $model ) ) { $this->error( __( 'Could not save', 'thrive-ult') ); } return [ 'now' => tve_ult_current_time( 'Y-m-d H:i' ), ]; break; case 'DELETE': case 'GET': default: break; } } /** * Performs actions for designs based on request's method and model * Dies with error if the operation was not executed * * @return mixed */ public function designsAction() { $model = json_decode( file_get_contents( 'php://input' ), true ); $method = empty( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] ) ? 'GET' : $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']; switch ( $method ) { case 'POST': case 'PUT': case 'PATCH': if ( ! ( $item = tve_ult_save_design( $model ) ) ) { $this->error( __( 'Could not save', 'thrive-ult') ); } return $item; break; case 'DELETE': if ( ! ( $deleted = tve_ult_delete_design( (int) $this->param( 'ID' ) ) ) ) { $this->error( __( 'Could not delete design', 'thrive-ult') ); } return $deleted; break; case 'GET': if ( ! ( $item = tve_ult_get_design( (int) $this->param( 'ID' ) ) ) ) { $this->error( __( 'Item not found', 'thrive-ult') ); } return $item; break; } } /** * Fetch the list of designs. If the request contains a get_states key, it will return the full list of designs for a campaign( including child states ) * * @return array */ public function designListAction() { $data = json_decode( file_get_contents( 'php://input' ), true ); $method = empty( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] ) ? 'GET' : $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']; if ( ! ( $campaign_id = $this->param( 'campaign_id' ) ) ) { $this->error( __( 'Missing Campaign', 'thrive-ult') ); } switch ( $method ) { case 'GET': if ( $this->param( 'get_states' ) ) { $designs = tve_ult_get_designs_hierarchy( $campaign_id ); } else { $designs = tve_ult_get_designs( $campaign_id ); } return $designs; default: return array(); } } /** * Entry point for actions * Dies with error if the operation was not executed * * @return array */ public function actionsAction() { $model = json_decode( file_get_contents( 'php://input' ), true ); $method = empty( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] ) ? 'GET' : $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']; switch ( $method ) { case 'GET': /** gets the options html for an action */ if ( $this->param( 'custom' ) === 'options' ) { $html = TU_Event_Action::getInstance()->get_options_html( $this->param( 'action_model' ) ); return array( 'html' => $html, ); } break; } } /** * Entry point for campaign status actions * Dies with error if the operation was not executed * * @return array */ public function campaignStatusAction() { $item = tve_ult_save_campaign_status( $this->param( 'ID' ), $this->param( 'status' ) ); if ( ! $item['success'] ) { $error_list = array( 'invalid_call' => __( 'Invalid call', 'thrive-ult'), 'invalid_id' => __( 'The campaign ID is invalid', 'thrive-ult'), 'settings_error' => __( "You cannot start this campaign until you've setup the campaign type and duration", 'thrive-ult'), 'design_error' => __( 'You cannot start this campaign until you add at least a design', 'thrive-ult'), 'design_tpl_error' => __( 'You cannot start this campaign until you have at least one design that has a template selected', 'thrive-ult'), 'display_settings_error' => __( 'You cannot start this campaign before setting up the display options', 'thrive-ult'), 'evergreen_linked' => __( 'You cannot start this campaign until you setup a start trigger type', 'thrive-ult'), 'end_date_in_past' => __( 'You cannot start this campaign because the end date is in the past', 'thrive-ult'), 'lockdown' => __( 'You cannot start this campaign before setting up the lockdown options', 'thrive-ult'), 'invalid_trigger' => __( 'You cannot start this campaign with an invalid or empty trigger', 'thrive-ult'), 'invalid_leads_trigger' => __( 'You cannot start this campaign with a Leads Conversion as a trigger when Thrive Leads is deactivated', 'thrive-ult'), ); $this->error( $error_list[ $item['message'] ], 422 ); } return $item['data']; } /** * Entry point for events * Dies with error if the operation was not executed * * @return mixed */ public function eventsAction() { $model = json_decode( file_get_contents( 'php://input' ), true ); $method = empty( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] ) ? 'GET' : $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']; switch ( $method ) { case 'PATCH': case 'PUT': case 'POST': if ( ! ( $item = tve_ult_save_event( $model ) ) ) { $this->error( __( 'Could not save', 'thrive-ult') ); } return $item; break; case 'DELETE': if ( ! ( $deleted = tve_ult_delete_event( (int) $this->param( 'ID' ) ) ) ) { $this->error( __( 'Could not delete', 'thrive-ult') ); } return $deleted; break; case 'GET': $campaign = tve_ult_get_campaign( $this->param( 'campaign_id', 0 ), array( 'get_designs' => false, 'get_events' => true, ) ); if ( $campaign === false ) { $this->error( __( 'Item not found', 'thrive-ult') ); } $timeline = new TU_Timeline( $campaign ); $timeline->prepare_events(); return $campaign->timeline; break; } } /** * Does a progressive search based on a string * * @return mixed */ public function progressiveGetPostsAction() { $s = wp_unslash( $this->param( 'term' ) ); $s = trim( $s ); $all_post_types = get_post_types( array( 'public' => true ) ); $exception_list = apply_filters( 'tvu_post_types_blacklist', array( 'attachment', 'focus_area', 'thrive_optin', 'wysijap', 'product_variation', 'revision', 'nav_menu_item', 'tve_lead_shortcode', 'tve_lead_1c_signup', 'tve_form_type', 'tve_lead_group', 'tcb_lightbox', 'tve_lead_2s_lightbox', 'tve_ult_campaign', 'tvo_testimonials', 'reply', 'tva_lesson', 'tva_chapter', 'tva_module', 'tcb_symbol', 'tcb_lightbox', ) ); $post_types = array_diff( $all_post_types, $exception_list ); add_filter( 'posts_search', 'tve_ult_search_by_title' , 500, 2 ); $args = array( 'post_type' => $post_types, 'post_status' => 'publish', 's' => $s, 'numberposts' => 20, 'suppress_filters' => false ); $results = array(); foreach ( get_posts( $args ) as $post ) { $post_type_obj = get_post_type_object( $post->post_type ); if ( trim( $post->post_title ) ) { $results [] = array( 'id' => $post->ID, 'label' => $post->post_title, 'type' => $post_type_obj->labels->singular_name, ); } } return $results; } /** * Returns post title id and url on a post fetched by id * * @return bool */ public function getPostByIDAction() { $post = get_post( (int) $this->param( 'id' ) ); if ( empty( $post ) ) { return false; } $result['id'] = $post->ID; $result['title'] = $post->post_title; $result['url'] = get_permalink( $post->ID ); if ( isset( $result ) ) { return $result; } return false; } public function settingsAction() { if ( ( $custom = $this->param( 'custom' ) ) ) { switch ( $custom ) { case 'purge_cache': tve_ult_purge_cache(); return tve_ult_get_campaigns( array( 'get_logs' => true ) ); break; default: return array(); } } } /** * searches a tag by keywords, used in Display settings */ public function tagSearchAction() { if ( ! $this->param( 'tax' ) ) { wp_die( 0 ); } $taxonomy = sanitize_key( $this->param( 'tax' ) ); $tax = get_taxonomy( $taxonomy ); if ( ! $tax ) { wp_die( 0 ); } if ( ! current_user_can( $tax->cap->assign_terms ) ) { wp_die( - 1 ); } $s = wp_unslash( $this->param( 'q' ) ); $comma = _x( ',', 'tag delimiter' ); if ( ',' !== $comma ) { $s = str_replace( $comma, ',', $s ); } if ( false !== strpos( $s, ',' ) ) { $s = explode( ',', $s ); $s = $s[ count( $s ) - 1 ]; } $s = trim( $s ); if ( strlen( $s ) < 2 ) { wp_die(); } $results = get_terms( $taxonomy, array( 'name__like' => $s, 'fields' => 'id=>name', 'number' => 10, ) ); $json = array(); foreach ( $results as $id => $name ) { $json [] = array( 'label' => $name, 'id' => $id, 'value' => $name, ); } wp_send_json( $json ); } /** * searches a post by keywords */ public function postSearchAction() { if ( ! $this->param( 'q' ) ) { wp_die( 0 ); } $s = wp_unslash( $this->param( 'q' ) ); /** @var WP_Post[] $posts */ $posts = get_posts( array( 'posts_per_page' => 10, 's' => $s, ) ); $json = array(); foreach ( $posts as $post ) { $json [] = array( 'label' => $post->post_title, 'id' => $post->ID, 'value' => $post->post_title, ); } wp_send_json( $json ); } }