PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 4.6.0.1
MainWP Dashboard: Self-hosted WordPress Management for Agencies v4.6.0.1
6.2.2 6.2.1 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 All 155 releases
mainwp / pages / page-mainwp-updates-handler.php

page-mainwp-updates-handler.php in MainWP Dashboard: Self-hosted WordPress Management for Agencies 4.6.0.1, at pages/page-mainwp-updates-handler.php

939 lines 31.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * MainWP Updates Handler.
4 *
5 * @package MainWP/Dashboard
6 */
7
8 namespace MainWP\Dashboard;
9
10 /**
11 * Class MainWP_Updates_Handler
12 *
13 * @package MainWP\Dashboard
14 */
15 class MainWP_Updates_Handler {
16
17 /**
18 * Get Class Name
19 *
20 * @return string __CLASS__
21 */
22 public static function get_class_name() {
23 return __CLASS__;
24 }
25
26 /**
27 * Method upgrade_site()
28 *
29 * Check Child Site ID & Update.
30 *
31 * @param int $id Child site ID.
32 *
33 * @return string
34 * @throws MainWP_Exception Error messages.
35 *
36 * @uses \MainWP\Dashboard\MainWP_Connect::fetch_url_authed()
37 * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
38 * @uses \MainWP\Dashboard\MainWP_DB::get_website_option()
39 * @uses \MainWP\Dashboard\MainWP_Exception
40 * @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
41 */
42 public static function upgrade_site( $id ) {
43 if ( isset( $id ) && MainWP_Utility::ctype_digit( $id ) ) {
44
45 $website = MainWP_DB::instance()->get_website_by_id( $id );
46
47 if ( MainWP_System_Utility::is_suspended_site( $website ) ) {
48 throw new MainWP_Exception( 'ERROR', '<i class="pause circular yellow inverted icon"></i> ' . esc_html__( 'Suspended site.', 'mainwp' ) ); //phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped
49 }
50
51 $information = self::upgrade_website( $website );
52
53 if ( is_array( $information ) ) {
54 if ( isset( $information['upgrade'] ) && ( 'SUCCESS' === $information['upgrade'] ) ) {
55 MainWP_DB::instance()->update_website_option( $website, 'wp_upgrades', wp_json_encode( array() ) );
56 do_action( 'mainwp_after_upgrade_wp_success', $website, $information );
57 return '<i class="green check icon"></i>';
58 } elseif ( isset( $information['upgrade'] ) ) {
59 $errorMsg = '';
60 if ( 'LOCALIZATION' === $information['upgrade'] ) {
61 $errorMsg = '<i class="red times icon"></i> ' . esc_html__( 'No update found for the set locale.', 'mainwp' );
62 } elseif ( 'NORESPONSE' === $information['upgrade'] ) {
63 $errorMsg = '<i class="red times icon"></i> ' . esc_html__( 'No response from the child site server.', 'mainwp' );
64 }
65 throw new MainWP_Exception( 'WPERROR', $errorMsg ); //phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped
66 } elseif ( isset( $information['error'] ) ) {
67 throw new MainWP_Exception( 'WPERROR', esc_html( $information['error'] ) );
68 } else {
69 throw new MainWP_Exception( 'ERROR', '<i class="red times icon"></i> ' . esc_html__( 'Invalid response from child site.', 'mainwp' ) );
70 }
71 }
72 }
73
74 throw new MainWP_Exception( 'ERROR', '<i class="red times icon"></i> ' . esc_html__( 'Site ID not found. Please reload the page and try again.', 'mainwp' ) );
75 }
76
77 /**
78 * Method upgrade_website()
79 *
80 * Update WP for site.
81 *
82 * @param object $website Child site object.
83 *
84 * @return mixed|false update result or false.
85 * @throws MainWP_Exception Error message.
86 *
87 * @uses \MainWP\Dashboard\MainWP_System_Utility::can_edit_website()
88 */
89 public static function upgrade_website( $website ) {
90 if ( MainWP_System_Utility::can_edit_website( $website ) ) {
91
92 $wpcore_update_disabled_by = MainWP_System_Utility::disabled_wpcore_update_by( $website );
93 if ( ! empty( $wpcore_update_disabled_by ) ) {
94 throw new MainWP_Exception( 'ERROR', $wpcore_update_disabled_by ); //phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped
95 }
96 /**
97 * Action: mainwp_before_wp_update
98 *
99 * Fires before WP update.
100 *
101 * @since 4.1
102 */
103 do_action( 'mainwp_before_wp_update', $website );
104
105 $information = MainWP_Connect::fetch_url_authed( $website, 'upgrade' );
106
107 // logging feature.
108 $error = '';
109 $success = false;
110
111 if ( is_array( $information ) ) {
112 if ( isset( $information['upgrade'] ) && ( 'SUCCESS' === $information['upgrade'] ) ) {
113 $success = true;
114 } elseif ( isset( $information['upgrade'] ) ) {
115 $errorMsg = '';
116 if ( 'LOCALIZATION' === $information['upgrade'] ) {
117 $error = esc_html__( 'No update found for the set locale.', 'mainwp' );
118 } elseif ( 'NORESPONSE' === $information['upgrade'] ) {
119 $error = esc_html__( 'No response from the child site server.', 'mainwp' );
120 }
121 } elseif ( isset( $information['error'] ) ) {
122 $error = esc_html( $information['error'] );
123 } else {
124 $error = esc_html__( 'Invalid response from child site.', 'mainwp' );
125 }
126 }
127
128 $output_array = array(
129 'old_version' => isset( $information['old_version'] ) ? $information['old_version'] : '',
130 'version' => isset( $information['version'] ) ? $information['version'] : '',
131 'success' => $success ? 1 : 0,
132 'error' => $error,
133 );
134 mainwp_get_actions_handler_instance()->do_action_mainwp_install_actions( $website, 'updated', $output_array, 'core' );
135
136 /**
137 * Action: mainwp_after_wp_update
138 *
139 * Fires after WP update.
140 *
141 * @since 4.1
142 */
143 do_action( 'mainwp_after_wp_update', $information, $website );
144
145 return $information;
146 }
147 return false;
148 }
149
150 /**
151 * Add a plugin or theme to the ignor list.
152 *
153 * @param mixed $type plugin|theme.
154 * @param mixed $slug Plugin or Theme Slug.
155 * @param mixed $name Plugin or Theme Name.
156 * @param mixed $id Child Site ID.
157 *
158 * @return string success.
159 *
160 * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
161 * @uses \MainWP\Dashboard\MainWP_DB::update_website_values()
162 * @uses \MainWP\Dashboard\MainWP_System_Utility::can_edit_website()
163 * @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
164 */
165 public static function ignore_plugin_theme( $type, $slug, $name, $id ) {
166 if ( isset( $id ) && MainWP_Utility::ctype_digit( $id ) ) {
167 $website = MainWP_DB::instance()->get_website_by_id( $id );
168 if ( MainWP_System_Utility::can_edit_website( $website ) ) {
169 $slug = urldecode( $slug );
170 if ( 'plugin' === $type ) {
171 $decodedIgnoredPlugins = json_decode( $website->ignored_plugins, true );
172 if ( ! isset( $decodedIgnoredPlugins[ $slug ] ) ) {
173
174 /**
175 * Action: mainwp_before_plugin_ignore
176 *
177 * Fires before plugin ignore.
178 *
179 * @since 4.1
180 */
181 do_action( 'mainwp_before_plugin_ignore', $decodedIgnoredPlugins, $website );
182
183 $decodedIgnoredPlugins[ $slug ] = urldecode( $name );
184 MainWP_DB::instance()->update_website_values( $website->id, array( 'ignored_plugins' => wp_json_encode( $decodedIgnoredPlugins ) ) );
185
186 /**
187 * Action: mainwp_after_plugin_ignore
188 *
189 * Fires after plugin ignore.
190 *
191 * @since 4.1
192 */
193 do_action( 'mainwp_after_plugin_ignore', $decodedIgnoredPlugins, $website );
194
195 }
196 } elseif ( 'theme' === $type ) {
197 $decodedIgnoredThemes = json_decode( $website->ignored_themes, true );
198 if ( ! isset( $decodedIgnoredThemes[ $slug ] ) ) {
199 /**
200 * Action: mainwp_before_theme_ignore
201 *
202 * Fires before theme ignore.
203 *
204 * @since 4.1
205 */
206 do_action( 'mainwp_before_theme_ignore', $decodedIgnoredThemes, $website );
207
208 $decodedIgnoredThemes[ $slug ] = urldecode( $name );
209 MainWP_DB::instance()->update_website_values( $website->id, array( 'ignored_themes' => wp_json_encode( $decodedIgnoredThemes ) ) );
210
211 /**
212 * Action: mainwp_after_theme_ignore
213 *
214 * Fires after theme ignore.
215 *
216 * @since 4.1
217 */
218 do_action( 'mainwp_after_theme_ignore', $website, $decodedIgnoredThemes );
219 }
220 }
221 }
222 }
223
224 return 'success';
225 }
226
227 /**
228 * Remove a plugin or theme from the ignore list.
229 *
230 * @param mixed $type plugin|theme.
231 * @param mixed $slug Plugin or Theme slug.
232 * @param mixed $id Plugin or Theme name.
233 *
234 * @return string success.
235 *
236 * @uses \MainWP\Dashboard\MainWP_DB::query()
237 * @uses \MainWP\Dashboard\MainWP_DB::get_sql_websites_for_current_user()
238 * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
239 * @uses \MainWP\Dashboard\MainWP_DB::update_website_values()
240 * @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
241 * @uses \MainWP\Dashboard\MainWP_DB::free_result()
242 * @uses \MainWP\Dashboard\MainWP_System_Utility::can_edit_website()
243 * @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
244 */
245 public static function unignore_plugin_theme( $type, $slug, $id ) {
246 if ( ! empty( $id ) ) {
247
248 /**
249 * Action: mainwp_before_plugin_theme_unignore
250 *
251 * Fires after plugin/theme unignore.
252 *
253 * @since 4.1
254 */
255 do_action( 'mainwp_before_plugin_theme_unignore', $type, $slug, $id );
256
257 if ( '_ALL_' === $id ) {
258 $websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_for_current_user() );
259 while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
260 if ( 'plugin' === $type ) {
261
262 /**
263 * Action: mainwp_before_plugin_unignore
264 *
265 * Fires before plugin unignore.
266 *
267 * @since 4.1
268 */
269 do_action( 'mainwp_before_plugin_unignore', array(), $website );
270
271 MainWP_DB::instance()->update_website_values( $website->id, array( 'ignored_plugins' => wp_json_encode( array() ) ) );
272
273 /**
274 * Action: mainwp_after_plugin_unignore
275 *
276 * Fires after plugin unignore.
277 *
278 * @since 4.1
279 */
280 do_action( 'mainwp_after_plugin_unignore', array(), $website );
281
282 } elseif ( 'theme' === $type ) {
283 /**
284 * Action: mainwp_before_theme_unignore
285 *
286 * Fires before theme unignore.
287 *
288 * @since 4.1
289 */
290 do_action( 'mainwp_before_theme_unignore', array(), $website );
291 MainWP_DB::instance()->update_website_values( $website->id, array( 'ignored_themes' => wp_json_encode( array() ) ) );
292
293 /**
294 * Action: mainwp_after_theme_unignore
295 *
296 * Fires after theme unignore.
297 *
298 * @since 4.1
299 */
300 do_action( 'mainwp_after_theme_unignore', array(), $website );
301 }
302 }
303 MainWP_DB::free_result( $websites );
304 } elseif ( MainWP_Utility::ctype_digit( $id ) ) {
305 $website = MainWP_DB::instance()->get_website_by_id( $id );
306 if ( MainWP_System_Utility::can_edit_website( $website ) ) {
307 $slug = urldecode( $slug );
308 if ( 'plugin' === $type ) {
309 $decodedIgnoredPlugins = json_decode( $website->ignored_plugins, true );
310 if ( isset( $decodedIgnoredPlugins[ $slug ] ) ) {
311
312 /**
313 * Action: mainwp_before_plugin_unignore
314 *
315 * Fires before plugin unignore.
316 *
317 * @since 4.1
318 */
319 do_action( 'mainwp_before_plugin_unignore', $decodedIgnoredPlugins, $website );
320
321 unset( $decodedIgnoredPlugins[ $slug ] );
322 MainWP_DB::instance()->update_website_values( $website->id, array( 'ignored_plugins' => wp_json_encode( $decodedIgnoredPlugins ) ) );
323
324 /**
325 * Action: mainwp_after_plugin_unignore
326 *
327 * Fires after plugin unignore.
328 *
329 * @since 4.1
330 */
331 do_action( 'mainwp_after_plugin_unignore', $decodedIgnoredPlugins, $website );
332 }
333 } elseif ( 'theme' === $type ) {
334 $decodedIgnoredThemes = json_decode( $website->ignored_themes, true );
335 if ( isset( $decodedIgnoredThemes[ $slug ] ) ) {
336
337 /**
338 * Action: mainwp_before_theme_unignore
339 *
340 * Fires before theme unignore.
341 *
342 * @since 4.1
343 */
344 do_action( 'mainwp_before_theme_unignore', $decodedIgnoredThemes, $website );
345
346 unset( $decodedIgnoredThemes[ $slug ] );
347 MainWP_DB::instance()->update_website_values( $website->id, array( 'ignored_themes' => wp_json_encode( $decodedIgnoredThemes ) ) );
348
349 /**
350 * Action: mainwp_after_theme_unignore
351 *
352 * Fires after theme unignore.
353 *
354 * @since 4.1
355 */
356 do_action( 'mainwp_after_theme_unignore', $decodedIgnoredThemes, $website );
357 }
358 }
359 }
360 }
361 }
362
363 return 'success';
364 }
365
366 /**
367 * Method ignore_plugins_themes()
368 *
369 * Ignore Plugins or Themes.
370 *
371 * @param string $type Plugin or theme.
372 * @param string $slug Plugin or tempheme slug.
373 * @param string $name Plugin or theme name.
374 *
375 * @return string 'success'.
376 *
377 * @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension()
378 * @uses \MainWP\Dashboard\MainWP_DB_Common::update_user_extension()
379 */
380 public static function ignore_plugins_themes( $type, $slug, $name ) {
381 $slug = urldecode( $slug );
382 $userExtension = MainWP_DB_Common::instance()->get_user_extension();
383 if ( 'plugin' === $type ) {
384 $decodedIgnoredPlugins = json_decode( $userExtension->ignored_plugins, true );
385 if ( ! is_array( $decodedIgnoredPlugins ) ) {
386 $decodedIgnoredPlugins = array();
387 }
388 $decodedIgnoredPlugins[ $slug ] = urldecode( $name );
389 MainWP_DB_Common::instance()->update_user_extension(
390 array(
391 'userid' => null,
392 'ignored_plugins' => wp_json_encode( $decodedIgnoredPlugins ),
393 )
394 );
395 } elseif ( 'theme' === $type ) {
396 $decodedIgnoredThemes = json_decode( $userExtension->ignored_themes, true );
397 if ( ! is_array( $decodedIgnoredThemes ) ) {
398 $decodedIgnoredThemes = array();
399 }
400 $decodedIgnoredThemes[ $slug ] = urldecode( $name );
401 MainWP_DB_Common::instance()->update_user_extension(
402 array(
403 'userid' => null,
404 'ignored_themes' => wp_json_encode( $decodedIgnoredThemes ),
405 )
406 );
407 }
408
409 return 'success';
410 }
411
412 /**
413 * Unignore Plugins or Themes.
414 *
415 * @param mixed $type plugin|themes.
416 * @param mixed $slug Plugin or Themes slug.
417 *
418 * @return string success.
419 *
420 * @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension()
421 * @uses \MainWP\Dashboard\MainWP_DB_Common::update_user_extension()
422 */
423 public static function unignore_plugins_themes( $type, $slug ) {
424 $slug = urldecode( $slug );
425 $userExtension = MainWP_DB_Common::instance()->get_user_extension();
426 if ( 'plugin' === $type ) {
427 if ( '_ALL_' === $slug ) {
428 $decodedIgnoredPlugins = array();
429 } else {
430 $decodedIgnoredPlugins = json_decode( $userExtension->ignored_plugins, true );
431 if ( ! is_array( $decodedIgnoredPlugins ) ) {
432 $decodedIgnoredPlugins = array();
433 }
434 if ( isset( $decodedIgnoredPlugins[ $slug ] ) ) {
435 unset( $decodedIgnoredPlugins[ $slug ] );
436 }
437 }
438 MainWP_DB_Common::instance()->update_user_extension(
439 array(
440 'userid' => null,
441 'ignored_plugins' => wp_json_encode( $decodedIgnoredPlugins ),
442 )
443 );
444 } elseif ( 'theme' === $type ) {
445 if ( '_ALL_' === $slug ) {
446 $decodedIgnoredThemes = array();
447 } else {
448 $decodedIgnoredThemes = json_decode( $userExtension->ignored_plugins, true );
449 if ( ! is_array( $decodedIgnoredThemes ) ) {
450 $decodedIgnoredThemes = array();
451 }
452 if ( isset( $decodedIgnoredThemes[ $slug ] ) ) {
453 unset( $decodedIgnoredThemes[ $slug ] );
454 }
455 }
456 MainWP_DB_Common::instance()->update_user_extension(
457 array(
458 'userid' => null,
459 'ignored_themes' => wp_json_encode( $decodedIgnoredThemes ),
460 )
461 );
462 }
463
464 return 'success';
465 }
466
467
468 /**
469 * Unignor abandoned plugins or themes.
470 *
471 * @param mixed $type plugin|themes.
472 * @param mixed $slug Plugin or Themes slug.
473 * @param mixed $id Child Site ID.
474 *
475 * @return string success.
476 *
477 * @uses \MainWP\Dashboard\MainWP_DB::query()
478 * @uses \MainWP\Dashboard\MainWP_DB::get_sql_websites_for_current_user()
479 * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
480 * @uses \MainWP\Dashboard\MainWP_DB::get_website_option()
481 * @uses \MainWP\Dashboard\MainWP_DB::update_website_option()
482 * @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
483 * @uses \MainWP\Dashboard\MainWP_DB::free_result()
484 * @uses \MainWP\Dashboard\MainWP_System_Utility::can_edit_website()
485 * @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
486 */
487 public static function unignore_abandoned_plugin_theme( $type, $slug, $id ) {
488 if ( isset( $id ) ) {
489 if ( '_ALL_' === $id ) {
490 $websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_for_current_user() );
491 while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
492 if ( 'plugin' === $type ) {
493 MainWP_DB::instance()->update_website_option( $website, 'plugins_outdate_dismissed', wp_json_encode( array() ) );
494 } elseif ( 'theme' === $type ) {
495 MainWP_DB::instance()->update_website_option( $website, 'themes_outdate_dismissed', wp_json_encode( array() ) );
496 }
497 }
498 MainWP_DB::free_result( $websites );
499 } elseif ( MainWP_Utility::ctype_digit( $id ) ) {
500 $website = MainWP_DB::instance()->get_website_by_id( $id );
501 if ( MainWP_System_Utility::can_edit_website( $website ) ) {
502 $slug = urldecode( $slug );
503 if ( 'plugin' === $type ) {
504 $decodedIgnoredPlugins = MainWP_DB::instance()->get_website_option( $website, 'plugins_outdate_dismissed' );
505 $decodedIgnoredPlugins = ! empty( $decodedIgnoredPlugins ) ? json_decode( $decodedIgnoredPlugins, true ) : array();
506
507 if ( isset( $decodedIgnoredPlugins[ $slug ] ) ) {
508 unset( $decodedIgnoredPlugins[ $slug ] );
509 MainWP_DB::instance()->update_website_option( $website, 'plugins_outdate_dismissed', wp_json_encode( $decodedIgnoredPlugins ) );
510 }
511 } elseif ( 'theme' === $type ) {
512 $decodedIgnoredThemes = MainWP_DB::instance()->get_website_option( $website, 'themes_outdate_dismissed' );
513 $decodedIgnoredThemes = ! empty( $decodedIgnoredThemes ) ? json_decode( $decodedIgnoredThemes, true ) : array();
514
515 if ( isset( $decodedIgnoredThemes[ $slug ] ) ) {
516 unset( $decodedIgnoredThemes[ $slug ] );
517 MainWP_DB::instance()->update_website_option( $website, 'themes_outdate_dismissed', wp_json_encode( $decodedIgnoredThemes ) );
518 }
519 }
520 }
521 }
522 }
523
524 return 'success';
525 }
526
527
528 /**
529 * Unignore abandoned plugins or themes.
530 *
531 * @param mixed $type plugin|theme.
532 * @param mixed $slug Plugin or Themes slug.
533 *
534 * @return string success.
535 *
536 * @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension()
537 * @uses \MainWP\Dashboard\MainWP_DB_Common::update_user_extension()
538 */
539 public static function unignore_abandoned_plugins_themes( $type, $slug ) {
540 $slug = urldecode( $slug );
541 $userExtension = MainWP_DB_Common::instance()->get_user_extension();
542 if ( 'plugin' === $type ) {
543 if ( '_ALL_' === $slug ) {
544 $decodedIgnoredPlugins = array();
545 } else {
546 $decodedIgnoredPlugins = json_decode( $userExtension->dismissed_plugins, true );
547 if ( ! is_array( $decodedIgnoredPlugins ) ) {
548 $decodedIgnoredPlugins = array();
549 }
550 if ( isset( $decodedIgnoredPlugins[ $slug ] ) ) {
551 unset( $decodedIgnoredPlugins[ $slug ] );
552 }
553 }
554 MainWP_DB_Common::instance()->update_user_extension(
555 array(
556 'userid' => null,
557 'dismissed_plugins' => wp_json_encode( $decodedIgnoredPlugins ),
558 )
559 );
560 } elseif ( 'theme' === $type ) {
561 if ( '_ALL_' === $slug ) {
562 $decodedIgnoredThemes = array();
563 } else {
564 $decodedIgnoredThemes = json_decode( $userExtension->dismissed_themes, true );
565 if ( ! is_array( $decodedIgnoredThemes ) ) {
566 $decodedIgnoredThemes = array();
567 }
568 if ( isset( $decodedIgnoredThemes[ $slug ] ) ) {
569 unset( $decodedIgnoredThemes[ $slug ] );
570 }
571 }
572 MainWP_DB_Common::instance()->update_user_extension(
573 array(
574 'userid' => null,
575 'dismissed_themes' => wp_json_encode( $decodedIgnoredThemes ),
576 )
577 );
578 }
579
580 return 'success';
581 }
582
583 /**
584 * Dismis Plugin or Theme.
585 *
586 * @param mixed $type plugin|theme.
587 * @param mixed $slug Plugin or Theme slug.
588 * @param mixed $name Plugin or Theme name.
589 * @param mixed $id Child Site ID.
590 *
591 * @return string success.
592 *
593 * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
594 * @uses \MainWP\Dashboard\MainWP_DB::get_website_option()
595 * @uses \MainWP\Dashboard\MainWP_System_Utility::can_edit_website()
596 * @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
597 */
598 public static function dismiss_plugin_theme( $type, $slug, $name, $id ) {
599 if ( isset( $id ) && MainWP_Utility::ctype_digit( $id ) ) {
600 $website = MainWP_DB::instance()->get_website_by_id( $id );
601 if ( MainWP_System_Utility::can_edit_website( $website ) ) {
602 $slug = urldecode( $slug );
603 if ( 'plugin' === $type ) {
604 $decodedDismissedPlugins = MainWP_DB::instance()->get_website_option( $website, 'plugins_outdate_dismissed' );
605 $decodedDismissedPlugins = ! empty( $decodedDismissedPlugins ) ? json_decode( $decodedDismissedPlugins, true ) : array();
606
607 if ( ! isset( $decodedDismissedPlugins[ $slug ] ) ) {
608 $decodedDismissedPlugins[ $slug ] = urldecode( $name );
609 MainWP_DB::instance()->update_website_option( $website, 'plugins_outdate_dismissed', wp_json_encode( $decodedDismissedPlugins ) );
610 }
611 } elseif ( 'theme' === $type ) {
612 $decodedDismissedThemes = MainWP_DB::instance()->get_website_option( $website, 'themes_outdate_dismissed' );
613 $decodedDismissedThemes = ! empty( $decodedDismissedThemes ) ? json_decode( $decodedDismissedThemes, true ) : array();
614
615 if ( ! isset( $decodedDismissedThemes[ $slug ] ) ) {
616 $decodedDismissedThemes[ $slug ] = urldecode( $name );
617 MainWP_DB::instance()->update_website_option( $website, 'themes_outdate_dismissed', wp_json_encode( $decodedDismissedThemes ) );
618 }
619 }
620 }
621 }
622
623 return 'success';
624 }
625
626 /**
627 * Dismiss plugins or themes.
628 *
629 * @param mixed $type plugin|theme.
630 * @param mixed $slug Plugin or Theme slug.
631 * @param mixed $name Plugin or Theme name.
632 *
633 * @return string success.
634 *
635 * @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension()
636 * @uses \MainWP\Dashboard\MainWP_DB_Common::update_user_extension()
637 */
638 public static function dismiss_plugins_themes( $type, $slug, $name ) {
639 $slug = urldecode( $slug );
640 $userExtension = MainWP_DB_Common::instance()->get_user_extension();
641 if ( 'plugin' === $type ) {
642 $decodedDismissedPlugins = json_decode( $userExtension->dismissed_plugins, true );
643 if ( ! is_array( $decodedDismissedPlugins ) ) {
644 $decodedDismissedPlugins = array();
645 }
646 $decodedDismissedPlugins[ $slug ] = urldecode( $name );
647 MainWP_DB_Common::instance()->update_user_extension(
648 array(
649 'userid' => null,
650 'dismissed_plugins' => wp_json_encode( $decodedDismissedPlugins ),
651 )
652 );
653 } elseif ( 'theme' === $type ) {
654 $decodedDismissedThemes = json_decode( $userExtension->dismissed_themes, true );
655 if ( ! is_array( $decodedDismissedThemes ) ) {
656 $decodedDismissedThemes = array();
657 }
658 $decodedDismissedThemes[ $slug ] = urldecode( $name );
659 MainWP_DB_Common::instance()->update_user_extension(
660 array(
661 'userid' => null,
662 'dismissed_themes' => wp_json_encode( $decodedDismissedThemes ),
663 )
664 );
665 }
666
667 return 'success';
668 }
669
670 /**
671 * Method upgrade_plugin_theme_translation()
672 *
673 * Upgrade plugin or theme translations.
674 *
675 * @param int $id Child site ID.
676 * @param string $type Plugin or theme.
677 * @param array $list_items List of theme or plugin names seperated by comma.
678 *
679 * @return array
680 * @throws MainWP_Exception Error messages.
681 *
682 * @uses \MainWP\Dashboard\MainWP_Connect::fetch_url_authed()
683 * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
684 * @uses \MainWP\Dashboard\MainWP_Exception
685 * @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
686 */
687 public static function upgrade_plugin_theme_translation( $id, $type, $list_items ) { // phpcs:ignore -- complex method.
688 if ( isset( $id ) && MainWP_Utility::ctype_digit( $id ) ) {
689 $website = MainWP_DB::instance()->get_website_by_id( $id, false, array( 'premium_upgrades' ) ); // to fix loading premium_upgrades.
690 if ( MainWP_System_Utility::is_suspended_site( $website ) ) {
691 throw new MainWP_Exception( 'ERROR', esc_html__( 'Suspended site.', 'mainwp' ), 'SUSPENDED_SITE' );
692 }
693 $result = self::update_plugin_theme_translation( $website, $type, $list_items );
694 if ( is_array( $result ) ) {
695
696 $return_results = array();
697
698 // logging feature.
699 $_type = '';
700 if ( 'plugin' === $type || 'theme' === $type ) {
701 $_type = $type;
702 } elseif ( 'translation' === $type ) {
703 $_type = 'trans';
704 }
705
706 if ( ! empty( $_type ) && isset( $result['other_data'] ) ) { // ok.
707 $output_array = $result['other_data']; // updated_data: plugins,themes,trans.
708 mainwp_get_actions_handler_instance()->do_action_mainwp_install_actions( $website, 'updated', $output_array, $_type );
709 }
710
711 $undefined = true;
712
713 if ( isset( $result['upgrades_error'] ) ) {
714 foreach ( $result['upgrades_error'] as $k => $v ) {
715 $return_results['result_error'][ rawurlencode( $k ) ] = esc_html( $v );
716 }
717 }
718
719 if ( isset( $result['upgrades'] ) ) {
720 if ( isset( $result['upgrades'] ) ) {
721 foreach ( $result['upgrades'] as $k => $v ) {
722 $return_results['result'][ rawurlencode( $k ) ] = $v;
723 }
724 }
725
726 if ( 'plugin' === $type ) {
727 if ( ! empty( $website->plugin_upgrades ) ) {
728 $plugin_upgrades = json_decode( $website->plugin_upgrades, true );
729 if ( is_array( $plugin_upgrades ) ) {
730 $updated = false;
731 foreach ( $return_results['result'] as $k => $v ) {
732 $k = rawurldecode( $k );
733 if ( isset( $plugin_upgrades[ $k ] ) ) {
734 unset( $plugin_upgrades[ $k ] ); // updated.
735 $updated = true;
736 }
737 }
738 if ( $updated ) {
739 MainWP_DB::instance()->update_website_values( $id, array( 'plugin_upgrades' => wp_json_encode( $plugin_upgrades ) ) );
740 }
741 }
742 }
743
744 if ( isset( $return_results['result'] ) && is_array( $return_results['result'] ) && ! empty( $return_results['result'] ) ) {
745 $decodedPremiumUpgrades = MainWP_DB::instance()->get_website_option( $website, 'premium_upgrades' );
746 $decodedPremiumUpgrades = ! empty( $decodedPremiumUpgrades ) ? json_decode( $decodedPremiumUpgrades, true ) : array();
747 if ( is_array( $decodedPremiumUpgrades ) && ! empty( $decodedPremiumUpgrades ) ) {
748 $updated = false;
749 foreach ( $return_results['result'] as $k => $v ) {
750 $k = rawurldecode( $k );
751 if ( isset( $decodedPremiumUpgrades[ $k ] ) ) {
752 unset( $decodedPremiumUpgrades[ $k ] ); // updated.
753 $updated = true;
754 }
755 }
756 if ( $updated ) {
757 MainWP_DB::instance()->update_website_option( $website, 'premium_upgrades', wp_json_encode( $decodedPremiumUpgrades ) );
758 }
759 }
760 }
761 }
762 return $return_results;
763 } elseif ( isset( $result['error'] ) ) {
764 throw new MainWP_Exception( 'WPERROR', esc_html( $result['error'] ) );
765 } elseif ( isset( $result['notices'] ) ) {
766 $noti = $result['notices'];
767 if ( ! empty( $noti ) && is_string( $noti ) ) {
768 throw new MainWP_Exception( $noti, '', 'MAINWP_NOTICE' ); //phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped
769 }
770 }
771
772 if ( $undefined ) {
773 throw new MainWP_Exception( 'ERROR', esc_html__( 'Invalid response retured from the child site. Please try again.', 'mainwp' ) );
774 }
775 }
776 }
777 throw new MainWP_Exception( 'ERROR', esc_html__( 'Site ID not found. Please reload the page and try again.', 'mainwp' ) );
778 }
779
780 /**
781 * Method update_plugin_theme_translation()
782 *
783 * Upgrade plugin or theme translations.
784 *
785 * @param int $website Child site object.
786 * @param string $type Plugin or theme.
787 * @param array $list_items List of theme or plugin names seperated by comma.
788 *
789 * @return array|false update result or false.
790 * @throws \Exception Error message.
791 *
792 * @uses \MainWP\Dashboard\MainWP_System_Utility
793 * @uses \MainWP\Dashboard\MainWP_System_Utility::can_edit_website()
794 */
795 public static function update_plugin_theme_translation( $website, $type, $list_items ) {
796 if ( MainWP_System_Utility::can_edit_website( $website ) ) {
797 /**
798 * Action: mainwp_before_plugin_theme_translation_update
799 *
800 * Fires before plugin/theme/translation update actions.
801 *
802 * @since 4.1
803 */
804 do_action( 'mainwp_before_plugin_theme_translation_update', $type, $list_items, $website );
805
806 $information = MainWP_Connect::fetch_url_authed(
807 $website,
808 ( 'translation' === $type ? 'upgradetranslation' : 'upgradeplugintheme' ),
809 array(
810 'type' => $type,
811 'list' => urldecode( $list_items ),
812 ),
813 true
814 );
815 /**
816 * Action: mainwp_after_plugin_theme_translation_update
817 *
818 * Fires before plugin/theme/translation update actions.
819 *
820 * @since 4.1
821 */
822 do_action( 'mainwp_after_plugin_theme_translation_update', $information, $type, $list_items, $website );
823
824 return $information;
825 }
826 return false;
827 }
828
829 /**
830 * Get plugin or theme slugs.
831 *
832 * @param int $id Child Site ID.
833 * @param string $type plugin|theme.
834 *
835 * @return array List of plugins or themes.
836 *
837 * @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension()
838 * @uses \MainWP\Dashboard\MainWP_DB::query()
839 * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
840 * @uses \MainWP\Dashboard\MainWP_DB::get_website_option()
841 * @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
842 */
843 public static function get_plugin_theme_slugs( $id, $type ) { // phpcs:ignore -- complex method. Current complexity is the only way to achieve desired results, pull request solutions appreciated.
844
845 $userExtension = MainWP_DB_Common::instance()->get_user_extension();
846 $sql = MainWP_DB::instance()->get_sql_website_by_id( $id );
847 $websites = MainWP_DB::instance()->query( $sql );
848 $website = MainWP_DB::fetch_object( $websites );
849
850 $slugs = array();
851 if ( 'plugin' === $type ) {
852 if ( $website->is_ignorePluginUpdates ) {
853 return '';
854 }
855
856 $plugin_upgrades = json_decode( $website->plugin_upgrades, true );
857 $decodedPremiumUpgrades = MainWP_DB::instance()->get_website_option( $website, 'premium_upgrades' );
858 $decodedPremiumUpgrades = ! empty( $decodedPremiumUpgrades ) ? json_decode( $decodedPremiumUpgrades, true ) : array();
859
860 if ( is_array( $decodedPremiumUpgrades ) ) {
861 foreach ( $decodedPremiumUpgrades as $crrSlug => $premiumUpgrade ) {
862 $premiumUpgrade['premium'] = true;
863
864 if ( 'plugin' === $premiumUpgrade['type'] ) {
865 if ( ! is_array( $plugin_upgrades ) ) {
866 $plugin_upgrades = array();
867 }
868 $premiumUpgrade = array_filter( $premiumUpgrade );
869 $plugin_upgrades[ $crrSlug ] = array_merge( $plugin_upgrades[ $crrSlug ], $premiumUpgrade );
870 }
871 }
872 }
873
874 $ignored_plugins = json_decode( $website->ignored_plugins, true );
875 if ( is_array( $ignored_plugins ) ) {
876 $plugin_upgrades = array_diff_key( $plugin_upgrades, $ignored_plugins );
877 }
878
879 $ignored_plugins = json_decode( $userExtension->ignored_plugins, true );
880 if ( is_array( $ignored_plugins ) ) {
881 $plugin_upgrades = array_diff_key( $plugin_upgrades, $ignored_plugins );
882 }
883
884 if ( is_array( $plugin_upgrades ) ) {
885 foreach ( $plugin_upgrades as $slug => $plugin_upgrade ) {
886 $slugs[] = rawurlencode( $slug );
887 }
888 }
889 } elseif ( 'theme' === $type ) {
890
891 if ( $website->is_ignoreThemeUpdates ) {
892 return '';
893 }
894
895 $theme_upgrades = json_decode( $website->theme_upgrades, true );
896 $decodedPremiumUpgrades = MainWP_DB::instance()->get_website_option( $website, 'premium_upgrades' );
897 $decodedPremiumUpgrades = ! empty( $decodedPremiumUpgrades ) ? json_decode( $decodedPremiumUpgrades, true ) : array();
898
899 if ( is_array( $decodedPremiumUpgrades ) ) {
900 foreach ( $decodedPremiumUpgrades as $crrSlug => $premiumUpgrade ) {
901 $premiumUpgrade['premium'] = true;
902
903 if ( 'theme' === $premiumUpgrade['type'] ) {
904 if ( ! is_array( $theme_upgrades ) ) {
905 $theme_upgrades = array();
906 }
907 $theme_upgrades[ $crrSlug ] = $premiumUpgrade;
908 }
909 }
910 }
911
912 $ignored_themes = json_decode( $website->ignored_themes, true );
913 if ( is_array( $ignored_themes ) ) {
914 $theme_upgrades = array_diff_key( $theme_upgrades, $ignored_themes );
915 }
916
917 $ignored_themes = json_decode( $userExtension->ignored_themes, true );
918 if ( is_array( $ignored_themes ) ) {
919 $theme_upgrades = array_diff_key( $theme_upgrades, $ignored_themes );
920 }
921
922 if ( is_array( $theme_upgrades ) ) {
923 foreach ( $theme_upgrades as $slug => $theme_upgrade ) {
924 $slugs[] = $slug;
925 }
926 }
927 } elseif ( 'translation' === $type ) {
928 $translation_upgrades = json_decode( $website->translation_upgrades, true );
929 if ( is_array( $translation_upgrades ) ) {
930 foreach ( $translation_upgrades as $translation_upgrade ) {
931 $slugs[] = $translation_upgrade['slug'];
932 }
933 }
934 }
935
936 return implode( ',', $slugs );
937 }
938 }
939