From 0aa207b55c41d74722ffd481bdd6ef54514476f3 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Wed, 29 Jul 2026 12:15:23 +0200 Subject: [PATCH 1/2] Expose add_to_blog, new_role, and blog_id fields in signup list and get Closes #629 --- features/signup.feature | 72 ++++++++++++++++++++++++++++++++++------- src/Signup_Command.php | 46 ++++++++++++++++++++++++-- 2 files changed, 104 insertions(+), 14 deletions(-) diff --git a/features/signup.feature b/features/signup.feature index a3a132066..252804720 100644 --- a/features/signup.feature +++ b/features/signup.feature @@ -11,8 +11,8 @@ Feature: Manage signups in a multisite installation Scenario: List signups Given a WP multisite install - And I run `wp eval 'wpmu_signup_user( "bobuser", "bobuser@example.com" );'` - And I run `wp eval 'wpmu_signup_user( "johnuser", "johnuser@example.com" );'` + And I run `wp eval "wpmu_signup_user( 'bobuser', 'bobuser@example.com' );"` + And I run `wp eval "wpmu_signup_user( 'johnuser', 'johnuser@example.com' );"` When I run `wp user signup list --fields=signup_id,user_login,user_email,active --format=csv` Then STDOUT should be: @@ -50,7 +50,7 @@ Feature: Manage signups in a multisite installation Scenario: Get signup Given a WP multisite install - And I run `wp eval 'wpmu_signup_user( "bobuser", "bobuser@example.com" );'` + And I run `wp eval "wpmu_signup_user( 'bobuser', 'bobuser@example.com' );"` When I run `wp user signup get 1 --field=user_login` Then STDOUT should be: @@ -67,7 +67,7 @@ Feature: Manage signups in a multisite installation Scenario: Activate signup Given a WP multisite install - And I run `wp eval 'wpmu_signup_user( "bobuser", "bobuser@example.com" );'` + And I run `wp eval "wpmu_signup_user( 'bobuser', 'bobuser@example.com' );"` When I run `wp user signup get bobuser --field=active` Then STDOUT should be: @@ -101,8 +101,8 @@ Feature: Manage signups in a multisite installation Scenario: Activate multiple signups Given a WP multisite install - And I run `wp eval 'wpmu_signup_user( "bobuser", "bobuser@example.com" );'` - And I run `wp eval 'wpmu_signup_user( "johnuser", "johnuser@example.com" );'` + And I run `wp eval "wpmu_signup_user( 'bobuser', 'bobuser@example.com' );"` + And I run `wp eval "wpmu_signup_user( 'johnuser', 'johnuser@example.com' );"` When I run `wp user signup list --active=0 --format=count` Then STDOUT should be: @@ -124,7 +124,7 @@ Feature: Manage signups in a multisite installation Scenario: Activate blog signup entry Given a WP multisite install - And I run `wp eval 'wpmu_signup_blog( "example.com", "/bobsite/", "My Awesome Title", "bobuser", "bobuser@example.com" );'` + And I run `wp eval "wpmu_signup_blog( 'example.com', '/bobsite/', 'My Awesome Title', 'bobuser', 'bobuser@example.com' );"` When I run `wp user signup get bobuser --fields=user_login,domain,path,active --format=csv` Then STDOUT should be: @@ -147,8 +147,8 @@ Feature: Manage signups in a multisite installation Scenario: Delete signups Given a WP multisite install - And I run `wp eval 'wpmu_signup_user( "bobuser", "bobuser@example.com" );'` - And I run `wp eval 'wpmu_signup_user( "johnuser", "johnuser@example.com" );'` + And I run `wp eval "wpmu_signup_user( 'bobuser', 'bobuser@example.com' );"` + And I run `wp eval "wpmu_signup_user( 'johnuser', 'johnuser@example.com' );"` When I run `wp user signup get bobuser --field=user_email` Then STDOUT should be: @@ -176,8 +176,8 @@ Feature: Manage signups in a multisite installation Scenario: Delete all signups Given a WP multisite install - And I run `wp eval 'wpmu_signup_user( "bobuser", "bobuser@example.com" );'` - And I run `wp eval 'wpmu_signup_user( "johnuser", "johnuser@example.com" );'` + And I run `wp eval "wpmu_signup_user( 'bobuser', 'bobuser@example.com' );"` + And I run `wp eval "wpmu_signup_user( 'johnuser', 'johnuser@example.com' );"` When I try `wp user signup delete` Then STDERR should be: @@ -196,3 +196,53 @@ Feature: Manage signups in a multisite installation """ 0 """ + + Scenario: Expose add_to_blog, new_role, and blog_id fields and support filtering by them + Given a WP multisite install + And I run `wp eval "wpmu_signup_user( 'adminuser', 'adminuser@example.com', array( 'add_to_blog' => 228, 'new_role' => 'administrator' ) );"` + And I run `wp eval "wpmu_signup_user( 'editoruser', 'editoruser@example.com', array( 'add_to_blog' => 228, 'new_role' => 'editor' ) );"` + And I run `wp eval "wpmu_signup_user( 'otherbloguser', 'otherbloguser@example.com', array( 'add_to_blog' => 300, 'new_role' => 'administrator' ) );"` + And I run `wp eval "wpmu_signup_user( 'plainuser', 'plainuser@example.com' );"` + + When I run `wp user signup list --active=0 --new_role=administrator --fields=user_login,new_role,blog_id --format=csv` + Then STDOUT should be: + """ + user_login,new_role,blog_id + adminuser,administrator,228 + otherbloguser,administrator,300 + """ + + When I run `wp user signup list --active=0 --blog_id=228 --fields=user_login,new_role,add_to_blog --format=csv` + Then STDOUT should be: + """ + user_login,new_role,add_to_blog + adminuser,administrator,228 + editoruser,editor,228 + """ + + When I run `wp user signup list --active=0 --add_to_blog=228 --fields=user_login,new_role,add_to_blog --format=csv` + Then STDOUT should be: + """ + user_login,new_role,add_to_blog + adminuser,administrator,228 + editoruser,editor,228 + """ + + When I run `wp user signup get adminuser --field=add_to_blog` + Then STDOUT should be: + """ + 228 + """ + + When I run `wp user signup get adminuser --field=new_role` + Then STDOUT should be: + """ + administrator + """ + + When I run `wp user signup get adminuser --field=blog_id` + Then STDOUT should be: + """ + 228 + """ + diff --git a/src/Signup_Command.php b/src/Signup_Command.php index 4125ceea8..ca2a5933d 100644 --- a/src/Signup_Command.php +++ b/src/Signup_Command.php @@ -99,6 +99,9 @@ public function __construct() { * * title * * activated * * meta + * * add_to_blog + * * new_role + * * blog_id * * ## EXAMPLES * @@ -143,10 +146,19 @@ public function list_( $args, $assoc_args ) { $results = $wpdb->get_results( $query, ARRAY_A ); if ( $results ) { + $filter_args = array_diff_key( + $assoc_args, + array_flip( array( 'fields', 'field', 'format', 'per_page' ) ) + ); + foreach ( $results as $item ) { - // Support features like --active=0. - foreach ( array_keys( $item ) as $field ) { - if ( isset( $assoc_args[ $field ] ) && $assoc_args[ $field ] !== $item[ $field ] ) { + $item = $this->prepare_signup_array( $item ); + + // Support features like --active=0, --new_role=administrator, --blog_id=228. + foreach ( $filter_args as $field => $value ) { + $item_val = is_scalar( $item[ $field ] ?? null ) ? (string) $item[ $field ] : ''; + $filter_val = is_scalar( $value ) ? (string) $value : ''; + if ( ! isset( $item[ $field ] ) || $item_val !== $filter_val ) { continue 2; } } @@ -204,6 +216,7 @@ public function list_( $args, $assoc_args ) { */ public function get( $args, $assoc_args ) { $signup = $this->fetcher->get_check( $args[0] ); + $signup = (object) $this->prepare_signup_array( (array) $signup ); if ( empty( $assoc_args['fields'] ) ) { $assoc_args['fields'] = array_keys( (array) $signup ); @@ -336,4 +349,31 @@ private function delete_all_signups() { return $results ? true : false; } + + /** + * Prepare a signup item by extracting meta properties. + * + * @param array $item Signup array item. + * @return array Prepared signup array item. + */ + private function prepare_signup_array( array $item ) { + if ( ! empty( $item['meta'] ) && is_string( $item['meta'] ) ) { + $meta_data = maybe_unserialize( $item['meta'] ); + if ( is_array( $meta_data ) ) { + foreach ( $meta_data as $meta_key => $meta_value ) { + if ( ! isset( $item[ $meta_key ] ) ) { + $item[ $meta_key ] = $meta_value; + } + } + + if ( isset( $meta_data['add_to_blog'] ) && ! isset( $item['blog_id'] ) ) { + $item['blog_id'] = $meta_data['add_to_blog']; + } elseif ( isset( $meta_data['blog_id'] ) && ! isset( $item['add_to_blog'] ) ) { + $item['add_to_blog'] = $meta_data['blog_id']; + } + } + } + + return $item; + } } From 688c459bd75bcff57cc6782752499d59ba1fff18 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Wed, 29 Jul 2026 16:43:28 +0200 Subject: [PATCH 2/2] Apply signup metadata filters before per_page pagination --- features/signup.feature | 16 ++++++++++++++++ src/Signup_Command.php | 16 ++++++++++------ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/features/signup.feature b/features/signup.feature index 252804720..aeecb2ec6 100644 --- a/features/signup.feature +++ b/features/signup.feature @@ -246,3 +246,19 @@ Feature: Manage signups in a multisite installation 228 """ + Scenario: Filter signups by metadata with per_page pagination + Given a WP multisite install + And I run `wp eval "wpmu_signup_user( 'plainuser', 'plainuser@example.com' );"` + And I run `wp eval "wpmu_signup_user( 'adminuser', 'adminuser@example.com', array( 'add_to_blog' => 228, 'new_role' => 'administrator' ) );"` + And I run `wp eval "wpmu_signup_user( 'editoruser', 'editoruser@example.com', array( 'add_to_blog' => 228, 'new_role' => 'editor' ) );"` + And I run `wp eval "wpmu_signup_user( 'otherbloguser', 'otherbloguser@example.com', array( 'add_to_blog' => 300, 'new_role' => 'administrator' ) );"` + + When I run `wp user signup list --blog_id=228 --per_page=2 --fields=user_login,blog_id --format=csv` + Then STDOUT should be: + """ + user_login,blog_id + adminuser,228 + editoruser,228 + """ + + diff --git a/src/Signup_Command.php b/src/Signup_Command.php index ca2a5933d..7c51093d4 100644 --- a/src/Signup_Command.php +++ b/src/Signup_Command.php @@ -138,7 +138,12 @@ public function list_( $args, $assoc_args ) { */ $per_page = Utils\get_flag_value( $assoc_args, 'per_page' ); - $limit = $per_page ? $wpdb->prepare( 'LIMIT %d', (int) $per_page ) : ''; + $filter_args = array_diff_key( + $assoc_args, + array_flip( array( 'fields', 'field', 'format', 'per_page' ) ) + ); + + $limit = ( $per_page && empty( $filter_args ) ) ? $wpdb->prepare( 'LIMIT %d', (int) $per_page ) : ''; $query = "SELECT * FROM $wpdb->signups {$limit}"; @@ -146,11 +151,6 @@ public function list_( $args, $assoc_args ) { $results = $wpdb->get_results( $query, ARRAY_A ); if ( $results ) { - $filter_args = array_diff_key( - $assoc_args, - array_flip( array( 'fields', 'field', 'format', 'per_page' ) ) - ); - foreach ( $results as $item ) { $item = $this->prepare_signup_array( $item ); @@ -167,6 +167,10 @@ public function list_( $args, $assoc_args ) { } } + if ( $per_page ) { + $signups = array_slice( $signups, 0, (int) $per_page ); + } + $format = Utils\get_flag_value( $assoc_args, 'format', 'table' ); $formatter = $this->get_formatter( $assoc_args );