PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 5.0
MainWP Dashboard: Self-hosted WordPress Management for Agencies v5.0
6.2 6.1.8 6.1.7 6.1.6 6.1.5 6.1.4 6.1.3 6.1.2 6.1.1 6.1 6.0.12 6.0.11 4.6.0.1 5.0 5.0.1 5.0.2 5.0.3 5.0.3.1 5.0.3.2 5.1 5.1.1 5.2 5.2.1 5.2.2 5.3 All 153 releases
mainwp / class / class-mainwp-client-handler.php

class-mainwp-client-handler.php in MainWP Dashboard: Self-hosted WordPress Management for Agencies 5.0, at class/class-mainwp-client-handler.php

570 lines 19.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Client Handler.
4 *
5 * @package MainWP/Dashboard
6 */
7
8 namespace MainWP\Dashboard;
9
10 /**
11 * Class MainWP_Client_Handler
12 *
13 * @package MainWP\Dashboard
14 *
15 * @uses \MainWP\Dashboard\MainWP_Client_Handler
16 */
17 class MainWP_Client_Handler {
18
19 /**
20 * Private static variable to hold the single instance of the class.
21 *
22 * @static
23 *
24 * @var mixed Default null
25 */
26 private static $instance = null;
27
28 /**
29 * Method instance()
30 *
31 * Create a public static instance.
32 *
33 * @static
34 * @return MainWP_Client_Handler
35 */
36 public static function instance() {
37 if ( null === self::$instance ) {
38 self::$instance = new self();
39 }
40 return self::$instance;
41 }
42
43
44 /**
45 * Get default client fields.
46 *
47 * Get default client fields.
48 */
49 public static function get_default_client_fields() {
50
51 return array(
52 'client.name' => array(
53 'title' => esc_html__( 'Client Name (Required)', 'mainwp' ),
54 'desc' => esc_html__( 'Displays the Client name', 'mainwp' ),
55 'db_field' => 'name',
56 ),
57 'client.email' => array(
58 'title' => esc_html__( 'Client email', 'mainwp' ),
59 'desc' => esc_html__( 'Displays the client email', 'mainwp' ),
60 'db_field' => 'client_email',
61 ),
62 'client.phone' => array(
63 'title' => esc_html__( 'Client phone', 'mainwp' ),
64 'desc' => esc_html__( 'Displays the client phone', 'mainwp' ),
65 'db_field' => 'client_phone',
66 ),
67 'client.facebook' => array(
68 'title' => esc_html__( 'Client Facebook', 'mainwp' ),
69 'desc' => esc_html__( 'Displays the client Facebook', 'mainwp' ),
70 'db_field' => 'client_facebook',
71 ),
72 'client.twitter' => array(
73 'title' => esc_html__( 'Client Twitter', 'mainwp' ),
74 'desc' => esc_html__( 'Displays the client Twitter', 'mainwp' ),
75 'db_field' => 'client_twitter',
76 ),
77 'client.instagram' => array(
78 'title' => esc_html__( 'Client Instagram', 'mainwp' ),
79 'desc' => esc_html__( 'Displays the client Instagram', 'mainwp' ),
80 'db_field' => 'client_instagram',
81 ),
82 'client.linkedin' => array(
83 'title' => esc_html__( 'Client LinkedIn', 'mainwp' ),
84 'desc' => esc_html__( 'Displays the client LinkedIn', 'mainwp' ),
85 'db_field' => 'client_linkedin',
86 ),
87 'client.contact.address.1' => array(
88 'title' => esc_html__( 'Client address 1', 'mainwp' ),
89 'desc' => esc_html__( 'Displays the client contact address 1', 'mainwp' ),
90 'db_field' => 'address_1',
91 ),
92 'client.contact.address.2' => array(
93 'title' => esc_html__( 'Client address 2', 'mainwp' ),
94 'desc' => esc_html__( 'Displays the client contact address 2', 'mainwp' ),
95 'db_field' => 'address_2',
96 ),
97 'client.city' => array(
98 'title' => esc_html__( 'Client city', 'mainwp' ),
99 'desc' => esc_html__( 'Displays the client city', 'mainwp' ),
100 'db_field' => 'city',
101 ),
102 'client.state' => array(
103 'title' => esc_html__( 'Client state', 'mainwp' ),
104 'desc' => esc_html__( 'Displays the client state', 'mainwp' ),
105 'db_field' => 'state',
106 ),
107 'client.zip' => array(
108 'title' => esc_html__( 'Client ZIP', 'mainwp' ),
109 'desc' => esc_html__( 'Displays the client ZIP code', 'mainwp' ),
110 'db_field' => 'zip',
111 ),
112 'client.country' => array(
113 'title' => esc_html__( 'Client country', 'mainwp' ),
114 'desc' => esc_html__( 'Displays the client country', 'mainwp' ),
115 'db_field' => 'country',
116 ),
117 'client.note' => array(
118 'title' => esc_html__( 'Client notes', 'mainwp' ),
119 'desc' => esc_html__( 'Displays the client note', 'mainwp' ),
120 'db_field' => 'note',
121 ),
122 'client.suspended' => array(
123 'title' => esc_html__( 'Client status', 'mainwp' ),
124 'desc' => esc_html__( 'Displays the client suspended state', 'mainwp' ),
125 'db_field' => 'suspended',
126 ),
127 'client.created' => array(
128 'title' => esc_html__( 'Added on', 'mainwp' ),
129 'desc' => esc_html__( 'Displays the client added on', 'mainwp' ),
130 'tooltip' => esc_html__( 'Set the date your client was added to your MainWP Dashboard.', 'mainwp' ),
131 'db_field' => 'created',
132 ),
133 );
134 }
135
136 /**
137 * Get default client fields.
138 *
139 * Get default client fields.
140 */
141 public static function get_mini_default_client_fields() {
142
143 return array(
144 'client.name' => array(
145 'title' => esc_html__( 'Client Name (Required)', 'mainwp' ),
146 'desc' => esc_html__( 'Displays the Client name', 'mainwp' ),
147 'db_field' => 'name',
148 ),
149 'client.email' => array(
150 'title' => esc_html__( 'Client email', 'mainwp' ),
151 'desc' => esc_html__( 'Displays the client email', 'mainwp' ),
152 'db_field' => 'client_email',
153 ),
154 'client.phone' => array(
155 'title' => esc_html__( 'Client phone', 'mainwp' ),
156 'desc' => esc_html__( 'Displays the client phone', 'mainwp' ),
157 'db_field' => 'client_phone',
158 ),
159 );
160 }
161
162
163 /**
164 * Get default contact fields.
165 *
166 * Get default contact fields.
167 */
168 public static function get_default_contact_fields() {
169 return array(
170 'client.contact.name' => array(
171 'title' => esc_html__( 'Contact name (Required)', 'mainwp' ),
172 'desc' => esc_html__( 'Displays the client contact name', 'mainwp' ),
173 'db_field' => 'contact_name',
174 ),
175 'contact.role' => array(
176 'title' => esc_html__( 'Contact role', 'mainwp' ),
177 'desc' => esc_html__( 'Displays the contact role', 'mainwp' ),
178 'db_field' => 'contact_role',
179 ),
180 'contact.email' => array(
181 'title' => esc_html__( 'Contact email (Required)', 'mainwp' ),
182 'desc' => esc_html__( 'Displays the contact email', 'mainwp' ),
183 'db_field' => 'contact_email',
184 ),
185 'contact.phone' => array(
186 'title' => esc_html__( 'Contact phone', 'mainwp' ),
187 'desc' => esc_html__( 'Displays the contact phone', 'mainwp' ),
188 'db_field' => 'contact_phone',
189 ),
190 'contact.facebook' => array(
191 'title' => esc_html__( 'Contact Facebook', 'mainwp' ),
192 'desc' => esc_html__( 'Displays the contact Facebook', 'mainwp' ),
193 'db_field' => 'facebook',
194 ),
195 'contact.twitter' => array(
196 'title' => esc_html__( 'Contact Twitter', 'mainwp' ),
197 'desc' => esc_html__( 'Displays the contact Twitter', 'mainwp' ),
198 'db_field' => 'twitter',
199 ),
200 'contact.instagram' => array(
201 'title' => esc_html__( 'Contact Instagram', 'mainwp' ),
202 'desc' => esc_html__( 'Displays the contact Instagram', 'mainwp' ),
203 'db_field' => 'instagram',
204 ),
205 'contact.linkedin' => array(
206 'title' => esc_html__( 'Contact LinkedIn', 'mainwp' ),
207 'desc' => esc_html__( 'Displays the contact LinkedIn', 'mainwp' ),
208 'db_field' => 'linkedin',
209 ),
210 );
211 }
212
213 /**
214 * Get default contact fields.
215 *
216 * Get default contact fields.
217 */
218 public static function get_mini_default_contact_fields() {
219 return array(
220 'client.contact.name' => array(
221 'title' => esc_html__( 'Contact name (Required)', 'mainwp' ),
222 'desc' => esc_html__( 'Displays the client contact name', 'mainwp' ),
223 'db_field' => 'contact_name',
224 ),
225 'contact.role' => array(
226 'title' => esc_html__( 'Contact role', 'mainwp' ),
227 'desc' => esc_html__( 'Displays the contact role', 'mainwp' ),
228 'db_field' => 'contact_role',
229 ),
230 'contact.email' => array(
231 'title' => esc_html__( 'Contact email (Required)', 'mainwp' ),
232 'desc' => esc_html__( 'Displays the contact email', 'mainwp' ),
233 'db_field' => 'contact_email',
234 ),
235 );
236 }
237
238
239 /**
240 * Method get_compatible_tokens().
241 *
242 * Get compatible tokens.
243 */
244 public static function get_compatible_tokens() {
245 return array(
246 'client.contact.name' => 'client.contact.name',
247 'client.email' => 'contact.email',
248 'client.phone' => 'contact.phone',
249 );
250 }
251 /**
252 * Method rest_api_add_client().
253 *
254 * Rest API add client.
255 *
256 * @param array $data fields array.
257 * @param bool $edit Is edit.
258 *
259 * $data fields.
260 * 'client_email'.
261 * 'name'.
262 * 'client_facebook'.
263 * 'client_twitter'.
264 * 'client_instagram'.
265 * 'client_linkedin'.
266 * 'address_1'.
267 * 'address_2'.
268 * 'city'.
269 * 'zip'.
270 * 'state'.
271 * 'note'.
272 * 'selected_sites'.
273 * 'client_id'. - to edit client.
274 *
275 * @throws \Exception Error message.
276 * @return mixed Results.
277 */
278 public static function rest_api_add_client( $data, $edit = false ) { // phpcs:ignore -- complex function. Current complexity is the only way to achieve desired results, pull request solutions appreciated.
279
280 $params = array();
281
282 if ( $edit ) {
283
284 $client_id = isset( $data['client_id'] ) ? intval( $data['client_id'] ) : 0;
285
286 if ( empty( $client_id ) ) { // edit client.
287 return array(
288 'error' => esc_html__( 'Client ID field is required! Please enter a Client ID.', 'mainwp' ),
289 );
290 }
291
292 $params['client_id'] = $client_id;
293
294 if ( isset( $data['name'] ) ) {
295 $params['name'] = sanitize_text_field( wp_unslash( $data['name'] ) );
296 }
297
298 if ( isset( $data['address_1'] ) ) {
299 $params['address_1'] = sanitize_text_field( wp_unslash( $data['address_1'] ) );
300 }
301 if ( isset( $data['address_2'] ) ) {
302 $params['address_2'] = sanitize_text_field( wp_unslash( $data['address_2'] ) );
303 }
304 if ( isset( $data['city'] ) ) {
305 $params['city'] = sanitize_text_field( wp_unslash( $data['city'] ) );
306 }
307 if ( isset( $data['zip'] ) ) {
308 $params['zip'] = sanitize_text_field( wp_unslash( $data['zip'] ) );
309 }
310 if ( isset( $data['state'] ) ) {
311 $params['state'] = sanitize_text_field( wp_unslash( $data['state'] ) );
312 }
313
314 if ( isset( $data['country'] ) ) {
315 $params['country'] = sanitize_text_field( wp_unslash( $data['country'] ) );
316 }
317
318 if ( isset( $data['note'] ) ) {
319 $params['note'] = sanitize_text_field( wp_unslash( $data['note'] ) );
320 }
321
322 if ( isset( $data['client_email'] ) ) {
323 $params['client_email'] = sanitize_text_field( wp_unslash( $data['client_email'] ) );
324 }
325
326 if ( isset( $data['client_phone'] ) ) {
327 $params['client_phone'] = sanitize_text_field( wp_unslash( $data['client_phone'] ) );
328 }
329
330 if ( isset( $data['client_facebook'] ) ) {
331 $params['client_facebook'] = sanitize_text_field( wp_unslash( $data['client_facebook'] ) );
332 }
333
334 if ( isset( $data['client_twitter'] ) ) {
335 $params['client_twitter'] = sanitize_text_field( wp_unslash( $data['client_twitter'] ) );
336 }
337
338 if ( isset( $data['client_instagram'] ) ) {
339 $params['client_instagram'] = sanitize_text_field( wp_unslash( $data['client_instagram'] ) );
340 }
341
342 if ( isset( $data['client_linkedin'] ) ) {
343 $params['client_linkedin'] = sanitize_text_field( wp_unslash( $data['client_linkedin'] ) );
344 }
345
346 if ( isset( $data['created'] ) && is_numeric( $data['created'] ) ) {
347 $params['created'] = intval( $data['created'] );
348 }
349
350 try {
351 MainWP_DB_Client::instance()->update_client( $params, true );
352 } catch ( \Exception $e ) {
353 throw $e;
354 }
355
356 if ( isset( $data['selected_sites'] ) && is_array( $data['selected_sites'] ) ) {
357 $selected_sites = array_map( 'sanitize_text_field', wp_unslash( $data['selected_sites'] ) );
358 MainWP_DB_Client::instance()->update_selected_sites_for_client( $client_id, $selected_sites );
359 }
360
361 if ( isset( $data['custom_fields'] ) && is_array( $data['custom_fields'] ) ) {
362 $custom_fields = wp_unslash( $data['custom_fields'] );
363 foreach ( $custom_fields as $field ) {
364 $fie_name = isset( $field['field_name'] ) ? sanitize_text_field( wp_unslash( $field['field_name'] ) ) : '';
365 $fie_value = isset( $field['field_value'] ) ? sanitize_text_field( wp_unslash( $field['field_value'] ) ) : '';
366 $fie_desc = isset( $field['field_desc'] ) ? sanitize_text_field( wp_unslash( $field['field_desc'] ) ) : '';
367 if ( ! empty( $fie_name ) && ! empty( $fie_value ) ) {
368 $get_gen_field = MainWP_DB_Client::instance()->get_client_fields_by( 'field_name', $fie_name, 0 );
369 if ( $get_gen_field ) { // it is general field.
370 if ( ! empty( $fie_desc ) ) {
371 MainWP_DB_Client::instance()->update_client_field(
372 $get_gen_field->field_id,
373 array(
374 'field_desc' => $fie_desc,
375 )
376 );
377 }
378 MainWP_DB_Client::instance()->update_client_field_value( $get_gen_field->field_id, $fie_value, $client_id ); // add or update general field value for the client.
379 } else {
380 $indi_gen_field = MainWP_DB_Client::instance()->get_client_fields_by( 'field_name', $fie_name, $client_id );
381 if ( $indi_gen_field ) { // it is individual field.
382
383 if ( ! empty( $fie_desc ) ) {
384 MainWP_DB_Client::instance()->update_client_field(
385 $indi_gen_field->field_id,
386 array(
387 'field_desc' => $fie_desc,
388 'client_id' => $client_id,
389 )
390 );
391 }
392 MainWP_DB_Client::instance()->update_client_field_value( $indi_gen_field->field_id, $fie_value, $client_id ); // add or update individual field value for the client.
393 }
394 }
395 }
396 }
397 }
398
399 return array(
400 'success' => true,
401 'clientid' => $client_id,
402 );
403
404 } else {
405
406 $params['name'] = isset( $data['name'] ) ? sanitize_text_field( wp_unslash( $data['name'] ) ) : '';
407
408 if ( empty( $params['name'] ) ) {
409 return array(
410 'error' => esc_html__( 'Client name field is required! Please enter a Client name.', 'mainwp' ),
411 );
412 }
413
414 $params['address_1'] = isset( $data['address_1'] ) ? sanitize_text_field( wp_unslash( $data['address_1'] ) ) : '';
415 $params['address_2'] = isset( $data['address_2'] ) ? sanitize_text_field( wp_unslash( $data['address_2'] ) ) : '';
416 $params['city'] = isset( $data['city'] ) ? sanitize_text_field( wp_unslash( $data['city'] ) ) : '';
417 $params['zip'] = isset( $data['zip'] ) ? sanitize_text_field( wp_unslash( $data['zip'] ) ) : '';
418 $params['state'] = isset( $data['state'] ) ? sanitize_text_field( wp_unslash( $data['state'] ) ) : '';
419 $params['country'] = isset( $data['country'] ) ? sanitize_text_field( wp_unslash( $data['country'] ) ) : '';
420 $params['note'] = isset( $data['note'] ) ? sanitize_text_field( wp_unslash( $data['note'] ) ) : '';
421 $params['client_email'] = isset( $data['client_email'] ) ? sanitize_text_field( wp_unslash( $data['client_email'] ) ) : '';
422 $params['client_phone'] = isset( $data['client_phone'] ) ? sanitize_text_field( wp_unslash( $data['client_phone'] ) ) : '';
423 $params['client_facebook'] = isset( $data['client_facebook'] ) ? sanitize_text_field( wp_unslash( $data['client_facebook'] ) ) : '';
424 $params['client_twitter'] = isset( $data['client_twitter'] ) ? sanitize_text_field( wp_unslash( $data['client_twitter'] ) ) : '';
425 $params['client_instagram'] = isset( $data['client_instagram'] ) ? sanitize_text_field( wp_unslash( $data['client_instagram'] ) ) : '';
426 $params['client_linkedin'] = isset( $data['client_linkedin'] ) ? sanitize_text_field( wp_unslash( $data['client_linkedin'] ) ) : '';
427
428 $inserted = MainWP_DB_Client::instance()->update_client( $params );
429
430 if ( empty( $inserted ) ) {
431 return array(
432 'error' => esc_html__( 'Undefined error. Please try again.', 'mainwp' ),
433 );
434 }
435
436 $selected_sites = ( isset( $data['selected_sites'] ) && is_array( $data['selected_sites'] ) ) ? array_map( 'sanitize_text_field', wp_unslash( $data['selected_sites'] ) ) : array();
437
438 MainWP_DB_Client::instance()->update_selected_sites_for_client( $inserted->client_id, $selected_sites );
439
440 return array(
441 'success' => true,
442 'clientid' => $inserted->client_id,
443 );
444 }
445 }
446
447
448 /**
449 * Method get_website_client_tokens_data()
450 *
451 * Get website client tokens.
452 *
453 * @param int $websiteid Website ID.
454 *
455 * @return mixed $result Result of tokens.
456 */
457 public function get_website_client_tokens_data( $websiteid = false ) { // phpcs:ignore -- complex function. Current complexity is the only way to achieve desired results, pull request solutions appreciated.
458 if ( empty( $websiteid ) ) {
459 return false;
460 }
461 $website = MainWP_DB::instance()->get_website_by_id( $websiteid );
462 if ( empty( $website ) ) {
463 return false;
464 }
465
466 $client_tokens = array();
467
468 $client_tokens['client.site.url'] = $website->url;
469 $client_tokens['client.site.name'] = $website->name;
470
471 // init values.
472 $default_client_fields = self::get_default_client_fields();
473 foreach ( $default_client_fields as $tok_name => $field ) {
474 $client_tokens[ $tok_name ] = ''; // the tokens with empty value will be removed from the report.
475 }
476 $contact_fields = self::get_default_contact_fields();
477 if ( ! empty( $contact_fields ) && is_array( $contact_fields ) ) {
478 foreach ( $contact_fields as $tok_name => $field ) {
479 $client_tokens[ $tok_name ] = ''; // the tokens with empty value will be removed from the report.
480 }
481 }
482
483 $custom_tokens_fields = MainWP_DB_Client::instance()->get_client_fields( true, $website->client_id );
484 if ( ! empty( $custom_tokens_fields ) && is_array( $custom_tokens_fields ) ) {
485 foreach ( $custom_tokens_fields as $fields ) {
486 $client_tokens[ $fields->field_name ] = ''; // the tokens with empty value will be removed from the report.
487 }
488 }
489
490 if ( empty( $website->client_id ) ) {
491 return $client_tokens;
492 }
493
494 $clientid = $website->client_id;
495
496 $client_info = MainWP_DB_Client::instance()->get_wp_client_by( 'client_id', $clientid );
497
498 if ( empty( $client_info ) ) {
499 return $client_tokens;
500 }
501
502 if ( ! empty( $custom_tokens_fields ) && is_array( $custom_tokens_fields ) ) {
503 foreach ( $custom_tokens_fields as $fields ) {
504 $client_tokens[ $fields->field_name ] = $fields->field_value;
505 }
506 }
507
508 foreach ( $default_client_fields as $tok_name => $field ) {
509 $db_field = $field['db_field'];
510 if ( property_exists( $client_info, $db_field ) ) {
511 $client_tokens[ $tok_name ] = $client_info->{$db_field};
512 }
513 }
514
515 if ( ! empty( $contact_fields ) && is_array( $contact_fields ) ) {
516 foreach ( $contact_fields as $tok_name => $field ) {
517 $db_field = isset( $field['db_field'] ) ? $field['db_field'] : '';
518 $val = '' !== $db_field && property_exists( $client_info, $db_field ) ? $client_info->{$db_field} : false;
519 if ( false !== $val ) {
520 $client_tokens[ $tok_name ] = $val;
521 }
522 }
523 }
524 $client_tokens = apply_filters( 'mainwp_clients_website_client_tokens', $client_tokens, $websiteid, $clientid );
525 return $client_tokens;
526 }
527
528 /**
529 * Method get_favico_url()
530 *
531 * Get Child Site favicon URL.
532 *
533 * @param string $image_path Client image url path.
534 *
535 * @return mixed $full_url Full image URL.
536 */
537 public static function get_client_image_url( $image_path ) {
538 $full_url = '';
539 if ( ! empty( $image_path ) ) {
540 if ( false !== stripos( $image_path, 'assets/images/demo/clients/' ) || false !== stripos( $image_path, 'assets/images/demo/contacts/' ) ) {
541 $full_url = MAINWP_PLUGIN_URL . $image_path;
542 } else {
543 $dirs = MainWP_System_Utility::get_mainwp_dir( 'client-images', true );
544 if ( file_exists( $dirs[0] . $image_path ) ) {
545 $full_url = $dirs[1] . $image_path;
546 } else {
547 $full_url = '';
548 }
549 }
550 }
551 return $full_url;
552 }
553
554 /**
555 * Method show_notice_existed_contact_emails()
556 */
557 public static function show_notice_existed_contact_emails() {
558 $existed_emails = MainWP_Utility::get_flash_message( 'contact_existed_emails' );
559 if ( ! empty( $existed_emails ) ) {
560 $existed_emails = esc_html( $existed_emails );
561 $existed_emails = str_replace( '|', '<br/>', $existed_emails );
562 ?>
563 <div class="ui yellow message">
564 <?php printf( esc_html__( 'Existed contact emails.%sPlease try again.', 'mainwp' ), '<br/>' . $existed_emails . '</br>' ); // phpcs:ignore WordPress.Security.EscapeOutput ?>
565 </div>
566 <?php
567 }
568 }
569 }
570