Ticket #8582: 8582.5.patch
File 8582.5.patch, 67.3 KB (added by , 3 years ago) |
---|
-
src/bp-core/admin/bp-core-admin-settings.php
diff --git src/bp-core/admin/bp-core-admin-settings.php src/bp-core/admin/bp-core-admin-settings.php index b37b914ff..a7e93c098 100644
function bp_admin_setting_callback_members_invitations() { 203 203 do_action( 'bp_admin_settings_after_members_invitations' ); 204 204 } 205 205 206 /** 207 * Allow new users to request membership to the network. 208 * 209 * @since 10.0.0 210 */ 211 function bp_admin_setting_callback_membership_requests() { 212 ?> 213 <input id="bp-enable-membership-requests" name="bp-enable-membership-requests" type="checkbox" value="1" <?php checked( bp_get_membership_requests_required( 'raw' ) ); ?> /> 214 <label for="bp-enable-membership-requests"><?php esc_html_e( 'Allow visitors to request site membership. If enabled, an administrator must approve each new site membership request.', 'buddypress' ); ?></label> 215 <?php if ( bp_get_signup_allowed() ) : ?> 216 <p class="description"><?php esc_html_e( 'Public registration is currently enabled. If you wish to require approval for new memberships, disable public registration and enable the membership requests feature.', 'buddypress' ); ?></p> 217 <?php endif; ?> 218 <?php 219 /** 220 * Fires after the output of the membership requests settings section. 221 * 222 * @since 10.0.0 223 */ 224 do_action( 'bp_admin_settings_after_membership_requests' ); 225 } 226 206 227 /** XProfile ******************************************************************/ 207 228 208 229 /** -
src/bp-core/bp-core-functions.php
diff --git src/bp-core/bp-core-functions.php src/bp-core/bp-core-functions.php index 3dbc32f11..b140fbf6d 100644
function bp_core_replace_tokens_in_text( $text, $tokens ) { 3800 3800 * Get a list of emails for populating the email post type. 3801 3801 * 3802 3802 * @since 2.5.1 3803 * @since 10.0.0 Added members-membership-request and 3804 * members-membership-request-rejected email types. 3803 3805 * 3804 3806 * @return array 3805 3807 */ … … function bp_email_get_schema() { 3960 3962 /* translators: do not remove {} brackets or translate its contents. */ 3961 3963 'post_excerpt' => __( "{{inviter.name}} has invited you to join the site \"{{site.name}}\".\n\n{{usermessage}}\n\nTo accept your invitation, visit: {{{invite.accept_url}}}\n\nTo learn more about the site, visit: {{{site.url}}}.\nTo view {{inviter.name}}'s profile, visit: {{{inviter.url}}}", 'buddypress' ), 3962 3964 ), 3965 'members-membership-request' => array( 3966 /* translators: do not remove {} brackets or translate its contents. */ 3967 'post_title' => __( '{{requesting-user.user_login}} would like to join {{site.name}}', 'buddypress' ), 3968 /* translators: do not remove {} brackets or translate its contents. */ 3969 'post_content' => __( "{{requesting-user.user_login}} would like to join the site: "{{site.name}}".\n\n<a href=\"{{{manage.url}}}\">Manage the request</a>.", 'buddypress' ), 3970 /* translators: do not remove {} brackets or translate its contents. */ 3971 'post_excerpt' => __( "{{requesting-user.user_login}} would like to join the site \"{{site.name}}\".\n\nTo manage the request, visit: {{{manage.url}}}.", 'buddypress' ), 3972 ), 3973 'members-membership-request-rejected' => array( 3974 /* translators: do not remove {} brackets or translate its contents. */ 3975 'post_title' => __( 'Your request to join {{site.name}} has been declined', 'buddypress' ), 3976 /* translators: do not remove {} brackets or translate its contents. */ 3977 'post_content' => __( "Sorry, your request to join the site "{{site.name}}" has been declined.", 'buddypress' ), 3978 /* translators: do not remove {} brackets or translate its contents. */ 3979 'post_excerpt' => __( "Sorry, your request to join the site \"{{site.name}}\" has been declined.", 'buddypress' ), 3980 ), 3963 3981 ) ); 3964 3982 } 3965 3983 … … function bp_email_get_type_schema( $field = 'description' ) { 4132 4150 ), 4133 4151 ); 4134 4152 4153 $members_membership_request= array( 4154 'description' => __( 'Someone has requested membership on this site.', 'buddypress' ), 4155 'named_salutation' => true, 4156 'unsubscribe' => array( 4157 'meta_key' => 'notification_members_membership_request', 4158 'message' => __( 'You will no longer receive emails when people submit requests to join this site.', 'buddypress' ), 4159 ), 4160 ); 4161 4162 $members_membership_request_rejected= array( 4163 'description' => __( 'A site membership request has been rejected.', 'buddypress' ), 4164 'named_salutation' => false, 4165 'unsubscribe' => false, 4166 ); 4167 4135 4168 $types = array( 4136 'activity-comment' => $activity_comment, 4137 'activity-comment-author' => $activity_comment_author, 4138 'activity-at-message' => $activity_at_message, 4139 'groups-at-message' => $groups_at_message, 4140 'core-user-registration' => $core_user_registration, 4141 'core-user-registration-with-blog' => $core_user_registration_with_blog, 4142 'friends-request' => $friends_request, 4143 'friends-request-accepted' => $friends_request_accepted, 4144 'groups-details-updated' => $groups_details_updated, 4145 'groups-invitation' => $groups_invitation, 4146 'groups-member-promoted' => $groups_member_promoted, 4147 'groups-membership-request' => $groups_membership_request, 4148 'messages-unread' => $messages_unread, 4149 'settings-verify-email-change' => $settings_verify_email_change, 4150 'groups-membership-request-accepted' => $groups_membership_request_accepted, 4151 'groups-membership-request-rejected' => $groups_membership_request_rejected, 4152 'core-user-activation' => $core_user_activation, 4153 'bp-members-invitation' => $members_invitation, 4169 'activity-comment' => $activity_comment, 4170 'activity-comment-author' => $activity_comment_author, 4171 'activity-at-message' => $activity_at_message, 4172 'groups-at-message' => $groups_at_message, 4173 'core-user-registration' => $core_user_registration, 4174 'core-user-registration-with-blog' => $core_user_registration_with_blog, 4175 'friends-request' => $friends_request, 4176 'friends-request-accepted' => $friends_request_accepted, 4177 'groups-details-updated' => $groups_details_updated, 4178 'groups-invitation' => $groups_invitation, 4179 'groups-member-promoted' => $groups_member_promoted, 4180 'groups-membership-request' => $groups_membership_request, 4181 'messages-unread' => $messages_unread, 4182 'settings-verify-email-change' => $settings_verify_email_change, 4183 'groups-membership-request-accepted' => $groups_membership_request_accepted, 4184 'groups-membership-request-rejected' => $groups_membership_request_rejected, 4185 'core-user-activation' => $core_user_activation, 4186 'bp-members-invitation' => $members_invitation, 4187 'members-membership-request' => $members_membership_request, 4188 'members-membership-request-rejected' => $members_membership_request_rejected, 4154 4189 ); 4155 4190 4156 4191 if ( $field !== 'all' ) { -
src/bp-core/bp-core-template.php
diff --git src/bp-core/bp-core-template.php src/bp-core/bp-core-template.php index efb251957..87a16b7a6 100644
function bp_get_title_parts( $seplocation = 'right' ) { 3192 3192 3193 3193 // Sign up page. 3194 3194 } elseif ( bp_is_register_page() ) { 3195 $bp_title_parts = array( __( 'Create an Account', 'buddypress' ) ); 3195 if ( bp_get_membership_requests_required() ) { 3196 $bp_title_parts = array( __( 'Request Membership', 'buddypress' ) ); 3197 } else { 3198 $bp_title_parts = array( __( 'Create an Account', 'buddypress' ) ); 3199 } 3196 3200 3197 3201 // Activation page. 3198 3202 } elseif ( bp_is_activation_page() ) { -
src/bp-core/bp-core-update.php
diff --git src/bp-core/bp-core-update.php src/bp-core/bp-core-update.php index 03710213c..d7e0d5b5b 100644
function bp_core_get_8_0_upgrade_email_schema( $emails ) { 704 704 return $new_emails; 705 705 } 706 706 707 /** 708 * 10.0.0 update routine. 709 * 710 * - Explicitly set all signups to count_sent = 1 & sent_date to registered_date 711 * - **Create the new BP Emails**. 712 * 713 * @since 10.0.0 714 */ 715 function bp_update_to_10_0() { 716 717 // @TODO: Explicitly set all signups to count_sent = 1 & sent_date to registered_date 718 // Is there any way to update that meta in bulk? I think it will have to be one at a time. 719 720 // Do we need this upgrade routine? 721 // Could we just assume if count_sent or sent_date defaults to 1 and to the registered_date into the PHP Code? 722 } 723 707 724 /** 708 725 * Updates the component field for new_members type. 709 726 * -
src/bp-core/classes/class-bp-admin.php
diff --git src/bp-core/classes/class-bp-admin.php src/bp-core/classes/class-bp-admin.php index ee80328cc..ebe217a22 100644
class BP_Admin { 417 417 register_setting( 'buddypress', 'bp-enable-members-invitations', 'intval' ); 418 418 } 419 419 420 // Membership requests. 421 if ( bp_is_active( 'members', 'membership_requests' ) ) { 422 add_settings_field( 'bp-enable-membership-requests', __( 'Membership Requests', 'buddypress' ), 'bp_admin_setting_callback_membership_requests', 'buddypress', 'bp_members' ); 423 register_setting( 'buddypress', 'bp-enable-membership-requests', 'intval' ); 424 } 425 420 426 /* XProfile Section **************************************************/ 421 427 422 428 if ( bp_is_active( 'xprofile' ) ) { -
src/bp-members/bp-members-functions.php
diff --git src/bp-members/bp-members-functions.php src/bp-members/bp-members-functions.php index 93fd7cafd..141c545fa 100644
function bp_core_signup_send_validation_email( $user_id, $user_email, $key, $sal 2388 2388 bp_send_email( 'core-user-registration', $to, $args ); 2389 2389 2390 2390 // Record that the activation email has been sent. 2391 $signups = BP_Signup::get( 2392 array( 2393 'activation_key' => $key, 2394 ) 2395 ); 2391 $signup = bp_members_get_signup_by( 'activation_key', $key ); 2396 2392 2397 if ( ! empty( $signups['signups'] ) ) { 2398 foreach ( $signups['signups'] as $signup ) { 2399 $meta = array( 2400 'sent_date' => current_time( 'mysql', true ), 2401 'count_sent' => $signup->count_sent + 1 2402 ); 2393 if ( $signup ) { 2394 $meta = array( 2395 'sent_date' => current_time( 'mysql', true ), 2396 'count_sent' => $signup->count_sent + 1 2397 ); 2403 2398 2404 BP_Signup::update( array( 2405 'signup_id' => $signup->id, 2406 'meta' => $meta, 2407 ) ); 2408 } 2399 BP_Signup::update( array( 2400 'signup_id' => $signup->id, 2401 'meta' => $meta, 2402 ) ); 2409 2403 } 2410 2404 } 2411 2405 … … function bp_core_signup_disable_inactive( $user = null, $username = '', $passwor 2450 2444 } 2451 2445 2452 2446 // Unactivated user account found! 2453 // Set up the feedback message. 2454 $signup_id = $signup['signups'][0]->signup_id; 2447 /* 2448 * Don't allow users to resend their own activation email 2449 * when membership requests are enabled. 2450 */ 2451 if ( bp_get_membership_requests_required() ) { 2452 return new WP_Error( 'bp_account_not_activated', __( '<strong>Error</strong>: Your membership request has not yet been approved.', 'buddypress' ) ); 2453 } else { 2454 // Set up the feedback message. 2455 $signup_id = $signup['signups'][0]->signup_id; 2455 2456 2456 $resend_url_params = array(2457 'action' => 'bp-resend-activation',2458 'id' => $signup_id,2459 );2457 $resend_url_params = array( 2458 'action' => 'bp-resend-activation', 2459 'id' => $signup_id, 2460 ); 2460 2461 2461 $resend_url = wp_nonce_url(2462 add_query_arg( $resend_url_params, wp_login_url() ),2463 'bp-resend-activation'2464 );2462 $resend_url = wp_nonce_url( 2463 add_query_arg( $resend_url_params, wp_login_url() ), 2464 'bp-resend-activation' 2465 ); 2465 2466 2466 $resend_string = '<br /><br />';2467 $resend_string = '<br /><br />'; 2467 2468 2468 /* translators: %s: the activation url */2469 $resend_string .= sprintf( __( 'If you have not received an email yet, <a href="%s">click here to resend it</a>.', 'buddypress' ), esc_url( $resend_url ) );2469 /* translators: %s: the activation url */ 2470 $resend_string .= sprintf( __( 'If you have not received an email yet, <a href="%s">click here to resend it</a>.', 'buddypress' ), esc_url( $resend_url ) ); 2470 2471 2471 return new WP_Error( 'bp_account_not_activated', __( '<strong>Error</strong>: Your account has not been activated. Check your email for the activation link.', 'buddypress' ) . $resend_string ); 2472 return new WP_Error( 'bp_account_not_activated', __( '<strong>Error</strong>: Your account has not been activated. Check your email for the activation link.', 'buddypress' ) . $resend_string ); 2473 } 2472 2474 } 2473 2475 add_filter( 'authenticate', 'bp_core_signup_disable_inactive', 30, 3 ); 2474 2476 … … function bp_get_members_invitation_from_request() { 3694 3696 */ 3695 3697 return apply_filters( 'bp_get_members_invitation_from_request', $invite ); 3696 3698 } 3699 3700 /** 3701 * Get WP_User object corresponding to a record in the signups table. 3702 * 3703 * @since 10.0.0 3704 * 3705 * @param string $field Which fields to search by. Possible values are 3706 * activation_key, user_email, id. 3707 * @param string $value Value to search by. 3708 * @return bool|BP_Signup $signup Found signup, returns first found 3709 * if more than one is found. 3710 */ 3711 function bp_members_get_signup_by( $field = 'activation_key', $value ) { 3712 switch ( $field ) { 3713 case 'activation_key': 3714 case 'user_email': 3715 $key = $field; 3716 break; 3717 3718 case 'id': 3719 default: 3720 $key = 'include'; 3721 break; 3722 } 3723 3724 $signups = BP_Signup::get( 3725 array( 3726 $key => $value, 3727 ) 3728 ); 3729 3730 if ( ! empty( $signups['signups'] ) ) { 3731 $signup = current( $signups['signups'] ); 3732 } else { 3733 $signup = false; 3734 } 3735 3736 return $signup; 3737 } -
src/bp-members/bp-members-invitations.php
diff --git src/bp-members/bp-members-invitations.php src/bp-members/bp-members-invitations.php index 73f50e09b..7e95c791d 100644
function bp_members_invitations_delete_optedout_invites( $optout ) { 183 183 ); 184 184 } 185 185 add_action( 'bp_optout_after_save', 'bp_members_invitations_delete_optedout_invites' ); 186 187 /** 188 * If a user submits a site membership request, but there's a 189 * sent invitation to her, bypass the manual approval of the request. 190 * 191 * @since 10.0.0 192 * 193 * @param bool $send Whether or not this membership request should be approved 194 * immediately and the activation email sent. 195 * Default is `false` meaning that the request should be 196 * manually approved by a site admin. 197 * @param array $details The details of the request. 198 */ 199 function bp_members_invitations_maybe_bypass_request_approval( $send, $details ) { 200 if ( ! bp_get_members_invitations_allowed() ) { 201 return $send; 202 } 203 204 // We'll need the prospective user's email address. 205 if ( empty( $details['user_email'] ) ) { 206 return $send; 207 } 208 209 $invites = bp_members_invitations_get_invites( 210 array( 211 'invitee_email' => $details['user_email'], 212 'invite_sent' => 'sent' 213 ) 214 ); 215 // If pending invitations exist, send the verification mail. 216 if ( $invites ) { 217 $send = true; 218 } 219 return $send; 220 } 221 add_filter( 'bp_members_membership_requests_bypass_manual_approval', 'bp_members_invitations_maybe_bypass_request_approval', 10, 2 ); -
new file src/bp-members/bp-members-membership-requests.php
diff --git src/bp-members/bp-members-membership-requests.php src/bp-members/bp-members-membership-requests.php new file mode 100644 index 000000000..cc7bd0da3
- + 1 <?php 2 /** 3 * BuddyPress Membership Requests 4 * 5 * @package BuddyPress 6 * @subpackage MembersMembershipRequest 7 * @since 10.0.0 8 */ 9 10 // Exit if accessed directly. 11 defined( 'ABSPATH' ) || exit; 12 13 /** 14 * When a user creates a membership request, 15 * prevent the sending of the activation email so that 16 * the site admins can send it manually. 17 * 18 * @since 10.0.0 19 * 20 * @param bool $send Whether or not to send the activation key. 21 * @param int $user_id User ID to send activation key to. 22 * @param string $user_email User email to send activation key to. 23 * @param string $activation_key Activation key to be sent. 24 * @param array $usermeta Miscellaneous metadata about the user (blog-specific 25 * signup data, xprofile data, etc). 26 * @return bool Whether or not to send the activation key. 27 */ 28 function bp_members_membership_requests_cancel_activation_email( $send, $user_id = 0, $user_email = '', $activation_key = '', $usermeta = array() ) { 29 30 $details = array( 31 'user_id' => $user_id, 32 'user_email' => $user_email, 33 'activation_key' => $activation_key, 34 'usermeta' => $usermeta, 35 ); 36 37 /** 38 * Allow some membership requests to be approved immediately. 39 * For example, you might want to approve all requests 40 * coming from users with certain email address domains. 41 * If `true` is returned the activation email will be sent to the user. 42 * 43 * @since 10.0.0 44 * 45 * @param bool $send Whether or not this membership request should be approved 46 * immediately and the activation email sent. 47 * Default is `false` meaning that the request should be 48 * manually approved by a site admin. 49 * @param array $details The details of the request. 50 */ 51 $send = apply_filters( 'bp_members_membership_requests_bypass_manual_approval', false, $details ); 52 53 // If the registration process has been interrupted, this is a new membership request. 54 if ( ! $send ) { 55 $signup = bp_members_get_signup_by( 'activation_key', $activation_key ); 56 57 /** 58 * Fires when a site membership request has been created and is pending. 59 * 60 * @since 10.0.0 61 * 62 * @param BP_Signup $signup The signup object that has been created. 63 * @param array $details The details of the request. 64 */ 65 do_action( 'bp_members_membership_request_submitted', $signup, $details ); 66 } 67 68 return $send; 69 } 70 add_filter( 'bp_core_signup_send_activation_key', 'bp_members_membership_requests_cancel_activation_email', 10, 5 ); 71 72 73 /** 74 * Notifications 75 *********************************************************************/ 76 77 /** 78 * Notify site admins about a new membership request. 79 * 80 * @since 10.0.0 81 * 82 * @param BP_Signup $signup The signup object that has been created. 83 */ 84 function bp_members_membership_requests_notify_site_admins( $signup ) { 85 86 // Notify all site admins so the request can be handled. 87 $admins_query = new WP_User_Query( array( 88 'role' => 'administrator', 89 'fields' => 'ids' 90 ) ); 91 $admin_ids = $admins_query->get_results(); 92 93 foreach ( $admin_ids as $admin_id ) { 94 // Trigger a BuddyPress Notification. 95 if ( bp_is_active( 'notifications' ) ) { 96 bp_notifications_add_notification( array( 97 'user_id' => $admin_id, 98 'item_id' => $signup->signup_id, 99 'component_name' => buddypress()->members->id, 100 'component_action' => 'membership_request_submitted', 101 'date_notified' => bp_core_current_time(), 102 'is_new' => 1, 103 ) ); 104 } 105 106 // Bail if member opted out of receiving this email. 107 if ( 'no' === bp_get_user_meta( $admin_id, 'notification_members_membership_request', true ) ) { 108 return; 109 } 110 111 $unsubscribe_args = array( 112 'user_id' => $admin_id, 113 'notification_type' => 'members-membership-request', 114 ); 115 $manage_url = add_query_arg( array( 116 'mod_req' => 1, 117 'page' => 'bp-signups', 118 'signup_id' => $signup->signup_id, 119 'action' => 'resend', 120 ), bp_get_admin_url( 'users.php' ) ); 121 $args = array( 122 'tokens' => array( 123 'admin.id' => $admin_id, 124 'manage.url' => esc_url_raw( $manage_url ), 125 'requesting-user.user_login' => esc_html( $signup->user_login ), 126 'unsubscribe' => esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) ), 127 ), 128 ); 129 bp_send_email( 'members-membership-request', (int) $admin_id, $args ); 130 } 131 132 } 133 add_action( 'bp_members_membership_request_submitted', 'bp_members_membership_requests_notify_site_admins' ); 134 135 /** 136 * Send a message to the requesting user when his or her 137 * site membership request has been rejected. 138 * 139 * @since 10.0.0 140 * 141 * @param array $signup_ids Array of pending IDs to delete. 142 */ 143 function bp_members_membership_requests_send_rejection_mail( $signup_ids ) { 144 $signups = BP_Signup::get( 145 array( 146 'include' => $signup_ids, 147 ) 148 ); 149 if ( empty( $signups['signups'] ) ) { 150 return; 151 } 152 foreach ( $signups['signups'] as $signup ) { 153 if ( ! empty( $signup->user_email ) ) { 154 bp_send_email( 'members-membership-request-rejected', $signup->user_email ); 155 } 156 } 157 } 158 add_action( 'bp_core_signup_before_delete', 'bp_members_membership_requests_send_rejection_mail' ); 159 160 /** 161 * When a request is approved, activated or deleted, 162 * delete the associated notifications. 163 * 164 * @since 10.0.0 165 * 166 * @param array $signup_ids Array of changing signup IDs. 167 */ 168 function bp_members_membership_requests_delete_notifications_on_change( $signup_ids ) { 169 foreach ( $signup_ids as $signup_id ) { 170 BP_Notifications_Notification::delete( 171 array( 172 'item_id' => $signup_id, 173 'component_action' => 'membership_request_submitted', 174 ) 175 ); 176 } 177 } 178 add_action( 'bp_core_signup_after_resend', 'bp_members_membership_requests_delete_notifications_on_change' ); 179 add_action( 'bp_core_signup_after_activate', 'bp_members_membership_requests_delete_notifications_on_change' ); 180 add_action( 'bp_core_signup_after_delete', 'bp_members_membership_requests_delete_notifications_on_change' ); 181 182 /** 183 * In the Nouveau template pack, when membership requests are required, 184 * change registration form submit button label to "Submit Request". 185 * 186 * @since 10.0.0 187 * 188 * @return string $retval the HTML for the request membership link. 189 */ 190 function bp_members_membership_requests_filter_complete_signup_button( $buttons ) { 191 192 $buttons['register']['attributes']['value'] = __( 'Submit Request', 'buddypress' ); 193 return $buttons; 194 } 195 add_filter( 'bp_nouveau_get_submit_button', 'bp_members_membership_requests_filter_complete_signup_button' ); 196 197 198 /** 199 * Administration: Change certain behavior and labels 200 * on the WP Admin > Users > Manage Signups screen. 201 *********************************************************************/ 202 203 /** 204 * Filter the actions available on the signups list table. 205 * 206 * @since 10.0.0 207 * 208 * @param array $actions Array of actions and corresponding links. 209 * @param object $signup_object The signup data object. 210 */ 211 function bp_members_membership_requests_filter_signup_row_actions( $actions, $signup_object ) { 212 213 // Rename the "email" resend option when membership requests are active. 214 $email_link = add_query_arg( 215 array( 216 'page' => 'bp-signups', 217 'signup_id' => $signup_object->id, 218 'action' => 'resend', 219 ), 220 bp_get_admin_url( 'users.php' ) 221 ); 222 223 $resend_label = ( 0 === $signup_object->count_sent ) ? __( 'Approve Request', 'buddypress' ) : __( 'Resend Approval', 'buddypress' ); 224 225 $actions['resend'] = sprintf( '<a href="%1$s">%2$s</a>', esc_url( $email_link ), $resend_label ); 226 227 return $actions; 228 //@TODO add help to manage signups screen: 229 // Activate will activate the user immediately without requiring that they validate their email. 230 // Approve Request will send the user an activation email, so they will still need to take action. This also will check that the user's email address is valid. 231 } 232 add_filter( 'bp_members_ms_signup_row_actions', 'bp_members_membership_requests_filter_signup_row_actions', 10, 2 ); 233 234 /** 235 * Filter the bulk actions available on the signups list table. 236 * 237 * @since 10.0.0 238 * 239 * @param array $actions Array of actions and corresponding links. 240 */ 241 function bp_members_membership_requests_filter_signup_bulk_actions( $actions ) { 242 // Rename the "email" resend option when membership requests are active. 243 $actions['resend'] = _x( 'Approve', 'Pending signup action', 'buddypress' ); 244 return $actions; 245 } 246 add_filter( 'bp_members_ms_signup_bulk_actions', 'bp_members_membership_requests_filter_signup_bulk_actions' ); 247 248 /** 249 * Filter the "Last Sent" column header on the pending users table. 250 * 251 * @since 10.0.0 252 * 253 * @param array $value Array of columns to display. 254 */ 255 function bp_members_membership_requests_filter_signup_table_date_sent_header( $columns ) { 256 $columns['date_sent'] = __( 'Approved', 'buddypress' ); 257 return $columns; 258 } 259 add_filter( 'bp_members_signup_columns', 'bp_members_membership_requests_filter_signup_table_date_sent_header' ); 260 add_filter( 'bp_members_ms_signup_columns', 'bp_members_membership_requests_filter_signup_table_date_sent_header' ); 261 262 /** 263 * Filter the "Last Sent" column message on the pending users table. 264 * 265 * @since 10.0.0 266 * 267 * @param string $message "Not yet sent" message. 268 * @param object|null $signup Signup object instance. 269 */ 270 function bp_members_membership_requests_filter_signup_table_unsent_message( $message, $signup ) { 271 if ( 0 === $signup->count_sent ) { 272 $message = __( 'Not yet approved', 'buddypress' ); 273 } 274 return $message; 275 } 276 add_filter( 'bp_members_signup_date_sent_unsent_message', 'bp_members_membership_requests_filter_signup_table_unsent_message', 10, 2 ); 277 add_filter( 'bp_members_ms_signup_date_sent_unsent_message', 'bp_members_membership_requests_filter_signup_table_unsent_message', 10, 2 ); 278 279 /** 280 * Filter/add "Request Membership" links in the following locations: 281 * BP login widget 282 * sidebar register link 283 * WP Toolbar 284 * WP login form 285 *********************************************************************/ 286 287 /** 288 * Add "Request Membership" link to Widget login form. 289 * 290 * @since 10.0.0 291 * 292 * @return string $retval the HTML for the request membership link. 293 */ 294 function bp_members_membership_requests_add_link_to_widget_login_form() { 295 ?> 296 <span class="bp-login-widget-request-membership-link"><a href="<?php echo esc_url( bp_get_signup_page() ); ?>"><?php esc_html_e( 'Request Membership', 'buddypress' ); ?></a></span> 297 <?php 298 } 299 add_action( 'bp_login_widget_form', 'bp_members_membership_requests_add_link_to_widget_login_form' ); 300 301 /** 302 * Filter the "Register" link from `wp_register()` as used in 303 * `sidebar.php` and the WP Core meta widget. 304 * 305 * @since 10.0.0 306 * 307 * @param string $link The HTML code for the link to the Registration or Admin page. 308 */ 309 function bp_members_membership_requests_filter_sidebar_register_link( $link ) { 310 // $link should be an empty string when public registration is disabled. 311 if ( ! is_user_logged_in() && empty( $link ) ) { 312 // @TODO: How can we know what before and after tags should be? 313 $link = '<li><a href="' . esc_url( wp_registration_url() ) . '">' . __( 'Request Membership' ) . '</a><li>'; 314 } 315 return $link; 316 } 317 add_filter( 'register', 'bp_members_membership_requests_filter_sidebar_register_link' ); 318 319 /** 320 * Add a "Request Membership" link to the WP Toolbar. 321 * Priority 21 should place it just after the "Log In" link. 322 * 323 * @since 10.0.0 324 * 325 * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference 326 */ 327 function bp_members_membership_requests_add_toolbar_link( $wp_admin_bar ) { 328 if ( is_user_logged_in() ) { 329 return; 330 } 331 332 $args = array( 333 'id' => 'bp-request-membership', 334 'title' => __( 'Request Membership' ), 335 'href' => wp_registration_url(), 336 'meta' => array( 337 'class' => 'buddypress-request-membership', 338 'title' => __( 'Request Membership' ) 339 ), 340 ); 341 $wp_admin_bar->add_node( $args ); 342 } 343 add_action( 'admin_bar_menu', 'bp_members_membership_requests_add_toolbar_link', 21 ); 344 345 /** 346 * Add a "Request Membership" link to the WP Login form. 347 * 348 * @since 10.0.0 349 * 350 * @param string $link HTML link to the home URL of the current site. 351 */ 352 function bp_members_membership_requests_add_link_wp_login( $link ) { 353 return $link . ' | ' . '<a href="' . esc_url( wp_registration_url() ) . '">' . __( 'Request Membership' ) . '</a>'; 354 } 355 add_action( 'login_site_html_link', 'bp_members_membership_requests_add_link_wp_login' ); -
new file src/bp-members/bp-members-membership-requests.php.rej
diff --git src/bp-members/bp-members-membership-requests.php.rej src/bp-members/bp-members-membership-requests.php.rej new file mode 100644 index 000000000..133644cdd
- + 1 *************** 2 *** 0 **** 3 --- 1,174 ---- 4 + <?php 5 + /** 6 + * BuddyPress Membership Requests 7 + * 8 + * @package BuddyPress 9 + * @subpackage MembersMembershipRequest 10 + * @since 10.0.0 11 + */ 12 + 13 + // Exit if accessed directly. 14 + defined( 'ABSPATH' ) || exit; 15 + 16 + /** 17 + * When a user creates a network membership request, 18 + * prevent the sending of the activation email so that 19 + * the site admins can send it later. 20 + * 21 + * @since 10.0.0 22 + * 23 + * @param bool $send Whether or not to send the activation key. 24 + * @param int $user_id User ID to send activation key to. 25 + * @param string $user_email User email to send activation key to. 26 + * @param string $activation_key Activation key to be sent. 27 + * @param array $usermeta Miscellaneous metadata about the user (blog-specific 28 + * signup data, xprofile data, etc). 29 + * @return bool Whether or not to send the activation key. 30 + */ 31 + function bp_members_membership_requests_cancel_activation_email( $send, $user_id = 0, $user_email = '', $activation_key = '', $usermeta = array() ) { 32 + 33 + if ( bp_get_membership_requests_required() ) { 34 + $details = array( 35 + 'user_id' => $user_id, 36 + 'user_email' => $user_email, 37 + 'activation_key' => $activation_key, 38 + 'usermeta' => $usermeta, 39 + ); 40 + 41 + /** 42 + * Allow some membership requests to be approved immediately. 43 + * For example, you might want to approve all requests 44 + * coming from users with certain email address domains. 45 + * If `true` is returned the activation email will be sent to the user. 46 + * 47 + * @since 10.0.0 48 + * 49 + * @param bool $send Whether or not this membership request should be approved 50 + * immediately and the activation email sent. 51 + * Default is `false` meaning that the request should be 52 + * manually approved by a site admin. 53 + * @param array $details The details of the request. 54 + */ 55 + $send = apply_filters( 'bp_members_membership_requests_bypass_manual_approval', false, $details ); 56 + 57 + // If the registration process has been interrupted, this is a new membership request. 58 + if ( ! $send ) { 59 + $signup = bp_members_get_signup_by( 'activation_key', $activation_key ); 60 + 61 + /** 62 + * Fires when a site membership request has been created and is pending. 63 + * 64 + * @since 10.0.0 65 + * 66 + * @param BP_Signup $signup The signup object that has been created. 67 + * @param array $details The details of the request. 68 + */ 69 + do_action( 'bp_members_membership_request_submitted', $signup, $details ); 70 + } 71 + } 72 + 73 + return $send; 74 + } 75 + add_filter( 'bp_core_signup_send_activation_key', 'bp_members_membership_requests_cancel_activation_email', 10, 5 ); 76 + 77 + 78 + /** 79 + * Notify site admins about a new membership request. 80 + * 81 + * @since 10.0.0 82 + * 83 + * @param BP_Signup $signup The signup object that has been created. 84 + */ 85 + function bp_members_membership_requests_notify_site_admins( $signup ) { 86 + // Why not just using get_option( 'admin_email' ) ? 87 + $admin_ids = get_users( 88 + array( 89 + 'fields' => 'ids', 90 + 'role' => 'administrator', 91 + ) 92 + ); 93 + 94 + foreach ( $admin_ids as $admin_id ) { 95 + // Trigger a BuddyPress Notification. 96 + if ( bp_is_active( 'notifications' ) ) { 97 + bp_notifications_add_notification( 98 + array( 99 + 'user_id' => $admin_id, 100 + 'item_id' => $signup->signup_id, 101 + 'component_name' => buddypress()->members->id, 102 + 'component_action' => 'membership_request_submitted', 103 + 'date_notified' => bp_core_current_time(), 104 + 'is_new' => 1, 105 + ) 106 + ); 107 + } 108 + 109 + // Bail if member opted out of receiving this email. 110 + if ( 'no' === bp_get_user_meta( $admin_id, 'notification_members_membership_request', true ) ) { 111 + return; 112 + } 113 + 114 + $unsubscribe_args = array( 115 + 'user_id' => $admin_id, 116 + 'notification_type' => 'members-membership-request', 117 + ); 118 + 119 + $manage_url = add_query_arg( 120 + array( 121 + 'mod_req' => 1, 122 + 'page' => 'bp-signups', 123 + 'signup_id' => $signup->signup_id, 124 + 'action' => 'resend', 125 + ), 126 + bp_get_admin_url( 'users.php' ) 127 + ); 128 + 129 + $args = array( 130 + 'tokens' => array( 131 + 'admin.id' => $admin_id, 132 + 'manage.url' => esc_url_raw( $manage_url ), 133 + 'requesting-user.user_login' => esc_html( $signup->user_login ), 134 + 'unsubscribe' => esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) ), 135 + ), 136 + ); 137 + 138 + bp_send_email( 'members-membership-request', (int) $admin_id, $args ); 139 + } 140 + } 141 + add_action( 'bp_members_membership_request_submitted', 'bp_members_membership_requests_notify_site_admins' ); 142 + 143 + /** 144 + * Add "Request Membership" link to Widget login form. 145 + * 146 + * @since 10.0.0 147 + * 148 + * @return string $retval the HTML for the request membership link. 149 + */ 150 + function bp_members_membership_requests_add_link_to_widget_login_form() { 151 + if ( ! bp_get_membership_requests_required() ) { 152 + return; 153 + } 154 + ?> 155 + <span class="bp-login-widget-request-membership-link"> 156 + <a href="<?php echo esc_url( bp_get_signup_page() ); ?>"><?php esc_html_e( 'Request Membership', 'buddypress' ); ?></a> 157 + </span> 158 + <?php 159 + } 160 + add_action( 'bp_login_widget_form', 'bp_members_membership_requests_add_link_to_widget_login_form' ); 161 + 162 + /** 163 + * In the Nouveau template pack, when membership requests are required, 164 + * change registration form submit button label to "Submit Request". 165 + * 166 + * @since 10.0.0 167 + * 168 + * @return string $retval the HTML for the request membership link. 169 + */ 170 + function bp_members_membership_requests_filter_complete_signup_button( $buttons ) { 171 + if ( bp_get_membership_requests_required() ) { 172 + $buttons['register']['attributes']['value'] = __( 'Submit Request', 'buddypress' ); 173 + } 174 + 175 + return $buttons; 176 + } 177 + add_filter( 'bp_nouveau_get_submit_button', 'bp_members_membership_requests_filter_complete_signup_button' ); -
src/bp-members/bp-members-notifications.php
diff --git src/bp-members/bp-members-notifications.php src/bp-members/bp-members-notifications.php index 93cee7b89..34c2677e9 100644
function members_format_notifications( $action, $item_id, $secondary_item_id, $t 61 61 } 62 62 } 63 63 break; 64 65 case 'membership_request_submitted': 66 // $item_id is the id of the signup, not the user ID. 67 $signup = new BP_Signup( $item_id ); 68 69 // Set up the string and the filter. 70 if ( (int) $total_items > 1 ) { 71 $link = bp_get_notifications_permalink(); 72 $amount = 'multiple'; 73 74 $text = sprintf( __( '%d people have requested site membership.', 'buddypress' ), (int) $total_items ); 75 } else { 76 $link = add_query_arg( array( 77 'mod_req' => 1, 78 'page' => 'bp-signups', 79 'signup_id' => $item_id, 80 'action' => 'resend', 81 ), bp_get_admin_url( 'users.php' ) ); 82 $amount = 'single'; 83 84 /* translators: %s: new user name */ 85 $text = sprintf( __( '%s has requested site membership.', 'buddypress' ), esc_html( $signup->user_login ) ); 86 } 87 break; 64 88 } 65 89 66 90 // Return either an HTML link or an array, depending on the requested format. … … function bp_members_mark_read_accepted_invitation_notification() { 167 191 'is_new' => false, 168 192 ), 169 193 array( 170 'user_id' => bp_loggedin_user_id(), 171 'item_id' => bp_displayed_user_id(), 194 'user_id' => bp_loggedin_user_id(), 195 'item_id' => bp_displayed_user_id(), 196 'component_action' => 'accepted_invitation', 172 197 ) 173 198 ); 174 199 } 175 200 add_action( 'bp_screens', 'bp_members_mark_read_accepted_invitation_notification' ); 176 201 202 /** 203 * Mark new membership request notifications as read when user visits Manage BP Signups screen. 204 * 205 * @since 10.0.0 206 */ 207 function bp_members_mark_read_submitted_membership_request_notification() { 208 if ( ! wp_doing_ajax() && 'users_page_bp-signups' === get_current_screen()->base && ! empty( $_GET['mod_req'] ) && ! empty( $_GET['signup_id'] ) ) { 209 // Mark all notifications about this request as read. 210 BP_Notifications_Notification::update( 211 array( 212 'is_new' => false, 213 ), 214 array( 215 'item_id' => $_GET['signup_id'], 216 'component_action' => 'membership_request_submitted', 217 ) 218 ); 219 } 220 } 221 add_action( 'admin_footer', 'bp_members_mark_read_submitted_membership_request_notification' ); 222 177 223 /** 178 224 * Add Members-related settings to the Settings > Notifications page. 179 225 * … … add_action( 'bp_screens', 'bp_members_mark_read_accepted_invitation_notification 181 227 */ 182 228 function members_screen_notification_settings() { 183 229 184 // Bail early if invitations a re not allowed--they are the only members notification so far.185 if ( ! bp_get_members_invitations_allowed () ) {230 // Bail early if invitations and requests are not allowed--they are the only members notification so far. 231 if ( ! bp_get_members_invitations_allowed() && ( ! bp_get_membership_requests_required() || ! user_can( bp_displayed_user_id(), 'bp_moderate' ) ) ) { 186 232 return; 187 233 } 188 189 if ( ! $allow_acceptance_emails = bp_get_user_meta( bp_displayed_user_id(), 'notification_members_invitation_accepted', true ) ) {190 $allow_acceptance_emails = 'yes';191 }192 234 ?> 193 235 194 236 <table class="notification-settings" id="members-notification-settings"> … … function members_screen_notification_settings() { 202 244 </thead> 203 245 204 246 <tbody> 205 <tr id="members-notification-settings-invitation_accepted">206 <td></td>207 <td><?php _ex( 'Someone accepts your membership invitation', 'Member settings on notification settings page', 'buddypress' ) ?></td>208 <td class="yes"><input type="radio" name="notifications[notification_members_invitation_accepted]" id="notification-members-invitation-accepted-yes" value="yes" <?php checked( $allow_acceptance_emails, 'yes', true ) ?>/><label for="notification-members-invitation-accepted-yes" class="bp-screen-reader-text"><?php209 /* translators: accessibility text */210 _e( 'Yes, send email', 'buddypress' );211 ?></label></td>212 <td class="no"><input type="radio" name="notifications[notification_members_invitation_accepted]" id="notification-members-invitation-accepted-no" value="no" <?php checked( $allow_acceptance_emails, 'no', true ) ?>/><label for="notification-members-invitation-accepted-no" class="bp-screen-reader-text"><?php213 /* translators: accessibility text */214 _e( 'No, do not send email', 'buddypress' );215 ?></label></td>216 </tr>217 247 218 248 <?php 249 if ( bp_get_members_invitations_allowed() ) : 250 if ( ! $allow_acceptance_emails = bp_get_user_meta( bp_displayed_user_id(), 'notification_members_invitation_accepted', true ) ) { 251 $allow_acceptance_emails = 'yes'; 252 } 253 ?> 254 <tr id="members-notification-settings-invitation_accepted"> 255 <td></td> 256 <td><?php echo esc_html_x( 'Someone accepts your membership invitation', 'Member settings on notification settings page', 'buddypress' ); ?></td> 257 <td class="yes"><input type="radio" name="notifications[notification_members_invitation_accepted]" id="notification-members-invitation-accepted-yes" value="yes" <?php checked( $allow_acceptance_emails, 'yes', true ) ?>/><label for="notification-members-invitation-accepted-yes" class="bp-screen-reader-text"><?php 258 /* translators: accessibility text */ 259 esc_html_e( 'Yes, send email', 'buddypress' ); 260 ?></label></td> 261 <td class="no"><input type="radio" name="notifications[notification_members_invitation_accepted]" id="notification-members-invitation-accepted-no" value="no" <?php checked( $allow_acceptance_emails, 'no', true ) ?>/><label for="notification-members-invitation-accepted-no" class="bp-screen-reader-text"><?php 262 /* translators: accessibility text */ 263 esc_html_e( 'No, do not send email', 'buddypress' ); 264 ?></label></td> 265 </tr> 266 <?php 267 endif; 268 269 if ( bp_get_membership_requests_required() && user_can( bp_displayed_user_id(), 'bp_moderate' ) ) : 270 if ( ! $allow_request_emails = bp_get_user_meta( bp_displayed_user_id(), 'notification_members_membership_request', true ) ) { 271 $allow_request_emails = 'yes'; 272 } 273 ?> 274 <tr id="members-notification-settings-submitted_membership_request"> 275 <td></td> 276 <td><?php echo esc_html_x( 'Someone has requested site membership', 'Member settings on notification settings page', 'buddypress' ) ?></td> 277 <td class="yes"><input type="radio" name="notifications[notification_members_membership_request]" id="notification-members-submitted_membership_request-yes" value="yes" <?php checked( $allow_request_emails, 'yes', true ) ?>/><label for="notification-members-submitted_membership_request-yes" class="bp-screen-reader-text"><?php 278 /* translators: accessibility text */ 279 esc_html_e( 'Yes, send email', 'buddypress' ); 280 ?></label></td> 281 <td class="no"><input type="radio" name="notifications[notification_members_membership_request]" id="notification-members-submitted_membership_request-no" value="no" <?php checked( $allow_request_emails, 'no', true ) ?>/><label for="notification-members-submitted_membership_request-no" class="bp-screen-reader-text"><?php 282 /* translators: accessibility text */ 283 esc_html_e( 'No, do not send email', 'buddypress' ); 284 ?></label></td> 285 </tr> 286 <?php 287 endif; 219 288 220 289 /** 221 290 * Fires after the last table row on the members notification screen. -
src/bp-members/bp-members-template.php
diff --git src/bp-members/bp-members-template.php src/bp-members/bp-members-template.php index 39cfd6e65..0cf357023 100644
function bp_get_members_invitations_allowed() { 2925 2925 return apply_filters( 'bp_get_members_invitations_allowed', bp_is_active( 'members', 'invitations' ) && (bool) bp_get_option( 'bp-enable-members-invitations' ) ); 2926 2926 } 2927 2927 2928 /** 2929 * Are membership requests required for joining this site? 2930 * 2931 * @since 10.0.0 2932 * 2933 * @param bool $context "raw" to fetch value from database, 2934 * "site" to take "anyone can register" setting into account. 2935 * @return bool 2936 */ 2937 function bp_get_membership_requests_required( $context = 'site' ) { 2938 if ( 'raw' === $context ) { 2939 $retval = bp_is_active( 'members', 'membership_requests' ) && (bool) bp_get_option( 'bp-enable-membership-requests' ); 2940 } else { 2941 $retval = bp_is_active( 'members', 'membership_requests' ) && ! bp_get_signup_allowed() && (bool) bp_get_option( 'bp-enable-membership-requests' ); 2942 } 2943 2944 /** 2945 * Filters whether or not prospective members may submit network membership requests. 2946 * 2947 * @since 10.0.0 2948 * 2949 * @param bool $retval Whether or not membership requests are required. 2950 * @param bool $retval Whether this is the value stored in the database ('raw') 2951 * or whether the site's "anyone can register" setting is 2952 * being considered ('site' or anything else). 2953 */ 2954 return apply_filters( 'bp_get_membership_requests_required', $retval, $context ); 2955 } 2956 2928 2957 /** 2929 2958 * Should the system create and allow access 2930 2959 * to the Register and Activate pages? … … function bp_get_members_invitations_allowed() { 2934 2963 * @return bool 2935 2964 */ 2936 2965 function bp_allow_access_to_registration_pages() { 2937 $retval = bp_get_signup_allowed() || bp_get_members_invitations_allowed() ;2966 $retval = bp_get_signup_allowed() || bp_get_members_invitations_allowed() || bp_get_membership_requests_required(); 2938 2967 2939 2968 /** 2940 2969 * Filters whether or not the system should create and allow access -
src/bp-members/classes/class-bp-members-admin.php
diff --git src/bp-members/classes/class-bp-members-admin.php src/bp-members/classes/class-bp-members-admin.php index 19ec1946b..c2e5fc9cf 100644
class BP_Members_Admin { 501 501 // Only show sign-ups where they belong. 502 502 if ( ( ! bp_is_network_activated() && ! is_network_admin() ) || ( is_network_admin() && bp_is_network_activated() ) ) { 503 503 504 $signups_menu_label = __( 'Manage Signups', 'buddypress' ); 505 506 if ( bp_get_membership_requests_required() ) { 507 $signups_menu_label = __( 'Manage Pending Memberships', 'buddypress' ); 508 } 509 504 510 // Manage signups. 505 511 $hooks['signups'] = $this->signups_page = add_users_page( 506 __( 'Manage Signups', 'buddypress' ),507 __( 'Manage Signups', 'buddypress' ),512 $signups_menu_label, 513 $signups_menu_label, 508 514 $this->capability, 509 515 'bp-signups', 510 516 array( $this, 'signups_admin' ) … … class BP_Members_Admin { 2186 2192 ) ); 2187 2193 2188 2194 $signups = $signups_query['signups']; 2189 $signup_ids = wp_list_pluck( $signups, ' signup_id' );2195 $signup_ids = wp_list_pluck( $signups, 'id' ); 2190 2196 2191 2197 // Set up strings. 2192 2198 switch ( $action ) { … … class BP_Members_Admin { 2209 2215 break; 2210 2216 2211 2217 case 'resend' : 2212 $header_text = __( 'Resend Activation Emails', 'buddypress' ); 2213 if ( 1 == count( $signup_ids ) ) { 2214 $helper_text = __( 'You are about to resend an activation email to the following account:', 'buddypress' ); 2218 2219 if ( bp_get_membership_requests_required() ) { 2220 $header_text = __( 'Approve Membership Requests', 'buddypress' ); 2221 if ( 1 === count( $signup_ids ) ) { 2222 $helper_text = __( 'You are about to send an approval email to the following user:', 'buddypress' ); 2223 } else { 2224 $helper_text = __( 'You are about to send approval emails to the following users:', 'buddypress' ); 2225 } 2215 2226 } else { 2216 $helper_text = __( 'You are about to resend an activation email to the following accounts:', 'buddypress' ); 2227 $header_text = __( 'Resend Activation Emails', 'buddypress' ); 2228 if ( 1 === count( $signup_ids ) ) { 2229 $helper_text = __( 'You are about to resend an activation email to the following account:', 'buddypress' ); 2230 } else { 2231 $helper_text = __( 'You are about to resend an activation email to the following accounts:', 'buddypress' ); 2232 } 2217 2233 } 2218 2234 break; 2235 2219 2236 } 2220 2237 2221 2238 // These arguments are added to all URLs. … … class BP_Members_Admin { 2244 2261 2245 2262 // Prefetch registration field data. 2246 2263 $fdata = array(); 2247 if ( 'activate' === $action && bp_is_active( 'xprofile') ) {2264 if ( bp_is_active( 'xprofile' ) && ( 'activate' == $action || ( 'resend' == $action && bp_get_membership_requests_required() ) ) ) { 2248 2265 $field_groups = bp_xprofile_get_groups( array( 2249 2266 'exclude_fields' => 1, 2250 2267 'update_meta_cache' => false, … … class BP_Members_Admin { 2268 2285 2269 2286 <ol class="bp-signups-list"> 2270 2287 <?php foreach ( $signups as $signup ) : 2271 $last_notified = mysql2date( 'Y/m/d g:i:s a', $signup->date_sent ); 2288 if ( $signup->count_sent > 0 ) { 2289 $last_notified = mysql2date( 'Y/m/d g:i:s a', $signup->date_sent ); 2290 } else { 2291 $last_notified = __( 'Not yet notified', 'buddypress' ); 2292 } 2272 2293 $profile_field_ids = array(); 2273 2294 2274 2295 // Get all xprofile field IDs except field 1. … … class BP_Members_Admin { 2280 2301 <li> 2281 2302 <strong><?php echo esc_html( $signup->user_login ) ?></strong> 2282 2303 2283 <?php if ( 'activate' == $action ) : ?>2304 <?php if ( 'activate' == $action || ( 'resend' == $action && bp_get_membership_requests_required() ) ) : ?> 2284 2305 <table class="wp-list-table widefat fixed striped"> 2285 2306 <tbody> 2286 2307 <tr> -
src/bp-members/classes/class-bp-members-component.php
diff --git src/bp-members/classes/class-bp-members-component.php src/bp-members/classes/class-bp-members-component.php index 432e3ecce..e247fa54b 100644
class BP_Members_Component extends BP_Component { 40 40 array( 41 41 'adminbar_myaccount_order' => 20, 42 42 'search_query_arg' => 'members_search', 43 'features' => array( 'invitations' )43 'features' => array( 'invitations', 'membership_requests' ) 44 44 ) 45 45 ); 46 46 } … … class BP_Members_Component extends BP_Component { 74 74 $includes[] = 'activity'; 75 75 } 76 76 77 if ( bp_is_active( 'members', 'membership_requests' ) && (bool) bp_get_option( 'bp-enable-membership-requests' ) ) { 78 $includes[] = 'membership-requests'; 79 } 80 77 81 // Include these only if in admin. 78 82 if ( is_admin() ) { 79 83 $includes[] = 'admin'; -
src/bp-members/classes/class-bp-members-list-table.php
diff --git src/bp-members/classes/class-bp-members-list-table.php src/bp-members/classes/class-bp-members-list-table.php index 8e7733b47..feb9b4668 100644
class BP_Members_List_Table extends WP_Users_List_Table { 113 113 114 114 // Reset the screen id. 115 115 $this->screen->id = $reset_screen_id; 116 117 // Use thickbox to display the extended profile information. 118 if ( bp_is_active( 'xprofile' ) ) { 119 add_thickbox(); 120 } 116 121 } 117 122 118 123 /** … … class BP_Members_List_Table extends WP_Users_List_Table { 138 143 */ 139 144 public function get_columns() { 140 145 141 /** 142 * Filters the single site Members signup columns. 143 * 144 * @since 2.0.0 145 * 146 * @param array $value Array of columns to display. 147 */ 148 return apply_filters( 'bp_members_signup_columns', array( 146 $columns = array( 149 147 'cb' => '<input type="checkbox" />', 150 148 'username' => __( 'Username', 'buddypress' ), 151 149 'name' => __( 'Name', 'buddypress' ), … … class BP_Members_List_Table extends WP_Users_List_Table { 153 151 'registered' => __( 'Registered', 'buddypress' ), 154 152 'date_sent' => __( 'Last Sent', 'buddypress' ), 155 153 'count_sent' => __( 'Emails Sent', 'buddypress' ) 156 ) ); 154 ); 155 156 if ( bp_is_active( 'xprofile' ) ) { 157 $profile_entry = array( 158 'extended_profile' => __( 'Profile Info', 'buddypress' ) 159 ); 160 $position = 4; 161 $columns = array_merge( 162 array_slice( $columns, 0, $position, true ), 163 $profile_entry, 164 array_slice( $columns, $position, count( $columns ) - 1, true ) 165 ); 166 167 } 168 169 /** 170 * Filters the single site Members signup columns. 171 * 172 * @since 2.0.0 173 * 174 * @param array $value Array of columns to display. 175 */ 176 return apply_filters( 'bp_members_signup_columns', $columns ); 157 177 } 158 178 159 179 /** … … class BP_Members_List_Table extends WP_Users_List_Table { 171 191 $actions['delete'] = __( 'Delete', 'buddypress' ); 172 192 } 173 193 174 return $actions; 194 /** 195 * Filters the bulk actions for signups. 196 * 197 * @since 10.0.0 198 * 199 * @param array $actions Array of actions and corresponding labels. 200 */ 201 return apply_filters( 'bp_members_ms_signup_bulk_actions', $actions ); 175 202 } 176 203 177 204 /** … … class BP_Members_List_Table extends WP_Users_List_Table { 183 210 */ 184 211 public function no_items() { 185 212 186 if ( bp_get_signup_allowed() ) {213 if ( bp_get_signup_allowed() || bp_get_membership_requests_required() ) { 187 214 esc_html_e( 'No pending accounts found.', 'buddypress' ); 188 215 } else { 189 216 $link = false; … … class BP_Members_List_Table extends WP_Users_List_Table { 374 401 * @param object|null $signup_object The signup data object. 375 402 */ 376 403 public function column_date_sent( $signup_object = null ) { 377 echo mysql2date( 'Y/m/d', $signup_object->date_sent ); 404 if ( $signup_object->count_sent > 0 ) { 405 echo mysql2date( 'Y/m/d', $signup_object->date_sent ); 406 } else { 407 $message = __( 'Not yet notified', 'buddypress' ); 408 409 /** 410 * Filters the "not yet sent" message for "Last Sent" 411 * column in Manage Signups list table. 412 * 413 * @since 10.0.0 414 * 415 * @param string $message "Not yet sent" message. 416 * @param object|null $signup_object Signup object instance. 417 */ 418 $message = apply_filters( 'bp_members_signup_date_sent_unsent_message', $message, $signup_object ); 419 420 echo esc_html( $message ); 421 } 378 422 } 379 423 380 424 /** 381 * Display number of time an activation email has been sent.425 * Display number of times an activation email has been sent. 382 426 * 383 427 * @since 2.0.0 384 428 * … … class BP_Members_List_Table extends WP_Users_List_Table { 388 432 echo absint( $signup_object->count_sent ); 389 433 } 390 434 435 /** 436 * Display link to open a modal to show user's 437 * submitted extended profile information. 438 * 439 * @since 10.0.0 440 * 441 * @param object|null $signup_object The signup data object. 442 */ 443 public function column_extended_profile( $signup_object = null ) { 444 $profile_field_ids = array(); 445 446 // Prefetch registration field data. 447 $fdata = array(); 448 $field_groups = bp_xprofile_get_groups( array( 449 'exclude_fields' => 1, 450 'update_meta_cache' => false, 451 'fetch_fields' => true, 452 ) ); 453 454 foreach( $field_groups as $fg ) { 455 foreach( $fg->fields as $f ) { 456 $fdata[ $f->id ] = $f->name; 457 } 458 } 459 460 // Get all xprofile field IDs except field 1. 461 if ( ! empty( $signup_object->meta['profile_field_ids'] ) ) { 462 $profile_field_ids = array_flip( explode( ',', $signup_object->meta['profile_field_ids'] ) ); 463 unset( $profile_field_ids[1] ); 464 } 465 ?> 466 <a href="#TB_inline?&inlineId=signup-info-modal-<?php echo $signup_object->id; ?>" class="thickbox"><?php echo esc_html__( 'View', 'buddypress' ); ?></a> 467 468 <div id="signup-info-modal-<?php echo $signup_object->id; ?>" style="display:none;"> 469 <h1><?php printf( esc_html__( '%1$s (%2$s)', 'buddypress' ), esc_html( $signup_object->user_name ), esc_html( $signup_object->user_email ) ); ?></h1> 470 <h2><?php echo esc_html__( 'Extended Profile Information', 'buddypress' ); ?></h2> 471 472 <table class="signup-profile-data-drawer wp-list-table widefat fixed striped"> 473 <?php if ( 1 <= count( $profile_field_ids ) ): foreach ( $profile_field_ids as $pid => $noop ) : 474 $field_value = isset( $signup_object->meta[ "field_{$pid}" ] ) ? $signup_object->meta[ "field_{$pid}" ] : ''; ?> 475 <tr> 476 <td class="column-fields"><?php echo esc_html( $fdata[ $pid ] ); ?></td> 477 <td><?php echo $this->format_xprofile_field_for_display( $field_value ); ?></td> 478 </tr> 479 <?php endforeach;else: ?> 480 <tr> 481 <td><?php esc_html_e( 'There are no additional information to display.', 'buddypress' ); ?></td> 482 </tr> 483 <?php endif; ?> 484 </table> 485 </div> 486 <?php 487 } 488 391 489 /** 392 490 * Allow plugins to add their custom column. 393 491 * … … class BP_Members_List_Table extends WP_Users_List_Table { 409 507 */ 410 508 return apply_filters( 'bp_members_signup_custom_column', '', $column_name, $signup_object ); 411 509 } 510 511 /** 512 * Formats a signup's xprofile field data for display. 513 * 514 * Operates recursively on arrays, which are then imploded with commas. 515 * 516 * @since 10.0.0 517 * @see BP_Members_Admin::format_xprofile_field_for_display() 518 * 519 * @param string|array $value Field value. 520 * @return string 521 */ 522 protected function format_xprofile_field_for_display( $value ) { 523 if ( is_array( $value ) ) { 524 $value = array_map( array( $this, 'format_xprofile_field_for_display' ), $value ); 525 $value = implode( ', ', $value ); 526 } else { 527 $value = stripslashes( $value ); 528 $value = esc_html( $value ); 529 } 530 531 return $value; 532 } 412 533 } -
src/bp-members/classes/class-bp-members-ms-list-table.php
diff --git src/bp-members/classes/class-bp-members-ms-list-table.php src/bp-members/classes/class-bp-members-ms-list-table.php index b8e86f906..918748378 100644
class BP_Members_MS_List_Table extends WP_MS_Users_List_Table { 114 114 115 115 // Reset the screen id. 116 116 $this->screen->id = $reset_screen_id; 117 118 // Use thickbox to display the extended profile information. 119 if ( bp_is_active( 'xprofile' ) ) { 120 add_thickbox(); 121 } 117 122 } 118 123 119 124 /** … … class BP_Members_MS_List_Table extends WP_MS_Users_List_Table { 125 130 */ 126 131 public function get_columns() { 127 132 128 /** 129 * Filters the multisite Members signup columns. 130 * 131 * @since 2.0.0 132 * 133 * @param array $value Array of columns to display. 134 */ 135 return apply_filters( 'bp_members_ms_signup_columns', array( 133 $columns = array( 136 134 'cb' => '<input type="checkbox" />', 137 135 'username' => __( 'Username', 'buddypress' ), 138 136 'name' => __( 'Name', 'buddypress' ), … … class BP_Members_MS_List_Table extends WP_MS_Users_List_Table { 140 138 'registered' => __( 'Registered', 'buddypress' ), 141 139 'date_sent' => __( 'Last Sent', 'buddypress' ), 142 140 'count_sent' => __( 'Emails Sent', 'buddypress' ) 143 ) ); 141 ); 142 143 if ( bp_is_active( 'xprofile' ) ) { 144 $profile_entry = array( 145 'extended_profile' => __( 'Profile Info', 'buddypress' ) 146 ); 147 $position = 4; 148 $columns = array_merge( 149 array_slice( $columns, 0, $position, true ), 150 $profile_entry, 151 array_slice( $columns, $position, count( $columns ) - 1, true ) 152 ); 153 154 } 155 156 /** 157 * Filters the multisite Members signup columns. 158 * 159 * @since 2.0.0 160 * 161 * @param array $value Array of columns to display. 162 */ 163 return apply_filters( 'bp_members_ms_signup_columns', $columns ); 144 164 } 145 165 146 166 /** … … class BP_Members_MS_List_Table extends WP_MS_Users_List_Table { 158 178 $actions['delete'] = __( 'Delete', 'buddypress' ); 159 179 } 160 180 161 return $actions; 181 /** 182 * Filters the bulk actions for signups. 183 * 184 * @since 10.0.0 185 * 186 * @param array $actions Array of actions and corresponding labels. 187 */ 188 return apply_filters( 'bp_members_ms_signup_bulk_actions', $actions ); 162 189 } 163 190 164 191 /** … … class BP_Members_MS_List_Table extends WP_MS_Users_List_Table { 169 196 * @since 2.0.0 170 197 */ 171 198 public function no_items() { 172 if ( bp_get_signup_allowed() ) {199 if ( bp_get_signup_allowed() || bp_get_membership_requests_required() ) { 173 200 esc_html_e( 'No pending accounts found.', 'buddypress' ); 174 201 } else { 175 202 $link = false; … … class BP_Members_MS_List_Table extends WP_MS_Users_List_Table { 376 403 $date = 'Y/m/d \<\b\r \/\> g:i:s a'; 377 404 } 378 405 379 echo mysql2date( $date, $signup_object->date_sent ); 406 if ( $signup_object->count_sent > 0 ) { 407 echo mysql2date( $date, $signup_object->date_sent ); 408 } else { 409 $message = __( 'Not yet notified', 'buddypress' ); 410 411 /** 412 * Filters the "not yet sent" message for "Last Sent" 413 * column in Manage Signups list table. 414 * 415 * @since 10.0.0 416 * 417 * @param string $message "Not yet sent" message. 418 * @param object|null $signup_object Signup object instance. 419 */ 420 $message = apply_filters( 'bp_members_ms_signup_date_sent_unsent_message', $message, $signup_object ); 421 422 echo esc_html( $message ); 423 } 380 424 } 381 425 382 426 /** … … class BP_Members_MS_List_Table extends WP_MS_Users_List_Table { 390 434 echo absint( $signup_object->count_sent ); 391 435 } 392 436 437 /** 438 * Display link to open a modal to show user's 439 * submitted extended profile information. 440 * 441 * @since 10.0.0 442 * 443 * @param object|null $signup_object The signup data object. 444 */ 445 public function column_extended_profile( $signup_object = null ) { 446 $profile_field_ids = array(); 447 448 // Prefetch registration field data. 449 $fdata = array(); 450 $field_groups = bp_xprofile_get_groups( array( 451 'exclude_fields' => 1, 452 'update_meta_cache' => false, 453 'fetch_fields' => true, 454 ) ); 455 456 foreach( $field_groups as $fg ) { 457 foreach( $fg->fields as $f ) { 458 $fdata[ $f->id ] = $f->name; 459 } 460 } 461 462 // Get all xprofile field IDs except field 1. 463 if ( ! empty( $signup_object->meta['profile_field_ids'] ) ) { 464 $profile_field_ids = array_flip( explode( ',', $signup_object->meta['profile_field_ids'] ) ); 465 unset( $profile_field_ids[1] ); 466 } 467 ?> 468 <a href="#TB_inline?&inlineId=signup-info-modal-<?php echo $signup_object->id; ?>" class="thickbox"><?php echo esc_html__( 'View', 'buddypress' ); ?></a> 469 470 <div id="signup-info-modal-<?php echo $signup_object->id; ?>" style="display:none;"> 471 <h1><?php printf( esc_html__( '%1$s (%2$s)', 'buddypress' ), esc_html( $signup_object->user_name ), esc_html( $signup_object->user_email ) ); ?></h1> 472 <h2><?php echo esc_html__( 'Extended Profile Information', 'buddypress' ); ?></h2> 473 474 <table class="signup-profile-data-drawer wp-list-table widefat fixed striped"> 475 <?php if ( 1 <= count( $profile_field_ids ) ): foreach ( $profile_field_ids as $pid => $noop ) : 476 $field_value = isset( $signup_object->meta[ "field_{$pid}" ] ) ? $signup_object->meta[ "field_{$pid}" ] : ''; ?> 477 <tr> 478 <td class="column-fields"><?php echo esc_html( $fdata[ $pid ] ); ?></td> 479 <td><?php echo $this->format_xprofile_field_for_display( $field_value ); ?></td> 480 </tr> 481 <?php endforeach;else: ?> 482 <tr> 483 <td><?php esc_html_e( 'There are no additional information to display.', 'buddypress' ); ?></td> 484 </tr> 485 <?php endif; ?> 486 </table> 487 </div> 488 <?php 489 } 490 393 491 /** 394 492 * Allow plugins to add their custom column. 395 493 * … … class BP_Members_MS_List_Table extends WP_MS_Users_List_Table { 411 509 */ 412 510 return apply_filters( 'bp_members_ms_signup_custom_column', '', $column_name, $signup_object ); 413 511 } 512 513 /** 514 * Formats a signup's xprofile field data for display. 515 * 516 * Operates recursively on arrays, which are then imploded with commas. 517 * 518 * @since 10.0.0 519 * @see BP_Members_Admin::format_xprofile_field_for_display() 520 * 521 * @param string|array $value Field value. 522 * @return string 523 */ 524 protected function format_xprofile_field_for_display( $value ) { 525 if ( is_array( $value ) ) { 526 $value = array_map( array( $this, 'format_xprofile_field_for_display' ), $value ); 527 $value = implode( ', ', $value ); 528 } else { 529 $value = stripslashes( $value ); 530 $value = esc_html( $value ); 531 } 532 533 return $value; 534 } 414 535 } -
src/bp-members/classes/class-bp-registration-theme-compat.php
diff --git src/bp-members/classes/class-bp-registration-theme-compat.php src/bp-members/classes/class-bp-registration-theme-compat.php index 6a942a58b..f4e3e6855 100644
class BP_Registration_Theme_Compat { 97 97 public function dummy_post() { 98 98 // Registration page. 99 99 if ( bp_is_register_page() ) { 100 $title = __( 'Create an Account', 'buddypress' ); 100 if ( bp_get_membership_requests_required() ) { 101 $title = __( 'Request Membership', 'buddypress' ); 102 } else { 103 $title = __( 'Create an Account', 'buddypress' ); 104 } 101 105 102 106 if ( 'completed-confirmation' == bp_get_current_signup_step() ) { 103 $title = __( 'Check Your Email To Activate Your Account!', 'buddypress' ); 107 if ( bp_get_membership_requests_required() ) { 108 $title = __( 'Your Membership Request has been submitted.', 'buddypress' ); 109 } else { 110 $title = __( 'Check Your Email To Activate Your Account!', 'buddypress' ); 111 } 104 112 } 105 113 106 114 // Activation page. -
src/bp-members/classes/class-bp-signup.php
diff --git src/bp-members/classes/class-bp-signup.php src/bp-members/classes/class-bp-signup.php index 9de2af9fe..c436c7262 100644
class BP_Signup { 214 214 $this->date_sent = $signup->registered; 215 215 } 216 216 217 // How many times has the activation email been sent? 218 if ( isset( $this->meta['count_sent'] ) ) { 219 $this->count_sent = absint( $this->meta['count_sent'] ); 220 } else { 221 $this->count_sent = 0; 222 } 223 217 224 /** 218 225 * Calculate a diff between now & last time 219 226 * an activation link has been resent. … … class BP_Signup { 226 233 * Set a boolean to track whether an activation link 227 234 * was sent in the last day. 228 235 */ 229 $this->recently_sent = ( $diff < 1 * DAY_IN_SECONDS );236 $this->recently_sent = $this->count_sent && ( $diff < 1 * DAY_IN_SECONDS ); 230 237 231 // How many times has the activation email been sent?232 if ( isset( $this->meta['count_sent'] ) ) {233 $this->count_sent = absint( $this->meta['count_sent'] );234 } else {235 $this->count_sent = 0;236 }237 238 } 238 239 239 240 /** Static Methods *******************************************************/ -
src/bp-members/screens/register.php
diff --git src/bp-members/screens/register.php src/bp-members/screens/register.php index 77929c442..40dd280dc 100644
function bp_core_screen_signup() { 61 61 } 62 62 } 63 63 64 if ( ! bp_get_signup_allowed() && ! $active_invite ) { 64 $requests_enabled = bp_get_membership_requests_required(); 65 66 if ( ! bp_get_signup_allowed() && ! $active_invite && ! $requests_enabled ) { 65 67 $bp->signup->step = 'registration-disabled'; 66 68 // If the signup page is submitted, validate and save. 67 69 } elseif ( isset( $_POST['signup_submit'] ) && bp_verify_nonce_request( 'bp_new_signup' ) ) { -
src/bp-templates/bp-legacy/buddypress/members/register.php
diff --git src/bp-templates/bp-legacy/buddypress/members/register.php src/bp-templates/bp-legacy/buddypress/members/register.php index d263470f2..dd6365b45 100644
351 351 * 352 352 * @since 1.1.0 353 353 */ 354 do_action( 'bp_before_registration_submit_buttons' ); ?> 354 do_action( 'bp_before_registration_submit_buttons' ); 355 356 if ( bp_get_membership_requests_required() ) { 357 $button_text = __( 'Submit Request', 'buddypress' ); 358 } else { 359 $button_text = __( 'Complete Sign Up', 'buddypress' ); 360 } 361 ?> 355 362 356 363 <div class="submit"> 357 <input type="submit" name="signup_submit" id="signup_submit" value="<?php e sc_attr_e( 'Complete Sign Up', 'buddypress'); ?>" />364 <input type="submit" name="signup_submit" id="signup_submit" value="<?php echo esc_attr( $button_text ); ?>" /> 358 365 </div> 359 366 360 367 <?php … … 390 397 do_action( 'bp_before_registration_confirmed' ); ?> 391 398 392 399 <div id="template-notices" role="alert" aria-atomic="true"> 393 <?php if ( bp_registration_needs_activation() ) : ?> 400 <?php if ( bp_get_membership_requests_required() ) : ?> 401 <p><?php _e( 'You have successfully submitted your membership request! Our site moderators will review your submission and send you an activation email if your request is approved.', 'buddypress' ); ?></p> 402 <?php elseif ( bp_registration_needs_activation() ) : ?> 394 403 <p><?php _e( 'You have successfully created your account! To begin using this site you will need to activate your account via the email we have just sent to your address.', 'buddypress' ); ?></p> 395 404 <?php else : ?> 396 405 <p><?php _e( 'You have successfully created your account! Please log in using the username and password you have just created.', 'buddypress' ); ?></p> -
src/bp-templates/bp-nouveau/includes/functions.php
diff --git src/bp-templates/bp-nouveau/includes/functions.php src/bp-templates/bp-nouveau/includes/functions.php index 3d85eace9..5faa6b0f9 100644
function bp_nouveau_get_user_feedback( $feedback_id = '' ) { 1122 1122 /* 1123 1123 * Adjust some messages to the context. 1124 1124 */ 1125 if ( 'completed-confirmation' === $feedback_id && bp_registration_needs_activation() ) { 1125 if ( 'completed-confirmation' === $feedback_id && bp_get_membership_requests_required() ) { 1126 $feedback_messages['completed-confirmation']['message'] = __( 'You have successfully submitted your membership request! Our site moderators will review your submission and send you an activation email if your request is approved.', 'buddypress' ); 1127 } elseif ( 'completed-confirmation' === $feedback_id && bp_registration_needs_activation() ) { 1126 1128 $feedback_messages['completed-confirmation']['message'] = __( 'You have successfully created your account! To begin using this site you will need to activate your account via the email we have just sent to your address.', 'buddypress' ); 1127 1129 } elseif ( 'member-notifications-none' === $feedback_id ) { 1128 1130 $is_myprofile = bp_is_my_profile();