PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 4.1
MainWP Dashboard: Self-hosted WordPress Management for Agencies v4.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 4.1, at class/class-mainwp-wp-cli-command.php

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