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

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