PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 6.1.1
MainWP Dashboard: Self-hosted WordPress Management for Agencies v6.1.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 5.2.2 5.3 All 153 releases
mainwp / class / class-mainwp-wp-cli-command.php

class-mainwp-wp-cli-command.php in MainWP Dashboard: Self-hosted WordPress Management for Agencies 6.1.1, at class/class-mainwp-wp-cli-command.php

869 lines 40.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * MainWP-CLI
4 *
5 * This file extends the WP-CLI and provides a set of SubCommands to Control your
6 * Child Sites that are added to the MainWP Dashboard.
7 *
8 * @devtodo: allow to add or remove child sites
9 * @package MainWP/Dashboard
10 */
11
12 namespace MainWP\Dashboard;
13
14 // Exit if accessed directly.
15 if ( ! defined( 'ABSPATH' ) ) {
16 exit;
17 }
18
19 // Exit if access directly.
20 if ( ! defined( 'WP_CLI' ) ) {
21 return; // NOSONAR - jump to avoid CLI.
22 }
23
24 /**
25 * Class MainWP_WP_CLI_Command
26 *
27 * Manage all child sites added to the MainWP Dashboard.
28 *
29 * @package MainWP\Dashboard
30 */
31 class MainWP_WP_CLI_Command extends \WP_CLI_Command { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
32
33 /**
34 * Method init()
35 *
36 * Initiate the MainWP CLI after all Plugins have loaded.
37 */
38 public static function init() {
39 add_action( 'plugins_loaded', array( static::class, 'init_wpcli_commands' ), 99999 );
40 }
41
42 /**
43 * Method init_wpcli_commands
44 *
45 * Adds the MainWP WP CLI Commands via WP_CLI::add_command
46 */
47 public static function init_wpcli_commands() {
48 \WP_CLI::add_command( 'mainwp', static::class );
49 }
50
51 /**
52 * List information about added child sites.
53 *
54 * ## OPTIONS
55 *
56 * [--list]
57 * : Get a list of all child sites
58 *
59 * [--count]
60 * : If set, count child sites.
61 *
62 *
63 * ## EXAMPLES
64 *
65 * wp mainwp sites --list
66 * wp mainwp sites --all-sites-count
67 *
68 * ## Synopsis [--list] [--all-sites-count]
69 *
70 * @param array $args Function arguments.
71 * @param array $assoc_args Function associate arguments.
72 *
73 * @uses \MainWP\Dashboard\MainWP_DB::query()
74 * @uses \MainWP\Dashboard\MainWP_DB::get_sql_websites_for_current_user()
75 * @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
76 * @uses \MainWP\Dashboard\MainWP_DB::free_result()
77 * @uses \MainWP\Dashboard\MainWP_DB::data_seek()
78 */
79 public function sites( $args, $assoc_args ) {
80
81 // support new mainwp sites cli commands.
82 $handle = MainWP_WP_CLI_Handle::get_assoc_args_commands( 'sites', $assoc_args );
83 if ( ! empty( $handle ) ) {
84 MainWP_WP_CLI_Handle::handle_cli_callback( 'sites', $args, $assoc_args );
85 return;
86 }
87
88 $websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_for_current_user( false, null, 'wp.url', false, false, null, true ) );
89
90 $idLength = strlen( 'id' );
91 $nameLength = strlen( 'name' );
92 $urlLength = strlen( 'url' );
93 $versionLength = strlen( 'version' );
94 while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
95 if ( $idLength < strlen( $website->id ) ) {
96 $idLength = strlen( $website->id );
97 }
98 if ( $nameLength < strlen( $website->name ) ) {
99 $nameLength = strlen( $website->name );
100 }
101 if ( $urlLength < strlen( $website->url ) ) {
102 $urlLength = strlen( $website->url );
103 }
104 if ( $versionLength < strlen( $website->version ) ) {
105 $versionLength = strlen( $website->version );
106 }
107 }
108 MainWP_DB::data_seek( $websites, 0 );
109
110 \WP_CLI::line( sprintf( "+%'--" . ( $idLength + 2 ) . "s+%'--" . ( $nameLength + 2 ) . "s+%'--" . ( $urlLength + 2 ) . "s+%'--" . ( $versionLength + 2 ) . 's+', '', '', '', '' ) );
111 \WP_CLI::line( sprintf( '| %-' . $idLength . 's | %-' . $nameLength . 's | %-' . $urlLength . 's | %-' . $versionLength . 's |', 'id', 'name', 'url', 'version' ) );
112 \WP_CLI::line( sprintf( "+%'--" . ( $idLength + 2 ) . "s+%'--" . ( $nameLength + 2 ) . "s+%'--" . ( $urlLength + 2 ) . "s+%'--" . ( $versionLength + 2 ) . 's+', '', '', '', '' ) );
113
114 while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
115 \WP_CLI::line( sprintf( '| %-' . $idLength . 's | %-' . $nameLength . 's | %-' . $urlLength . 's | %-' . $versionLength . 's |', $website->id, $website->name, $website->url, $website->version ) );
116 }
117
118 \WP_CLI::line( sprintf( "+%'--" . ( $idLength + 2 ) . "s+%'--" . ( $nameLength + 2 ) . "s+%'--" . ( $urlLength + 2 ) . "s+%'--" . ( $versionLength + 2 ) . 's+', '', '', '', '' ) );
119 MainWP_DB::free_result( $websites );
120 }
121
122 /**
123 * Site commands.
124 *
125 * ## OPTIONS
126 *
127 * [--site]
128 * : Get site data
129 *
130 * [--site-info]
131 * : If set, get site info.
132 *
133 *
134 * ## EXAMPLES
135 *
136 * wp mainwp site --site [<websiteid>]
137 * wp mainwp site --site-info [<websiteid>]
138 *
139 * ## Synopsis [--site] [--site-info] [...]
140 *
141 * @param array $args Function arguments.
142 * @param array $assoc_args Function associate arguments.
143 */
144 public function site( $args, $assoc_args ) {
145 MainWP_WP_CLI_Handle::handle_cli_callback( 'site', $args, $assoc_args );
146 }
147
148
149 /**
150 * Updates commands.
151 *
152 * ## OPTIONS
153 *
154 * [--available-updates <websiteid>]
155 * : Get available updates
156 *
157 * [--ignored-plugins-updates <websiteid>]
158 * : If set, get ignored plugins updates.
159 *
160 * [--site-ignored-plugins-updates <websiteid>]
161 * : If set, get ignored plugins updates of site.
162 *
163 * [--ignored-themes-updates <websiteid>]
164 * : If set, get ignored themes updates.
165 *
166 * [--site-ignored-themes-updates <websiteid>]
167 * : If set, get ignored themes updates of site.
168 *
169 * [--ignore-updates --type=[type] --slug=[slug]]
170 * : If set, ignored updates.
171 *
172 * [--ignore-update <websiteid> --type=[type] --slug=[slug]]
173 * : If set, ignored update.
174 *
175 * [--unignore-updates --type=[type] --slug=[slug]]
176 * : If set, unignore updates.
177 *
178 * [--unignore-update <websiteid> --type=[type] --slug=[slug]]
179 * : If set, unignore update.
180 *
181 *
182 * ## EXAMPLES
183 *
184 * wp mainwp updates --available-updates
185 * wp mainwp updates --ignored-plugins-updates
186 * wp mainwp updates --site-ignored-plugins-updates 3
187 *
188 * ## Synopsis [--available-updates] [--ignored-plugins-updates] [--site-ignored-plugins-updates] [...]
189 *
190 * @param array $args Function arguments.
191 * @param array $assoc_args Function associate arguments.
192 */
193 public function updates( $args, $assoc_args ) {
194 MainWP_WP_CLI_Handle::handle_cli_callback( 'updates', $args, $assoc_args );
195 }
196
197 /**
198 * Sync Data with Child Sites
199 *
200 * ## OPTIONS
201 *
202 * [<websiteid>]
203 * : The id (or ids, comma separated) of the child sites that need to be synced.
204 *
205 * [--all]
206 * : If set, all child sites will be synced.
207 *
208 * ## EXAMPLES
209 *
210 * wp mainwp sync 2,5
211 * wp mainwp sync --all
212 *
213 * ## Synopsis [<websiteid>] [--all]
214 *
215 * @param array $args Function arguments.
216 * @param array $assoc_args Function associate arguments.
217 *
218 * @uses \MainWP\Dashboard\MainWP_Error_Helper::get_console_error_message()
219 * @uses \MainWP\Dashboard\MainWP_DB::query()
220 * @uses \MainWP\Dashboard\MainWP_DB::get_sql_websites_for_current_user()
221 * @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
222 * @uses \MainWP\Dashboard\MainWP_DB::free_result()
223 * @uses \MainWP\Dashboard\MainWP_Sync::sync_site()
224 */
225 public function sync( $args, $assoc_args ) {
226 $sites = array();
227 if ( ! empty( $args ) ) {
228 $args_exploded = explode( ',', $args[0] );
229 foreach ( $args_exploded as $arg ) {
230 if ( ! is_numeric( trim( $arg ) ) ) {
231 \WP_CLI::error( 'Child site ids should be numeric.' );
232 }
233
234 $sites[] = trim( $arg );
235 }
236 }
237
238 if ( is_array( $assoc_args ) && isset( $assoc_args['all'] ) ) {
239 update_option( 'mainwp_last_synced_all_sites', time() );
240 }
241
242 if ( empty( $sites ) && ( ! isset( $assoc_args['all'] ) ) ) {
243 \WP_CLI::error( 'Please specify one or more child sites, or use --all.' );
244 }
245 MainWP_WP_CLI_Handle::handle_sync_sites( $args, $assoc_args );
246 }
247
248 /**
249 * Reconnect with Child Sites
250 *
251 * ## OPTIONS
252 *
253 * [<websiteid>]
254 * : The id (or ids, comma separated) of the child sites that need to be reconnect.
255 *
256 * ## EXAMPLES
257 *
258 * wp mainwp reconnect 2,5
259 *
260 * ## Synopsis [<websiteid>]
261 *
262 * @param array $args Function arguments.
263 * @param array $assoc_args Function associate arguments.
264 *
265 * @uses \MainWP\Dashboard\MainWP_Error_Helper::get_console_error_message()
266 * @uses \MainWP\Dashboard\MainWP_DB::query()
267 * @uses \MainWP\Dashboard\MainWP_DB::get_sql_websites_for_current_user()
268 * @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
269 * @uses \MainWP\Dashboard\MainWP_DB::free_result()
270 * @uses \MainWP\Dashboard\MainWP_Manage_Sites_View::m_reconnect_site()
271 */
272 public function reconnect( $args, $assoc_args ) { //phpcs:ignore -- NOSONAR - complex.
273 $sites = array();
274 if ( ! empty( $args ) ) {
275 $args_exploded = explode( ',', $args[0] );
276 foreach ( $args_exploded as $arg ) {
277 if ( ! is_numeric( trim( $arg ) ) ) {
278 \WP_CLI::error( 'Child site ids should be numeric.' );
279 }
280
281 $sites[] = trim( $arg );
282 }
283 }
284
285 if ( empty( $sites ) ) {
286 \WP_CLI::error( 'Please specify one or more child sites.' );
287 }
288
289 $websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_for_current_user( false, null, 'wp.url', false, false, null, true ) );
290 \WP_CLI::line( 'Reconnect started' );
291 $warnings = 0;
292 $errors = 0;
293 while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
294 if ( ( ! empty( $sites ) ) && ( ! in_array( $website->id, $sites, true ) ) ) {
295 continue;
296 }
297 \WP_CLI::line( ' -> ' . $website->name . ' (' . $website->url . ')' );
298 try {
299 if ( MainWP_Manage_Sites_View::m_reconnect_site( $website ) ) {
300 \WP_CLI::success( ' Reconnected successfully' );
301 } else {
302 \WP_CLI::warning( ' Reconnect failed' );
303 ++$warnings;
304 }
305 } catch ( \Exception $e ) {
306 \WP_CLI::error( ' Reconnect failed: ' . MainWP_Error_Helper::get_console_error_message( $e ) );
307 ++$errors;
308 }
309 }
310 MainWP_DB::free_result( $websites );
311 if ( 0 < $errors ) {
312 \WP_CLI::error( 'Reconnect completed with errors' );
313 } elseif ( 0 < $warnings ) {
314 \WP_CLI::warning( 'Reconnect completed with warnings' );
315 } else {
316 \WP_CLI::success( 'Reconnect completed' );
317 }
318 }
319
320
321 /**
322 * List information about plugin updates
323 *
324 * ## OPTIONS
325 *
326 * [<websiteid>]
327 * : The id (or ids, comma separated) of the child sites that need to be listed/upgraded, when omitted all childsites are used.
328 *
329 * [--list]
330 * : Get a list of plugins with available updates
331 *
332 * [--list-all]
333 * : List all plugins
334 *
335 * [--upgrade=<pluginslug>]
336 * : Update the plugin slugs
337 *
338 * [--upgrade-all]
339 * : Update all plugins
340 *
341 * ## EXAMPLES
342 *
343 * wp mainwp plugin 2,5 --list
344 * wp mainwp plugin --list
345 * wp mainwp plugin 2,5 --list-all
346 * wp mainwp plugin 2,5 --upgrade-all
347 * wp mainwp plugin 2,5 --upgrade=mainwpchild
348 *
349 * ## Synopsis [<websiteid>] [--list] [--list-all] [--upgrade=<pluginslug>] [--upgrade-all]
350 *
351 * @param array $args Function arguments.
352 * @param array $assoc_args Function associate arguments.
353 *
354 * @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension()
355 * @uses \MainWP\Dashboard\MainWP_Error_Helper::get_console_error_message()
356 * @uses \MainWP\Dashboard\MainWP_DB::query()
357 * @uses \MainWP\Dashboard\MainWP_DB::get_sql_websites_for_current_user()
358 * @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
359 * @uses \MainWP\Dashboard\MainWP_Updates_Handler::upgrade_plugin_theme_translation()
360 * @uses \MainWP\Dashboard\MainWP_Utility::value_to_string()
361 */
362 public function plugin( $args, $assoc_args ) { // phpcs:ignore -- NOSONAR -Current complexity is the only way to achieve desired results, pull request solutions appreciated.
363 $sites = array();
364 if ( ! empty( $args ) ) {
365 $args_exploded = explode( ',', $args[0] );
366 foreach ( $args_exploded as $arg ) {
367 if ( ! is_numeric( trim( $arg ) ) ) {
368 \WP_CLI::error( 'Child site IDs should be numeric.' );
369 }
370
371 $sites[] = trim( $arg );
372 }
373 }
374
375 if ( isset( $assoc_args['list'] ) ) {
376 $websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_for_current_user( false, null, 'wp.url', false, false, null, true ) );
377 $userExtension = MainWP_DB_Common::instance()->get_user_extension();
378 $websites_to_upgrade = array();
379 while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
380 if ( ! empty( $sites ) && ( ! in_array( $website->id, $sites, true ) ) ) {
381 continue;
382 }
383
384 $plugin_upgrades = json_decode( $website->plugin_upgrades, true );
385
386 if ( is_array( $plugin_upgrades ) ) {
387 $ignored_plugins = json_decode( $website->ignored_plugins, true );
388 if ( is_array( $ignored_plugins ) ) {
389 $plugin_upgrades = MainWP_Common_Functions::instance()->get_not_ignored_updates_themesplugins( $plugin_upgrades, $ignored_plugins );
390
391 }
392
393 $ignored_plugins = json_decode( $userExtension->ignored_plugins, true );
394 if ( is_array( $ignored_plugins ) ) {
395 $plugin_upgrades = MainWP_Common_Functions::instance()->get_not_ignored_updates_themesplugins( $plugin_upgrades, $ignored_plugins );
396
397 }
398
399 $tmp = array();
400 foreach ( $plugin_upgrades as $plugin_upgrade ) {
401 $tmp[] = array(
402 'name' => $plugin_upgrade['update']['slug'],
403 'version' => $plugin_upgrade['Version'],
404 'new_version' => $plugin_upgrade['update']['new_version'],
405 );
406 }
407 $websites_to_upgrade[] = array(
408 'id' => $website->id,
409 'name' => $website->name,
410 'plugins' => $tmp,
411 );
412 }
413 }
414
415 $idLength = strlen( 'id' );
416 $nameLength = strlen( 'name' );
417 $pluginLength = strlen( 'plugin' );
418 $oldVersionLength = strlen( 'version' );
419 $newVersionLength = strlen( 'new version' );
420 foreach ( $websites_to_upgrade as $website_to_upgrade ) {
421 if ( $idLength < strlen( $website_to_upgrade['id'] ) ) {
422 $idLength = strlen( $website_to_upgrade['id'] );
423 }
424 if ( $nameLength < strlen( $website_to_upgrade['name'] ) ) {
425 $nameLength = strlen( $website_to_upgrade['name'] );
426 }
427
428 foreach ( $website_to_upgrade['plugins'] as $plugin_to_upgrade ) {
429 if ( $pluginLength < strlen( $plugin_to_upgrade['name'] ) ) {
430 $pluginLength = strlen( $plugin_to_upgrade['name'] );
431 }
432 if ( $oldVersionLength < strlen( $plugin_to_upgrade['version'] ) ) {
433 $oldVersionLength = strlen( $plugin_to_upgrade['version'] );
434 }
435 if ( $newVersionLength < strlen( $plugin_to_upgrade['new_version'] ) ) {
436 $newVersionLength = strlen( $plugin_to_upgrade['new_version'] );
437 }
438 }
439 }
440
441 \WP_CLI::line( sprintf( "+%'--" . ( $idLength + 2 ) . "s+%'--" . ( $nameLength + 2 ) . "s+%'--" . ( $pluginLength + 2 ) . "s+%'--" . ( $oldVersionLength + 2 ) . "s+%'--" . ( $newVersionLength + 2 ) . 's+', '', '', '', '', '' ) );
442 \WP_CLI::line( sprintf( '| %-' . $idLength . 's | %-' . $nameLength . 's | %-' . $pluginLength . 's | %-' . $oldVersionLength . 's | %-' . $newVersionLength . 's |', 'id', 'name', 'plugin', 'version', 'new version' ) );
443 \WP_CLI::line( sprintf( "+%'--" . ( $idLength + 2 ) . "s+%'--" . ( $nameLength + 2 ) . "s+%'--" . ( $pluginLength + 2 ) . "s+%'--" . ( $oldVersionLength + 2 ) . "s+%'--" . ( $newVersionLength + 2 ) . 's+', '', '', '', '', '' ) );
444
445 foreach ( $websites_to_upgrade as $website_to_upgrade ) {
446 if ( $idLength < strlen( $website_to_upgrade['id'] ) ) {
447 $idLength = strlen( $website_to_upgrade['id'] );
448 }
449 if ( $nameLength < strlen( $website_to_upgrade['name'] ) ) {
450 $nameLength = strlen( $website_to_upgrade['name'] );
451 }
452
453 $i = 0;
454 foreach ( $website_to_upgrade['plugins'] as $plugin_to_upgrade ) {
455 if ( 0 === $i ) {
456 \WP_CLI::line( sprintf( '| %-' . $idLength . 's | %-' . $nameLength . 's | %-' . $pluginLength . 's | %-' . $oldVersionLength . 's | %-' . $newVersionLength . 's |', $website_to_upgrade['id'], $website_to_upgrade['name'], $plugin_to_upgrade['name'], $plugin_to_upgrade['version'], $plugin_to_upgrade['new_version'] ) );
457 } else {
458 \WP_CLI::line( sprintf( '| %-' . $idLength . 's | %-' . $nameLength . 's | %-' . $pluginLength . 's | %-' . $oldVersionLength . 's | %-' . $newVersionLength . 's |', '', '', $plugin_to_upgrade['name'], $plugin_to_upgrade['version'], $plugin_to_upgrade['new_version'] ) );
459 }
460 ++$i;
461 }
462 }
463
464 \WP_CLI::line( sprintf( "+%'--" . ( $idLength + 2 ) . "s+%'--" . ( $nameLength + 2 ) . "s+%'--" . ( $pluginLength + 2 ) . "s+%'--" . ( $oldVersionLength + 2 ) . "s+%'--" . ( $newVersionLength + 2 ) . 's+', '', '', '', '', '' ) );
465 } elseif ( isset( $assoc_args['list-all'] ) ) {
466 $websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_for_current_user( false, null, 'wp.url', false, false, null, true ) );
467 $userExtension = MainWP_DB_Common::instance()->get_user_extension();
468 $websites_to_list = array();
469 while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
470 if ( ( ! empty( $sites ) ) && ( ! in_array( $website->id, $sites, true ) ) ) {
471 continue;
472 }
473
474 $plugins_to_list = json_decode( $website->plugins, true );
475 if ( is_array( $plugins_to_list ) ) {
476 $tmp = array();
477 foreach ( $plugins_to_list as $plugin ) {
478 $tmp[] = array(
479 'name' => $plugin['slug'],
480 'version' => $plugin['version'],
481 );
482 }
483 $websites_to_list[] = array(
484 'id' => $website->id,
485 'name' => $website->name,
486 'plugins' => $tmp,
487 );
488 }
489 }
490
491 $idLength = strlen( 'id' );
492 $nameLength = strlen( 'name' );
493 $pluginLength = strlen( 'plugin' );
494 $oldVersionLength = strlen( 'version' );
495 foreach ( $websites_to_list as $website_item ) {
496 if ( $idLength < strlen( $website_item['id'] ) ) {
497 $idLength = strlen( $website_item['id'] );
498 }
499 if ( $nameLength < strlen( $website_item['name'] ) ) {
500 $nameLength = strlen( $website_item['name'] );
501 }
502
503 foreach ( $website_item['plugins'] as $plugin_item ) {
504 if ( $pluginLength < strlen( $plugin_item['name'] ) ) {
505 $pluginLength = strlen( $plugin_item['name'] );
506 }
507 if ( $oldVersionLength < strlen( $plugin_item['version'] ) ) {
508 $oldVersionLength = strlen( $plugin_item['version'] );
509 }
510 }
511 }
512
513 \WP_CLI::line( sprintf( "+%'--" . ( $idLength + 2 ) . "s+%'--" . ( $nameLength + 2 ) . "s+%'--" . ( $pluginLength + 2 ) . "s+%'--" . ( $oldVersionLength + 2 ) . 's+', '', '', '', '' ) );
514 \WP_CLI::line( sprintf( '| %-' . $idLength . 's | %-' . $nameLength . 's | %-' . $pluginLength . 's | %-' . $oldVersionLength . 's |', 'id', 'name', 'plugin', 'version' ) );
515 \WP_CLI::line( sprintf( "+%'--" . ( $idLength + 2 ) . "s+%'--" . ( $nameLength + 2 ) . "s+%'--" . ( $pluginLength + 2 ) . "s+%'--" . ( $oldVersionLength + 2 ) . 's+', '', '', '', '' ) );
516
517 foreach ( $websites_to_list as $website_item ) {
518 if ( $idLength < strlen( $website_item['id'] ) ) {
519 $idLength = strlen( $website_item['id'] );
520 }
521 if ( $nameLength < strlen( $website_item['name'] ) ) {
522 $nameLength = strlen( $website_item['name'] );
523 }
524
525 $i = 0;
526 foreach ( $website_item['plugins'] as $plugin_item ) {
527 if ( 0 === $i ) {
528 \WP_CLI::line( sprintf( '| %-' . $idLength . 's | %-' . $nameLength . 's | %-' . $pluginLength . 's | %-' . $oldVersionLength . 's |', $website_item['id'], $website_item['name'], $plugin_item['name'], $plugin_item['version'] ) );
529 } else {
530 \WP_CLI::line( sprintf( '| %-' . $idLength . 's | %-' . $nameLength . 's | %-' . $pluginLength . 's | %-' . $oldVersionLength . 's |', '', '', $plugin_item['name'], $plugin_item['version'] ) );
531 }
532 ++$i;
533 }
534 }
535
536 \WP_CLI::line( sprintf( "+%'--" . ( $idLength + 2 ) . "s+%'--" . ( $nameLength + 2 ) . "s+%'--" . ( $pluginLength + 2 ) . "s+%'--" . ( $oldVersionLength + 2 ) . 's+', '', '', '', '' ) );
537 } elseif ( isset( $assoc_args['upgrade'] ) || isset( $assoc_args['upgrade-all'] ) ) {
538
539 $pluginSlugs = array();
540 if ( isset( $assoc_args['upgrade'] ) ) {
541 $pluginSlugs = explode( ',', $assoc_args['upgrade'] );
542 }
543
544 $websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_for_current_user( false, null, 'wp.url', false, false, null, true ) );
545 $userExtension = MainWP_DB_Common::instance()->get_user_extension();
546 while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
547 if ( ! empty( $sites ) && ( ! in_array( $website->id, $sites, true ) ) ) {
548 continue;
549 }
550
551 $plugin_upgrades = json_decode( $website->plugin_upgrades, true );
552
553 if ( is_array( $plugin_upgrades ) ) {
554 $ignored_plugins = json_decode( $website->ignored_plugins, true );
555 if ( is_array( $ignored_plugins ) ) {
556 $plugin_upgrades = MainWP_Common_Functions::instance()->get_not_ignored_updates_themesplugins( $plugin_upgrades, $ignored_plugins );
557
558 }
559
560 $ignored_plugins = json_decode( $userExtension->ignored_plugins, true );
561 if ( is_array( $ignored_plugins ) ) {
562 $plugin_upgrades = MainWP_Common_Functions::instance()->get_not_ignored_updates_themesplugins( $plugin_upgrades, $ignored_plugins );
563
564 }
565
566 $tmp = array();
567 foreach ( $plugin_upgrades as $key => $plugin_upgrade ) {
568 if ( ! empty( $pluginSlugs ) && ( ! in_array( $plugin_upgrade['update']['slug'], $pluginSlugs, true ) ) ) {
569 continue;
570 }
571
572 $tmp[] = $key;
573 }
574
575 if ( empty( $tmp ) ) {
576 \WP_CLI::line( 'No available plugin updates for ' . $website->name );
577
578 continue;
579 }
580
581 \WP_CLI::line( 'Updating ' . count( $tmp ) . ' plugins for ' . $website->name );
582
583 try {
584 MainWP_Updates_Handler::upgrade_plugin_theme_translation( $website->id, 'plugin', implode( ',', $tmp ) );
585 \WP_CLI::success( 'Updates completed' );
586 } catch ( \Exception $e ) {
587 \WP_CLI::error( 'Updates failed: ' . MainWP_Error_Helper::get_console_error_message( $e ) );
588 if ( $e->getMesage() === 'WPERROR' ) {
589 \WP_CLI::debug( 'Error: ' . MainWP_Utility::value_to_string( $e->get_message_extra(), 1 ) );
590 }
591 }
592 }
593 }
594 }
595 }
596
597 /**
598 * List information about theme updates
599 *
600 * ## OPTIONS
601 *
602 * [<websiteid>]
603 * : The id (or ids, comma separated) of the child sites that need to be listed/upgraded, when omitted all childsites are used.
604 *
605 * [--list]
606 * : Get a list of themes with available updates
607 *
608 * [--list-all]
609 * : list all themes
610 *
611 * [--upgrade=<theme>]
612 * : Update the themes
613 *
614 * [--upgrade-all]
615 * : Update all themes
616 *
617 * ## EXAMPLES
618 *
619 * wp mainwp theme 2,5 --list
620 * wp mainwp theme --list
621 * wp mainwp theme 2,5 --upgrade-all
622 * wp mainwp theme 2,5 --upgrade=twentysixteen
623 *
624 * ## Synopsis [<websiteid>] [--list] [--list-all] [--upgrade=<theme>] [--upgrade-all]
625 *
626 * @param array $args Function arguments.
627 * @param array $assoc_args Function associate arguments.
628 *
629 * @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension()
630 * @uses \MainWP\Dashboard\MainWP_Error_Helper::get_console_error_message()
631 * @uses \MainWP\Dashboard\MainWP_DB::query()
632 * @uses \MainWP\Dashboard\MainWP_DB::get_sql_websites_for_current_user()
633 * @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
634 * @uses \MainWP\Dashboard\MainWP_Updates_Handler::upgrade_plugin_theme_translation()
635 * @uses \MainWP\Dashboard\MainWP_Utility::value_to_string()
636 */
637 public function theme( $args, $assoc_args ) { // phpcs:ignore -- NOSONAR -Current complexity is the only way to achieve desired results, pull request solutions appreciated.
638 $sites = array();
639 if ( ! empty( $args ) ) {
640 $args_exploded = explode( ',', $args[0] );
641 foreach ( $args_exploded as $arg ) {
642 if ( ! is_numeric( trim( $arg ) ) ) {
643 \WP_CLI::error( 'Child site IDs should be numeric.' );
644 }
645
646 $sites[] = trim( $arg );
647 }
648 }
649
650 if ( isset( $assoc_args['list'] ) ) {
651 $websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_for_current_user( false, null, 'wp.url', false, false, null, true ) );
652 $userExtension = MainWP_DB_Common::instance()->get_user_extension();
653 $websites_to_upgrade = array();
654 while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
655 if ( ! empty( $sites ) && ( ! in_array( $website->id, $sites, true ) ) ) {
656 continue;
657 }
658
659 $theme_upgrades = json_decode( $website->theme_upgrades, true );
660
661 if ( is_array( $theme_upgrades ) ) {
662 $ignored_themes = json_decode( $website->ignored_themes, true );
663 if ( is_array( $ignored_themes ) ) {
664 $theme_upgrades = MainWP_Common_Functions::instance()->get_not_ignored_updates_themesplugins( $theme_upgrades, $ignored_themes );
665 }
666
667 $ignored_themes = json_decode( $userExtension->ignored_themes, true );
668 if ( is_array( $ignored_themes ) ) {
669 $theme_upgrades = MainWP_Common_Functions::instance()->get_not_ignored_updates_themesplugins( $theme_upgrades, $ignored_themes );
670 }
671
672 $tmp = array();
673 foreach ( $theme_upgrades as $theme_upgrade ) {
674 $tmp[] = array(
675 'name' => $theme_upgrade['update']['theme'],
676 'version' => $theme_upgrade['Version'],
677 'new_version' => $theme_upgrade['update']['new_version'],
678 );
679 }
680 $websites_to_upgrade[] = array(
681 'id' => $website->id,
682 'name' => $website->name,
683 'themes' => $tmp,
684 );
685 }
686 }
687
688 $idLength = strlen( 'id' );
689 $nameLength = strlen( 'name' );
690 $themeLength = strlen( 'theme' );
691 $oldVersionLength = strlen( 'version' );
692 $newVersionLength = strlen( 'new version' );
693 foreach ( $websites_to_upgrade as $website_to_upgrade ) {
694 if ( $idLength < strlen( $website_to_upgrade['id'] ) ) {
695 $idLength = strlen( $website_to_upgrade['id'] );
696 }
697 if ( $nameLength < strlen( $website_to_upgrade['name'] ) ) {
698 $nameLength = strlen( $website_to_upgrade['name'] );
699 }
700
701 foreach ( $website_to_upgrade['themes'] as $theme_to_upgrade ) {
702 if ( $themeLength < strlen( $theme_to_upgrade['name'] ) ) {
703 $themeLength = strlen( $theme_to_upgrade['name'] );
704 }
705 if ( $oldVersionLength < strlen( $theme_to_upgrade['version'] ) ) {
706 $oldVersionLength = strlen( $theme_to_upgrade['version'] );
707 }
708 if ( $newVersionLength < strlen( $theme_to_upgrade['new_version'] ) ) {
709 $newVersionLength = strlen( $theme_to_upgrade['new_version'] );
710 }
711 }
712 }
713
714 \WP_CLI::line( sprintf( "+%'--" . ( $idLength + 2 ) . "s+%'--" . ( $nameLength + 2 ) . "s+%'--" . ( $themeLength + 2 ) . "s+%'--" . ( $oldVersionLength + 2 ) . "s+%'--" . ( $newVersionLength + 2 ) . 's+', '', '', '', '', '' ) );
715 \WP_CLI::line( sprintf( '| %-' . $idLength . 's | %-' . $nameLength . 's | %-' . $themeLength . 's | %-' . $oldVersionLength . 's | %-' . $newVersionLength . 's |', 'id', 'name', 'theme', 'version', 'new version' ) );
716 \WP_CLI::line( sprintf( "+%'--" . ( $idLength + 2 ) . "s+%'--" . ( $nameLength + 2 ) . "s+%'--" . ( $themeLength + 2 ) . "s+%'--" . ( $oldVersionLength + 2 ) . "s+%'--" . ( $newVersionLength + 2 ) . 's+', '', '', '', '', '' ) );
717
718 foreach ( $websites_to_upgrade as $website_to_upgrade ) {
719 if ( $idLength < strlen( $website_to_upgrade['id'] ) ) {
720 $idLength = strlen( $website_to_upgrade['id'] );
721 }
722 if ( $nameLength < strlen( $website_to_upgrade['name'] ) ) {
723 $nameLength = strlen( $website_to_upgrade['name'] );
724 }
725
726 $i = 0;
727 foreach ( $website_to_upgrade['themes'] as $theme_to_upgrade ) {
728 if ( 0 === $i ) {
729 \WP_CLI::line( sprintf( '| %-' . $idLength . 's | %-' . $nameLength . 's | %-' . $themeLength . 's | %-' . $oldVersionLength . 's | %-' . $newVersionLength . 's |', $website_to_upgrade['id'], $website_to_upgrade['name'], $theme_to_upgrade['name'], $theme_to_upgrade['version'], $theme_to_upgrade['new_version'] ) );
730 } else {
731 \WP_CLI::line( sprintf( '| %-' . $idLength . 's | %-' . $nameLength . 's | %-' . $themeLength . 's | %-' . $oldVersionLength . 's | %-' . $newVersionLength . 's |', '', '', $theme_to_upgrade['name'], $theme_to_upgrade['version'], $theme_to_upgrade['new_version'] ) );
732 }
733 ++$i;
734 }
735 }
736
737 \WP_CLI::line( sprintf( "+%'--" . ( $idLength + 2 ) . "s+%'--" . ( $nameLength + 2 ) . "s+%'--" . ( $themeLength + 2 ) . "s+%'--" . ( $oldVersionLength + 2 ) . "s+%'--" . ( $newVersionLength + 2 ) . 's+', '', '', '', '', '' ) );
738 } elseif ( isset( $assoc_args['list-all'] ) ) {
739 $websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_for_current_user( false, null, 'wp.url', false, false, null, true ) );
740 $userExtension = MainWP_DB_Common::instance()->get_user_extension();
741 $websites_to_upgrade = array();
742 while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
743 if ( ! empty( $sites ) && ( ! in_array( $website->id, $sites, true ) ) ) {
744 continue;
745 }
746 $theme_to_list = json_decode( $website->themes, true );
747 if ( is_array( $theme_to_list ) ) {
748 $tmp = array();
749 foreach ( $theme_to_list as $theme ) {
750 $tmp[] = array(
751 'name' => $theme['name'],
752 'active' => $theme['active'] ? 'yes' : '',
753 'version' => $theme['version'],
754 );
755 }
756 $websites_to_upgrade[] = array(
757 'id' => $website->id,
758 'name' => $website->name,
759 'themes' => $tmp,
760 );
761 }
762 }
763
764 $idLength = strlen( 'id' );
765 $nameLength = strlen( 'name' );
766 $themeLength = strlen( 'theme' );
767 $oldVersionLength = strlen( 'version' );
768 $activeLength = strlen( 'active' );
769 foreach ( $websites_to_upgrade as $website_item ) {
770 if ( $idLength < strlen( $website_item['id'] ) ) {
771 $idLength = strlen( $website_item['id'] );
772 }
773 if ( $nameLength < strlen( $website_item['name'] ) ) {
774 $nameLength = strlen( $website_item['name'] );
775 }
776
777 foreach ( $website_item['themes'] as $theme_item ) {
778 if ( $themeLength < strlen( $theme_item['name'] ) ) {
779 $themeLength = strlen( $theme_item['name'] );
780 }
781 if ( $oldVersionLength < strlen( $theme_item['version'] ) ) {
782 $oldVersionLength = strlen( $theme_item['version'] );
783 }
784 }
785 }
786
787 \WP_CLI::line( sprintf( "+%'--" . ( $idLength + 2 ) . "s+%'--" . ( $nameLength + 2 ) . "s+%'--" . ( $themeLength + 2 ) . "s+%'--" . ( $activeLength + 2 ) . "s+%'--" . ( $oldVersionLength + 2 ) . 's+', '', '', '', '', '' ) );
788 \WP_CLI::line( sprintf( '| %-' . $idLength . 's | %-' . $nameLength . 's | %-' . $themeLength . 's | %-' . $activeLength . 's | %-' . $oldVersionLength . 's |', 'id', 'name', 'theme', 'active', 'version' ) );
789 \WP_CLI::line( sprintf( "+%'--" . ( $idLength + 2 ) . "s+%'--" . ( $nameLength + 2 ) . "s+%'--" . ( $themeLength + 2 ) . "s+%'--" . ( $activeLength + 2 ) . "s+%'--" . ( $oldVersionLength + 2 ) . 's+', '', '', '', '', '' ) );
790
791 foreach ( $websites_to_upgrade as $website_item ) {
792 if ( $idLength < strlen( $website_item['id'] ) ) {
793 $idLength = strlen( $website_item['id'] );
794 }
795 if ( $nameLength < strlen( $website_item['name'] ) ) {
796 $nameLength = strlen( $website_item['name'] );
797 }
798
799 $i = 0;
800 foreach ( $website_item['themes'] as $theme_item ) {
801 if ( 0 === $i ) {
802 \WP_CLI::line( sprintf( '| %-' . $idLength . 's | %-' . $nameLength . 's | %-' . $themeLength . 's | %-' . $activeLength . 's | %-' . $oldVersionLength . 's |', $website_item['id'], $website_item['name'], $theme_item['name'], $theme_item['active'], $theme_item['version'] ) );
803 } else {
804 \WP_CLI::line( sprintf( '| %-' . $idLength . 's | %-' . $nameLength . 's | %-' . $themeLength . 's | %-' . $activeLength . 's | %-' . $oldVersionLength . 's |', '', '', $theme_item['name'], $theme_item['active'], $theme_item['version'] ) );
805 }
806 ++$i;
807 }
808 }
809
810 \WP_CLI::line( sprintf( "+%'--" . ( $idLength + 2 ) . "s+%'--" . ( $nameLength + 2 ) . "s+%'--" . ( $themeLength + 2 ) . "s+%'--" . ( $activeLength + 2 ) . "s+%'--" . ( $oldVersionLength + 2 ) . 's+', '', '', '', '', '' ) );
811 } elseif ( isset( $assoc_args['upgrade'] ) || isset( $assoc_args['upgrade-all'] ) ) {
812
813 $themeSlugs = array();
814 if ( isset( $assoc_args['upgrade'] ) ) {
815 $themeSlugs = explode( ',', $assoc_args['upgrade'] );
816 }
817
818 $websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_for_current_user( false, null, 'wp.url', false, false, null, true ) );
819 $userExtension = MainWP_DB_Common::instance()->get_user_extension();
820 while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
821 if ( ! empty( $sites ) && ( ! in_array( $website->id, $sites, true ) ) ) {
822 continue;
823 }
824
825 $theme_upgrades = json_decode( $website->theme_upgrades, true );
826
827 if ( is_array( $theme_upgrades ) ) {
828 $ignored_themes = json_decode( $website->ignored_themes, true );
829 if ( is_array( $ignored_themes ) ) {
830 $theme_upgrades = MainWP_Common_Functions::instance()->get_not_ignored_updates_themesplugins( $theme_upgrades, $ignored_themes );
831 }
832
833 $ignored_themes = json_decode( $userExtension->ignored_themes, true );
834 if ( is_array( $ignored_themes ) ) {
835 $theme_upgrades = MainWP_Common_Functions::instance()->get_not_ignored_updates_themesplugins( $theme_upgrades, $ignored_themes );
836 }
837
838 $tmp = array();
839 foreach ( $theme_upgrades as $key => $theme_upgrade ) {
840 if ( ! empty( $themeSlugs ) && ( ! in_array( $theme_upgrade['update']['slug'], $themeSlugs, true ) ) ) {
841 continue;
842 }
843
844 $tmp[] = $key;
845 }
846
847 if ( empty( $tmp ) ) {
848 \WP_CLI::line( 'No available theme updates for ' . $website->name );
849
850 continue;
851 }
852
853 \WP_CLI::line( 'Updating ' . count( $tmp ) . ' themes for ' . $website->name );
854
855 try {
856 MainWP_Updates_Handler::upgrade_plugin_theme_translation( $website->id, 'theme', implode( ',', $tmp ) );
857 \WP_CLI::success( 'Updates completed' );
858 } catch ( \Exception $e ) {
859 \WP_CLI::error( 'Updates failed: ' . MainWP_Error_Helper::get_console_error_message( $e ) );
860 if ( $e->getMesage() === 'WPERROR' ) {
861 \WP_CLI::debug( 'Error: ' . MainWP_Utility::value_to_string( $e->get_message_extra(), 1 ) );
862 }
863 }
864 }
865 }
866 }
867 }
868 }
869