PluginProbe
SellKit – Funnel builder and checkout optimizer for WooCommerce to sell more, faster / 2.7.0
SellKit – Funnel builder and checkout optimizer for WooCommerce to sell more, faster v2.7.0
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 2.7.0, at includes/admin/funnel/importer/step-importer.php

307 lines 8.9 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 ) && isset( $new_funnel_step_data[ $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 'none' !== $origin_node &&
195 'last-node' !== $origin_node &&
196 ! empty( $origin_node ) &&
197 (
198 'decision' === $new_funnel_step_data[ $origin_node ]['type']['key'] ||
199 'upsell' === $new_funnel_step_data[ $origin_node ]['type']['key'] ||
200 'downsell' === $new_funnel_step_data[ $origin_node ]['type']['key']
201 )
202 ) {
203 if ( is_array( $new_funnel_step_data[ $origin_node ]['targets'] ) && empty( $new_funnel_step_data[ $origin_node ]['targets'][0] ) ) {
204 $new_funnel_step_data[ $origin_node ]['targets'][0] = 'none' !== $target_node ? [ 'nodeId' => $target_node ] : null;
205 }
206
207 if ( is_array( $new_funnel_step_data[ $origin_node ]['targets'] ) && empty( $new_funnel_step_data[ $origin_node ]['targets'][1] ) ) {
208 $new_funnel_step_data[ $origin_node ]['targets'][1] = 'none' !== $target_node ? [ 'nodeId' => $target_node ] : null;
209 }
210
211 $new_funnel_step_data[ $origin_node ]['targets'][ (int) $target_index ] = [ 'nodeId' => strval( $new_step_id ) ];
212 }
213
214 if (
215 'last-node' !== $origin_node &&
216 isset( $new_funnel_step_data[ $new_step_id ] ) &&
217 isset( $new_funnel_step_data[ $new_step_id ]['origin_node'] ) &&
218 'last-node' === $new_funnel_step_data[ $new_step_id ]['origin_node'] &&
219 (
220 'decision' !== $new_funnel_step_data[ $new_step_id ]['type']['key'] ||
221 'upsell' !== $new_funnel_step_data[ $new_step_id ]['type']['key'] ||
222 'downsell' !== $new_funnel_step_data[ $new_step_id ]['type']['key']
223 )
224 ) {
225 unset( $new_funnel_step_data[ $new_step_id ]['origin_node'] );
226 }
227
228 if ( empty( $funnel_nodes ) && 'none' !== $origin_node && 'none' !== $target_node ) {
229 update_post_meta( $funnel_id, 'sellkit_steps', $new_funnel_step_data );
230 }
231
232 if ( ! empty( $funnel_nodes ) || ( 'none' === $origin_node && 'none' === $target_node ) ) {
233 update_post_meta( $funnel_id, 'nodes', $new_funnel_step_data );
234 }
235
236 $content = '';
237
238 if ( property_exists( $data, 'post_content' ) ) {
239 $content = $data->post_content;
240 }
241
242 $args = [
243 'ID' => $new_step_data['page_id'],
244 'post_content' => $content,
245 ];
246
247 wp_update_post( $args );
248
249 if ( ! property_exists( $data, 'meta' ) ) {
250 $data->meta = [];
251 }
252
253 foreach ( $data->meta as $meta_key => $meta_value ) {
254 if ( '_elementor_data' === $meta_key ) {
255
256 if ( ! is_array( $meta_value ) ) {
257 $elementor_data = json_decode( $meta_value, true );
258 $elementor_data = add_magic_quotes( $elementor_data );
259 }
260
261 update_post_meta( $new_step_data['page_id'], $meta_key, $elementor_data );
262 continue;
263 }
264
265 if ( '_elementor_css' === $meta_key ) {
266 continue;
267 }
268
269 if ( is_serialized( $meta_value, true ) ) {
270 $meta_value = maybe_unserialize( stripslashes( $meta_value ) );
271 }
272
273 if ( 'step_data' === $meta_key ) {
274 $meta_value['funnel_id'] = intval( $funnel_id );
275 }
276
277 update_post_meta( $new_step_data['page_id'], $meta_key, $meta_value );
278 }
279
280 return $new_step_data['page_id'];
281 }
282
283 /**
284 * Filter step data before saving.
285 *
286 * @since 1.1.0
287 * @param array $last_step Step data.
288 */
289 public function create_new_step_page( $last_step ) {
290 if ( ! array_key_exists( 'title', $last_step ) || is_null( $last_step['title'] ) ) {
291 $last_step['title'] = 'step';
292 }
293
294 $new_step_id = wp_insert_post( [
295 'post_type' => \Sellkit_Admin_Steps::SELLKIT_STEP_POST_TYPE,
296 'post_title' => $last_step['title'],
297 'post_name' => sanitize_title( $last_step['title'] ),
298 'post_status' => 'publish',
299 ] );
300
301 $last_step['page_id'] = $new_step_id;
302 $last_step['slug'] = get_post_field( 'post_name', $new_step_id );
303
304 return $last_step;
305 }
306 }
307