files_manager->clear_cache();
}
}
/**
* JS Templates
*
* @since 1.0.0
*
* @return void
*/
function js_templates() {
// Loading Templates.
?>
post_type ) ) {
return;
}
wp_enqueue_script( 'cartflows-rest-api', CARTFLOWS_URL . 'assets/js/rest-api.js', array( 'jquery' ), CARTFLOWS_VER, true );
wp_enqueue_style( 'cartflows-import', CARTFLOWS_URL . 'assets/css/import.css', null, CARTFLOWS_VER, 'all' );
wp_style_add_data( 'cartflows-import', 'rtl', 'replace' );
wp_enqueue_script( 'cartflows-import', CARTFLOWS_URL . 'assets/js/import.js', array( 'jquery', 'wp-util', 'cartflows-rest-api', 'updates' ), CARTFLOWS_VER, true );
$localize_vars = array(
'_is_pro_active' => _is_cartflows_pro(),
// Flow and its rest fields.
'flow' => CARTFLOWS_FLOW_POST_TYPE,
'flow_fields' => array(
'id',
'title',
'flow_type',
'page_builder',
'flow_steps',
'licence_status',
'featured_image_url',
'featured_media', // @required for field `featured_image_url`.
),
// Flow type and rest fields.
'flow_type' => CARTFLOWS_TAXONOMY_FLOW_CATEGORY,
'flow_type_fields' => array(
'id',
'name',
'slug',
),
// Flow page builder and rest fields.
'flow_page_builder' => CARTFLOWS_TAXONOMY_FLOW_PAGE_BUILDER,
'flow_page_builder_fields' => array(
'id',
'name',
'slug',
),
// Step page builder and rest fields.
'step_page_builder' => CARTFLOWS_TAXONOMY_STEP_PAGE_BUILDER,
'step_page_builder_fields' => array(
'id',
'name',
'slug',
),
// Step and its rest fields.
'step' => CARTFLOWS_STEP_POST_TYPE,
'step_fields' => array(
'title',
'featured_image_url',
'featured_media', // @required for field `featured_image_url`.
'id',
'flow_type',
'step_type',
'page_builder',
'licence_status',
),
// Step type and its rest fields.
'step_type' => CARTFLOWS_TAXONOMY_STEP_TYPE,
'step_type_fields' => array(
'id',
'name',
'slug',
),
'domain_url' => CARTFLOWS_DOMAIN_URL,
'server_url' => CARTFLOWS_TEMPLATES_URL,
'server_rest_url' => CARTFLOWS_TEMPLATES_URL . 'wp-json/wp/v2/',
'site_url' => site_url(),
'admin_url' => admin_url(),
'licence_args' => CartFlows_API::get_instance()->get_licence_args(),
'ajaxurl' => admin_url( 'admin-ajax.php' ),
'debug' => ( ( defined( 'WP_DEBUG' ) && WP_DEBUG ) || isset( $_GET['debug'] ) ) ? true : false,
'required_plugins' => array(
'elementor' => array(
'button_title' => $this->get_plugin_button_string( 'elementor/elementor.php', 'Elementor' ),
'status' => $this->get_plugin_status( 'elementor/elementor.php' ),
'plugins' => array(
array(
'slug' => 'elementor', // For download from wp.org.
'status' => $this->get_plugin_status( 'elementor/elementor.php' ),
),
),
),
),
);
// Add thickbox.
add_thickbox();
wp_localize_script( 'cartflows-import', 'CartFlowsImportVars', $localize_vars );
wp_localize_script( 'cartflows-rest-api', 'CartFlowsImportVars', $localize_vars );
}
/**
* Load Template
*
* @since 1.0.0
*
* @hook cartflows_load_steps
* @return void
*/
function load_templates() {
check_ajax_referer( 'cf-load-steps', 'security' );
$args = ( isset( $_POST['args'] ) ) ? array_map( 'sanitize_text_field', $_POST['args'] ) : array();
$templates = CartFlows_API::get_instance()->get_templates( $args );
if ( $templates['templates_count'] ) {
wp_send_json_success( $templates );
} else {
wp_send_json_error( $templates );
}
wp_die();
}
/**
* Import.
*
* @since 1.0.0
*
* @hook wp_ajax_cartflows_import_flow_step
* @return void
*/
function import_flow() {
check_ajax_referer( 'cf-import-flow-step', 'security' );
$flow_id = isset( $_POST['flow_id'] ) ? intval( $_POST['flow_id'] ) : '';
$template_id = isset( $_POST['template_id'] ) ? intval( $_POST['template_id'] ) : '';
wcf()->logger->import_log( '------------------------------------' );
wcf()->logger->import_log( 'STARTED! Importing FLOW' );
wcf()->logger->import_log( '------------------------------------' );
wcf()->logger->import_log( '(✓) Creating new step from remote step [' . $template_id . '] for FLOW ' . get_the_title( $flow_id ) . ' [' . $flow_id . ']' );
$response = CartFlows_API::get_instance()->get_template( $template_id );
if ( false === $response['success'] ) {
wcf()->logger->import_log( '(✕) Failed to fetch remote data.' );
wp_send_json_error( $response );
}
wcf()->logger->import_log( '(✓) Successfully getting remote step response ' . json_encode( $response ) );
$new_step_id = wp_insert_post(
array(
'post_type' => CARTFLOWS_STEP_POST_TYPE,
'post_title' => $response['title'],
'post_content' => '',
'post_status' => 'publish',
)
);
if ( is_wp_error( $new_step_id ) ) {
wcf()->logger->import_log( '(✕) Failed to create new step for flow ' . $flow_id );
wp_send_json_error( $new_step_id );
}
wcf()->logger->import_log( '(✓) Created new step ' . '"' . $response['title'] . '" id ' . $new_step_id );
// insert post meta.
update_post_meta( $new_step_id, 'wcf-flow-id', $flow_id );
wcf()->logger->import_log( '(✓) Added flow ID ' . $flow_id . ' in post meta key wcf-flow-id.' );
/**
* Import & Set type.
*/
$term = isset( $response['data']['step_type'] ) ? $response['data']['step_type'] : '';
$term_slug = '';
if ( $term ) {
$taxonomy = CARTFLOWS_TAXONOMY_STEP_TYPE;
$term_exist = term_exists( $term->name, $taxonomy );
if ( empty( $term_exist ) ) {
$terms = array(
array(
'name' => $term->name,
),
);
Cartflows_Step_Post_Type::get_instance()->add_terms( $taxonomy, $terms );
wcf()->logger->import_log( '(✓) Created new term ' . $term->name );
}
$current_term = term_exists( $term->name, $taxonomy );
// Set type object.
$data = get_term( $current_term['term_id'], $taxonomy );
$term_slug = $data->slug;
$term_name = $data->name;
wp_set_object_terms( $new_step_id, $term_slug, CARTFLOWS_TAXONOMY_STEP_TYPE );
wcf()->logger->import_log( '(✓) Assigned existing term ' . $term_name . ' to the template ' . $new_step_id );
// Set type.
update_post_meta( $new_step_id, 'wcf-step-type', $term_slug );
wcf()->logger->import_log( '(✓) Updated term ' . $term_name . ' to the post meta wcf-step-type.' );
}
// Set flow.
wp_set_object_terms( $new_step_id, 'flow-' . $flow_id, CARTFLOWS_TAXONOMY_STEP_FLOW );
wcf()->logger->import_log( '(✓) Assigned flow step flow-' . $flow_id );
/**
* Update steps for the current flow.
*/
$flow_steps = get_post_meta( $flow_id, 'wcf-steps', true );
if ( ! is_array( $flow_steps ) ) {
$flow_steps = array();
}
$flow_steps[] = array(
'id' => $new_step_id,
'title' => $response['title'],
'type' => $term_slug,
);
update_post_meta( $flow_id, 'wcf-steps', $flow_steps );
wcf()->logger->import_log( '(✓) Updated flow steps post meta key \'wcf-steps\' ' . json_encode( $flow_steps ) );
// Import Post Meta.
self::import_post_meta( $new_step_id, $response );
wcf()->logger->import_log( '(✓) Importing step "' . get_the_title( $new_step_id ) . '" [' . $new_step_id . '] for FLOW "' . get_the_title( $flow_id ) . '" [' . $flow_id . ']' );
wcf()->logger->import_log( '------------------------------------' );
wcf()->logger->import_log( 'COMPLETE! Importing FLOW' );
wcf()->logger->import_log( '------------------------------------' );
do_action( 'cartflows_import_complete' );
wcf()->logger->import_log( '(✓) BATCH STARTED for step ' . $new_step_id . ' for Blog name \'' . get_bloginfo( 'name' ) . '\' (' . get_current_blog_id() . ')' );
// Batch Process.
do_action( 'cartflows_after_template_import', $new_step_id, $response );
/**
* End
*/
wp_send_json_success( $new_step_id );
}
/**
* Import Step.
*
* @since 1.0.0
* @hook wp_ajax_cartflows_step_import
*
* @return void
*/
function create_default_flow() {
check_ajax_referer( 'cf-default-flow', 'security' );
// Create post object.
$new_flow_post = array(
'post_content' => '',
'post_status' => 'publish',
'post_type' => CARTFLOWS_FLOW_POST_TYPE,
);
// Insert the post into the database.
$flow_id = wp_insert_post( $new_flow_post );
if ( is_wp_error( $flow_id ) ) {
wp_send_json_error( $flow_id->get_error_message() );
}
$flow_steps = array();
$steps_data = array(
'landing' => __( 'Landing Page', 'cartflows' ),
'checkout' => __( 'Checkout Page', 'cartflows' ),
'thankyou' => __( 'Thank You Page', 'cartflows' ),
);
foreach ( $steps_data as $slug => $title ) {
$post_content = '';
switch ( $slug ) {
case 'checkout':
$post_content = '';
break;
case 'thankyou':
$post_content = '';
break;
default:
$post_content = '';
break;
}
$step_id = wp_insert_post(
array(
'post_type' => CARTFLOWS_STEP_POST_TYPE,
'post_title' => $title,
'post_content' => $post_content,
'post_status' => 'publish',
)
);
if ( is_wp_error( $step_id ) ) {
wp_send_json_error( $step_id->get_error_message() );
}
if ( $step_id ) {
$flow_steps[] = array(
'id' => $step_id,
'title' => $title,
'type' => $slug,
);
// insert post meta.
update_post_meta( $step_id, 'wcf-flow-id', $flow_id );
update_post_meta( $step_id, 'wcf-step-type', $slug );
wp_set_object_terms( $step_id, $slug, CARTFLOWS_TAXONOMY_STEP_TYPE );
wp_set_object_terms( $step_id, 'flow-' . $flow_id, CARTFLOWS_TAXONOMY_STEP_FLOW );
}
}
update_post_meta( $flow_id, 'wcf-steps', $flow_steps );
wp_send_json_success( $flow_id );
}
/**
* Create Flow
*
* @return void
*/
function create_flow() {
check_ajax_referer( 'cf-create-flow', 'security' );
// Create post object.
$new_flow_post = array(
'post_content' => '',
'post_status' => 'publish',
'post_type' => CARTFLOWS_FLOW_POST_TYPE,
);
// Insert the post into the database.
$flow_id = wp_insert_post( $new_flow_post );
if ( is_wp_error( $flow_id ) ) {
wp_send_json_error( $flow_id->get_error_message() );
}
wp_send_json_success( $flow_id );
}
/**
* Create Step
*
* @return void
*/
function import_step() {
check_ajax_referer( 'cf-step-import', 'security' );
$template_id = isset( $_POST['template_id'] ) ? intval( $_POST['template_id'] ) : '';
$flow_id = isset( $_POST['flow_id'] ) ? intval( $_POST['flow_id'] ) : '';
$step_title = isset( $_POST['step_title'] ) ? sanitize_text_field( $_POST['step_title'] ) : '';
$step_type = isset( $_POST['step_type'] ) ? sanitize_title( $_POST['step_type'] ) : '';
$step_custom_title = isset( $_POST['step_custom_title'] ) ? sanitize_title( $_POST['step_custom_title'] ) : $step_title;
$cartflow_meta = Cartflows_Flow_Meta::get_instance();
$post_id = $cartflow_meta->create_step( $flow_id, $step_type, $step_custom_title );
wcf()->logger->import_log( '------------------------------------' );
wcf()->logger->import_log( 'STARTED! Importing STEP' );
wcf()->logger->import_log( '------------------------------------' );
if ( empty( $template_id ) || empty( $post_id ) ) {
/* translators: %s: template ID */
$data = sprintf( __( 'Invalid template id %1$s or post id %2$s.', 'cartflows' ), $template_id, $post_id );
wcf()->logger->import_log( $data );
wp_send_json_error( $data );
}
wcf()->logger->import_log( 'Remote Step ' . $template_id . ' for local flow "' . get_the_title( $post_id ) . '" [' . $post_id . ']' );
$response = CartFlows_API::get_instance()->get_template( $template_id );
wcf()->logger->import_log( json_encode( $response ) );
// Import Post Meta.
self::import_post_meta( $post_id, $response );
do_action( 'cartflows_import_complete' );
// Batch Process.
do_action( 'cartflows_after_template_import', $post_id, $response );
wcf()->logger->import_log( '------------------------------------' );
wcf()->logger->import_log( 'COMPLETE! Importing Step' );
wcf()->logger->import_log( '------------------------------------' );
wp_send_json_success( $post_id );
}
/**
* Import Step.
*
* @since 1.0.0
* @hook wp_ajax_cartflows_step_create_blank
*
* @return void
*/
function step_create_blank() {
check_ajax_referer( 'cf-step-create-blank', 'security' );
$flow_id = isset( $_POST['flow_id'] ) ? intval( $_POST['flow_id'] ) : '';
$step_type = isset( $_POST['step_type'] ) ? sanitize_text_field( $_POST['step_type'] ) : '';
$step_title = isset( $_POST['step_title'] ) ? sanitize_text_field( $_POST['step_title'] ) : '';
if ( empty( $flow_id ) || empty( $step_type ) ) {
/* translators: %s: flow ID */
$data = sprintf( __( 'Invalid flow id %1$s OR step type %2$s.', 'cartflows' ), $flow_id, $step_type );
wcf()->logger->import_log( $data );
wp_send_json_error( $data );
}
wcf()->logger->import_log( '------------------------------------' );
wcf()->logger->import_log( 'STARTED! Creating Blank STEP for Flow ' . $flow_id );
$step_type_title = str_replace( '-', ' ', $step_type );
$step_type_slug = strtolower( str_replace( '-', ' ', $step_type ) );
$new_step_id = wp_insert_post(
array(
'post_type' => CARTFLOWS_STEP_POST_TYPE,
'post_title' => $step_title,
'post_content' => '',
'post_status' => 'publish',
)
);
// insert post meta.
update_post_meta( $new_step_id, 'wcf-flow-id', $flow_id );
$taxonomy = CARTFLOWS_TAXONOMY_STEP_TYPE;
$term_exist = term_exists( $step_type_title, $taxonomy );
if ( empty( $term_exist ) ) {
$terms = array(
array(
'name' => $step_type_title,
),
);
Cartflows_Step_Post_Type::get_instance()->add_terms( $taxonomy, $terms );
wcf()->logger->import_log( '(✓) Created new term ' . $step_type_title );
}
$current_term = term_exists( $step_type_title, $taxonomy );
// Set type object.
$data = get_term( $current_term['term_id'], $taxonomy );
$step_slug = $data->slug;
wp_set_object_terms( $new_step_id, $data->slug, CARTFLOWS_TAXONOMY_STEP_TYPE );
wcf()->logger->import_log( '(✓) Assigned existing term ' . $step_type_title . ' to the template ' . $new_step_id );
// Set type.
update_post_meta( $new_step_id, 'wcf-step-type', $data->slug );
wcf()->logger->import_log( '(✓) Updated term ' . $data->name . ' to the post meta wcf-step-type.' );
// Set flow.
wp_set_object_terms( $new_step_id, 'flow-' . $flow_id, CARTFLOWS_TAXONOMY_STEP_FLOW );
wcf()->logger->import_log( '(✓) Assigned flow step flow-' . $flow_id );
CartFlows_Importer::get_instance()->set_step_to_flow( $flow_id, $new_step_id, $step_type_title, $step_slug );
wcf()->logger->import_log( 'COMPLETE! Creating Blank STEP for Flow ' . $flow_id );
wcf()->logger->import_log( '------------------------------------' );
wp_send_json_success( $new_step_id );
}
/**
* Import Post Meta
*
* @since 1.0.0
*
* @param integer $post_id Post ID.
* @param array $response Post meta.
* @return void
*/
public static function import_post_meta( $post_id, $response ) {
$metadata = (array) $response['post_meta'];
foreach ( $metadata as $meta_key => $meta_value ) {
$meta_value = isset( $meta_value[0] ) ? $meta_value[0] : '';
if ( $meta_value ) {
if ( is_serialized( $meta_value, true ) ) {
$raw_data = maybe_unserialize( stripslashes( $meta_value ) );
} elseif ( is_array( $meta_value ) ) {
$raw_data = json_decode( stripslashes( $meta_value ), true );
} else {
$raw_data = $meta_value;
}
if ( '_elementor_data' === $meta_key ) {
if ( is_array( $raw_data ) ) {
$raw_data = wp_slash( json_encode( $raw_data ) );
} else {
$raw_data = wp_slash( $raw_data );
}
wcf()->logger->import_log( $raw_data );
}
if ( is_array( $raw_data ) ) {
wcf()->logger->import_log( '(✓) Added post meta ' . $meta_key . ' | ' . json_encode( $raw_data ) );
} else {
if ( ! is_object( $raw_data ) ) {
wcf()->logger->import_log( '(✓) Added post meta ' . $meta_key . ' | ' . $raw_data );
}
}
update_post_meta( $post_id, $meta_key, $raw_data );
}
}
}
/**
* Import Template for Elementor
*
* @since 1.0.0
*
* @param integer $post_id Post ID.
* @param array $response Post meta.
* @param array $page_build_data Page build data.
* @return void
*/
public static function import_template_elementor( $post_id, $response, $page_build_data ) {
if ( ! is_plugin_active( 'elementor/elementor.php' ) ) {
$data = __( 'Elementor is not activated. Please activate plugin Elementor Page Builder to import the step.', 'cartflows' );
wcf()->logger->import_log( $data );
wp_send_json_error( $data );
}
require_once CARTFLOWS_DIR . 'classes/batch-process/class-cartflows-importer-elementor.php';
wcf()->logger->import_log( '# Started "importing page builder data" for step ' . $post_id );
$obj = new \Elementor\TemplateLibrary\CartFlows_Importer_Elementor();
$obj->import_single_template( $post_id );
wcf()->logger->import_log( '# Complete "importing page builder data" for step ' . $post_id );
}
/**
* Supported post types
*
* @since 1.0.0
*
* @return array Supported post types.
*/
public static function supported_post_types() {
return apply_filters(
'cartflows_supported_post_types',
array(
CARTFLOWS_FLOW_POST_TYPE,
)
);
}
/**
* Check supported post type
*
* @since 1.0.0
*
* @param string $post_type Post type.
* @return boolean Supported post type status.
*/
public static function is_supported_post( $post_type = '' ) {
if ( in_array( $post_type, self::supported_post_types() ) ) {
return true;
}
return false;
}
/**
* Set steps to the flow
*
* @param integer $flow_id Flow ID.
* @param integer $new_step_id New step ID.
* @param string $step_title Flow Type.
* @param string $step_slug Flow Type.
*/
function set_step_to_flow( $flow_id, $new_step_id, $step_title, $step_slug ) {
// Update steps for the current flow.
$flow_steps = get_post_meta( $flow_id, 'wcf-steps', true );
if ( ! is_array( $flow_steps ) ) {
$flow_steps = array();
}
$flow_steps[] = array(
'id' => $new_step_id,
'title' => $step_title,
'type' => $step_slug,
);
update_post_meta( $flow_id, 'wcf-steps', $flow_steps );
wcf()->logger->import_log( '(✓) Updated flow steps post meta key \'wcf-steps\' ' . json_encode( $flow_steps ) );
}
/**
* Localize variables in admin
*
* @param array $vars variables.
*/
function localize_vars( $vars ) {
$ajax_actions = array(
'cf_step_import',
'cf_load_steps',
'cf_create_flow',
'cf_default_flow',
'cf_step_create_blank',
'cf_import_flow_step',
);
foreach ( $ajax_actions as $action ) {
$vars[ $action . '_nonce' ] = wp_create_nonce( str_replace( '_', '-', $action ) );
}
return $vars;
}
/**
* Ajax action to activate plugin
*/
public function activate_plugin() {
$plugin_slug = isset( $_POST['plugin_slug'] ) ? sanitize_text_field( $_POST['plugin_slug'] ) : '';
if ( ! is_plugin_active( $plugin_slug ) ) {
$activate = activate_plugin( $plugin_slug, '', false, true );
if ( is_wp_error( $activate ) ) {
wp_send_json_error();
}
}
wp_send_json_success();
}
}
/**
* Initialize class object with 'get_instance()' method
*/
CartFlows_Importer::get_instance();
endif;