PluginProbe
SellKit – Funnel builder and checkout optimizer for WooCommerce to sell more, faster / 1.7.9
SellKit – Funnel builder and checkout optimizer for WooCommerce to sell more, faster v1.7.9
2.7.0 2.6.0 trunk 1.1.0 1.1.4 1.2.1 1.2.2 1.2.3 1.2.5 1.2.9 1.3.1 1.3.2 1.5.0 1.5.1 1.5.4 1.5.7 1.5.8 1.5.9 1.6.2 1.6.5 1.6.8 1.7.2 1.7.4 1.7.5 1.7.9 All 43 releases
sellkit / includes / admin / funnel / importer / step-importer.php

step-importer.php in SellKit – Funnel builder and checkout optimizer for WooCommerce to sell more, faster 1.7.9, at includes/admin/funnel/importer/step-importer.php

291 lines 8.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Sellkit\Admin\Funnel\Importer;
4
5 use Sellkit\Admin\Funnel\Importer\Page_Builder\Importer_Base;
6 use stdClass;
7
8 defined( 'ABSPATH' ) || die();
9
10 /**
11 * Class Step Importer.
12 *
13 * @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
14 * @since 1.1.0
15 */
16 class Step_Importer {
17
18 /**
19 * Importer object.
20 *
21 * @var object
22 */
23 public static $importer;
24
25 /**
26 * Step data.
27 *
28 * @var array
29 */
30 public $step_data;
31
32 /**
33 * Step_Importer constructor.
34 *
35 * @since 1.1.0
36 */
37 public function __construct() {
38 self::$importer = new Importer_Base();
39 }
40
41 /**
42 * Importing template.
43 *
44 * @since 1.1.0
45 * @param object $data Funnel id.
46 * @param string $new_step_id New step id.
47 * @SuppressWarnings(PHPMD.NPathComplexity)
48 */
49 public function import_template( $data, $new_step_id ) {
50 self::$importer->push_to_queue( [
51 'data' => $data,
52 'new_step_id' => $new_step_id,
53 ] );
54 }
55
56 /**
57 * Runs all importing.
58 *
59 * @since 1.1.0
60 */
61 public function run() {
62 self::$importer->save()->dispatch();
63 }
64
65 /**
66 * Imports the step
67 *
68 * @since 1.1.0
69 * @param string $step_id Step id.
70 */
71 public function import_from_api( $step_id ) {
72 if ( empty( $step_id ) ) {
73 return new \WP_Error( 'sellkit_step_importer_has_no_step_id', esc_html__( 'Does not have any step id for importing', 'sellkit' ) );
74 }
75
76 $response = wp_remote_get( "https://templates.getsellkit.com/wp-json/sellkit/v1/step/{$step_id}" );
77
78 $response_code = wp_remote_retrieve_response_code( $response );
79
80 if ( ! is_wp_error( $response ) && ! empty( $response['body'] ) && 200 === (int) $response_code ) {
81 $step_data = json_decode( $response['body'] );
82
83 return $step_data;
84 }
85
86 new \WP_Error( 'sellkit_funnel_step_importing_data_error', esc_html__( 'Something went wrong in importing data from API.', 'sellkit' ) );
87 }
88
89 /**
90 * Imports data to funnel.
91 *
92 * @since 1.1.0
93 * @param object $data Step data.
94 * @param int $funnel_id Funnel id.
95 * @param int $origin_node Origin node id.
96 * @param int $target_node Target node id.
97 * @param int $target_index Target index.
98 * @SuppressWarnings(PHPMD.NPathComplexity)
99 * @SuppressWarnings(PHPMD.CyclomaticComplexity)
100 */
101 public function import_to_funnel( $data, $funnel_id, $origin_node = null, $target_node = null, $target_index = 0 ) {
102 $meta_data = [];
103 $step_data = [];
104
105 if ( empty( $data ) ) {
106 $data = new stdClass();
107 }
108
109 if ( property_exists( $data, 'meta' ) ) {
110 $meta_data = (array) $data->meta;
111 }
112
113 $funnel_step_data = get_post_meta( $funnel_id, 'sellkit_steps', true );
114 $funnel_nodes = get_post_meta( $funnel_id, 'nodes', true );
115
116 if ( empty( $meta_data['nodes'] ) && array_key_exists( 'step_data', $meta_data ) ) {
117 $step_data = unserialize( $meta_data['step_data'] ); //phpcs:ignore
118 }
119
120 if ( ! empty( $meta_data['nodes'] ) ) {
121 $step_data = unserialize( $meta_data['nodes'] ); //phpcs:ignore
122 }
123
124 if ( ! empty( $funnel_nodes ) ) {
125 $funnel_step_data = get_post_meta( $funnel_id, 'nodes', true );
126 }
127
128 unset( $step_data['funnel_id'] );
129 unset( $step_data['number'] );
130 unset( $step_data['data'] );
131 unset( $step_data['targets'] );
132
133 if ( ! empty( $target_node ) ) {
134 $current_target = [ 'nodeId' => $target_node ];
135 }
136
137 $funnel_step_data = ! empty( $funnel_step_data ) ? $funnel_step_data : [];
138 $new_step_data = $this->create_new_step_page( $step_data );
139
140 if ( ! empty( $current_target ) ) {
141 $new_step_data['targets'] = ! is_null( $current_target ) ? [ $current_target ] : [];
142 }
143
144 // Adding current target info the the step.
145 $new_step_data['current_target_index'] = $target_index;
146
147 if ( 'last-node' === $origin_node ) {
148 $first_end_path_node_key = \Sellkit_Admin_Steps::get_first_end_path_node_key( $funnel_step_data );
149
150 $new_step_data['origin_node'] = 'last-node';
151
152 if ( $first_end_path_node_key ) {
153 unset( $funnel_step_data[ $first_end_path_node_key ]['origin_node'] );
154 }
155 }
156
157 $old_node_keys = array_keys( (array) $funnel_step_data );
158 $new_funnel_step_data = (array) $funnel_step_data;
159 $new_step_id = intval( end( $old_node_keys ) ) + 1;
160
161 if (
162 ( array_key_exists( 'type', $new_step_data ) && 'decision' === $new_step_data['type']['key'] && ! is_null( $target_node ) ) ||
163 ( array_key_exists( 'type', $new_step_data ) && 'upsell' === $new_step_data['type']['key'] && ! is_null( $target_node ) ) ||
164 ( array_key_exists( 'type', $new_step_data ) && 'downsell' === $new_step_data['type']['key'] && ! is_null( $target_node ) )
165 ) {
166 $new_step_data['targets'] = [
167 $current_target,
168 $current_target
169 ];
170 }
171
172 $new_funnel_step_data[ $new_step_id ] = $new_step_data;
173
174 if ( 'none' === $origin_node && 'none' === $target_node ) {
175 $new_funnel_step_data = [ 1 => $new_step_data ];
176 }
177
178 if ( 'last-node' !== $origin_node && ! empty( $origin_node ) && is_object( $new_funnel_step_data[ $origin_node ]['type'] ) ) {
179 $new_funnel_step_data[ $origin_node ]['type'] = (array) $new_funnel_step_data[ $origin_node ]['type'];
180 }
181
182 if (
183 'last-node' !== $origin_node &&
184 'none' !== $origin_node &&
185 ! empty( $origin_node ) &&
186 'decision' !== $new_funnel_step_data[ $origin_node ]['type']['key'] &&
187 'upsell' !== $new_funnel_step_data[ $origin_node ]['type']['key'] &&
188 'downsell' !== $new_funnel_step_data[ $origin_node ]['type']['key']
189 ) {
190 $new_funnel_step_data[ $origin_node ]['targets'] = [ [ 'nodeId' => strval( $new_step_id ) ] ];
191 }
192
193 if (
194 'last-node' !== $origin_node &&
195 ! empty( $origin_node ) &&
196 (
197 'decision' === $new_funnel_step_data[ $origin_node ]['type']['key'] ||
198 'upsell' === $new_funnel_step_data[ $origin_node ]['type']['key'] ||
199 'downsell' === $new_funnel_step_data[ $origin_node ]['type']['key']
200 )
201 ) {
202 if ( is_array( $new_funnel_step_data[ $origin_node ]['targets'] ) && empty( $new_funnel_step_data[ $origin_node ]['targets'][0] ) ) {
203 $new_funnel_step_data[ $origin_node ]['targets'][0] = 'none' !== $target_node ? [ 'nodeId' => $target_node ] : null;
204 }
205
206 if ( is_array( $new_funnel_step_data[ $origin_node ]['targets'] ) && empty( $new_funnel_step_data[ $origin_node ]['targets'][1] ) ) {
207 $new_funnel_step_data[ $origin_node ]['targets'][1] = 'none' !== $target_node ? [ 'nodeId' => $target_node ] : null;
208 }
209
210 $new_funnel_step_data[ $origin_node ]['targets'][ (int) $target_index ] = [ 'nodeId' => strval( $new_step_id ) ];
211 }
212
213 if ( empty( $funnel_nodes ) && 'none' !== $origin_node && 'none' !== $target_node ) {
214 update_post_meta( $funnel_id, 'sellkit_steps', $new_funnel_step_data );
215 }
216
217 if ( ! empty( $funnel_nodes ) || ( 'none' === $origin_node && 'none' === $target_node ) ) {
218 update_post_meta( $funnel_id, 'nodes', $new_funnel_step_data );
219 }
220
221 $content = '';
222
223 if ( property_exists( $data, 'post_content' ) ) {
224 $content = $data->post_content;
225 }
226
227 $args = [
228 'ID' => $new_step_data['page_id'],
229 'post_content' => $content,
230 ];
231
232 wp_update_post( $args );
233
234 if ( ! property_exists( $data, 'meta' ) ) {
235 $data->meta = [];
236 }
237
238 foreach ( $data->meta as $meta_key => $meta_value ) {
239 if ( '_elementor_data' === $meta_key ) {
240
241 if ( ! is_array( $meta_value ) ) {
242 $elementor_data = add_magic_quotes( $meta_value );
243 $elementor_data = json_decode( $elementor_data, true );
244 }
245 update_post_meta( $new_step_data['page_id'], $meta_key, $elementor_data );
246 continue;
247 }
248
249 if ( '_elementor_css' === $meta_key ) {
250 continue;
251 }
252
253 if ( is_serialized( $meta_value, true ) ) {
254 $meta_value = maybe_unserialize( stripslashes( $meta_value ) );
255 }
256
257 if ( 'step_data' === $meta_key ) {
258 $meta_value['funnel_id'] = intval( $funnel_id );
259 }
260
261 update_post_meta( $new_step_data['page_id'], $meta_key, $meta_value );
262 }
263
264 return $new_step_data['page_id'];
265 }
266
267 /**
268 * Filter step data before saving.
269 *
270 * @since 1.1.0
271 * @param array $last_step Step data.
272 */
273 public function create_new_step_page( $last_step ) {
274 if ( ! array_key_exists( 'title', $last_step ) || is_null( $last_step['title'] ) ) {
275 $last_step['title'] = 'step';
276 }
277
278 $new_step_id = wp_insert_post( [
279 'post_type' => \Sellkit_Admin_Steps::SELLKIT_STEP_POST_TYPE,
280 'post_title' => $last_step['title'],
281 'post_name' => sanitize_title( $last_step['title'] ),
282 'post_status' => 'publish',
283 ] );
284
285 $last_step['page_id'] = $new_step_id;
286 $last_step['slug'] = get_post_field( 'post_name', $new_step_id );
287
288 return $last_step;
289 }
290 }
291