@@ -487,7 +487,8 @@ public function activate( $args, $assoc_args = [] ) {
487487 // If force flag is set, deactivate and reactivate to run activation hooks.
488488 if ( $ force ) {
489489 deactivate_plugins ( $ plugin ->file , false , true );
490- } else {
490+ } elseif ( ! $ this ->chained_command ) {
491+ // Only skip if not part of a chained command.
491492 WP_CLI ::warning ( "Plugin ' {$ plugin ->name }' is already network active. " );
492493 continue ;
493494 }
@@ -497,7 +498,8 @@ public function activate( $args, $assoc_args = [] ) {
497498 // If force flag is set, deactivate and reactivate to run activation hooks.
498499 if ( $ force ) {
499500 deactivate_plugins ( $ plugin ->file , false , false );
500- } else {
501+ } elseif ( ! $ this ->chained_command ) {
502+ // Only skip if not part of a chained command.
501503 WP_CLI ::warning ( "Plugin ' {$ plugin ->name }' is already active. " );
502504 continue ;
503505 }
@@ -511,22 +513,30 @@ public function activate( $args, $assoc_args = [] ) {
511513 $ result = activate_plugin ( $ plugin ->file , '' , $ network_wide );
512514
513515 if ( is_wp_error ( $ result ) ) {
514- $ message = $ result ->get_error_message ();
515- $ message = (string ) preg_replace ( '/<a\s[^>]+>.*<\/a>/im ' , '' , $ message );
516- $ message = wp_strip_all_tags ( $ message );
517- $ message = str_replace ( 'Error: ' , '' , $ message );
518- WP_CLI ::warning ( "Failed to activate plugin. {$ message }" );
519- // If the error is due to unexpected output, display it for debugging
520- if ( 'unexpected_output ' === $ result ->get_error_code () ) {
521- /**
522- * @var string $output
523- */
524- $ output = $ result ->get_error_data ();
525- if ( ! empty ( $ output ) ) {
526- WP_CLI ::debug ( "Unexpected output: {$ output }" , 'plugin ' );
516+ // When called from a chained command, treat 'already_active' as success.
517+ // This handles race conditions where WordPress may have preserved activation
518+ // status during the install process.
519+ if ( $ this ->chained_command && 'plugin_already_active ' === $ result ->get_error_code () ) {
520+ $ this ->active_output ( $ plugin ->name , $ plugin ->file , $ network_wide , 'activate ' );
521+ ++$ successes ;
522+ } else {
523+ $ message = $ result ->get_error_message ();
524+ $ message = (string ) preg_replace ( '/<a\s[^>]+>.*<\/a>/im ' , '' , $ message );
525+ $ message = wp_strip_all_tags ( $ message );
526+ $ message = str_replace ( 'Error: ' , '' , $ message );
527+ WP_CLI ::warning ( "Failed to activate plugin. {$ message }" );
528+ // If the error is due to unexpected output, display it for debugging
529+ if ( 'unexpected_output ' === $ result ->get_error_code () ) {
530+ /**
531+ * @var string $output
532+ */
533+ $ output = $ result ->get_error_data ();
534+ if ( ! empty ( $ output ) ) {
535+ WP_CLI ::debug ( "Unexpected output: {$ output }" , 'plugin ' );
536+ }
527537 }
538+ ++$ errors ;
528539 }
529- ++$ errors ;
530540 } else {
531541 $ this ->active_output ( $ plugin ->name , $ plugin ->file , $ network_wide , 'activate ' );
532542 ++$ successes ;
0 commit comments