Skip to:
Content

BuddyPress.org

Ticket #6932: 6932.4.diff

File 6932.4.diff, 29.6 KB (added by tharsheblows, 4 years ago)

style updates, back compat and change who handles the redirect

  • src/bp-activity/bp-activity-notifications.php

     
    4040 * @param int $receiver_user_id The ID of the user who is receiving the update.
    4141 */
    4242function bp_activity_at_message_notification( $activity_id, $receiver_user_id ) {
     43
    4344        $notifications = BP_Core_Notification::get_all_for_user( $receiver_user_id, 'all' );
    4445
    4546        // Don't leave multiple notifications for the same activity item.
     
    7374                        $group_name = bp_get_current_group_name();
    7475                }
    7576
     77                $unsubscribe_args = array(
     78                        'user_id'           => (int) $receiver_user_id,
     79                        'notification_type' => $email_type,
     80                );
     81                $unsubscribe_link = esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) );
     82
    7683                $args = array(
    7784                        'tokens' => array(
    7885                                'activity'         => $activity,
     
    8188                                'mentioned.url'    => $message_link,
    8289                                'poster.name'      => $poster_name,
    8390                                'receiver-user.id' => $receiver_user_id,
     91                                'unsubscribe'      => $unsubscribe_link,
    8492                        ),
    8593                );
    8694
     
    152160
    153161                // Send an email if the user hasn't opted-out.
    154162                if ( 'no' != bp_get_user_meta( $original_activity->user_id, 'notification_activity_new_reply', true ) ) {
     163
     164                        $unsubscribe_args = array(
     165                                'user_id'           => (int) $original_activity->user_id,
     166                                'notification_type' => 'activity-comment',
     167                        );
     168                        $unsubscribe_link = esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) );
     169
    155170                        $args = array(
    156171                                'tokens' => array(
    157172                                        'comment.id'                => $comment_id,
     
    160175                                        'original_activity.user_id' => $original_activity->user_id,
    161176                                        'poster.name'               => $poster_name,
    162177                                        'thread.url'                => esc_url( $thread_link ),
     178                                        'unsubscribe'               => $unsubscribe_link,
    163179                                ),
    164180                        );
    165181
     
    194210
    195211                // Send an email if the user hasn't opted-out.
    196212                if ( 'no' != bp_get_user_meta( $parent_comment->user_id, 'notification_activity_new_reply', true ) ) {
     213
     214                        $unsubscribe_args = array(
     215                                'user_id'           => (int) $parent_comment->user_id,
     216                                'notification_type' => 'activity-comment-author',
     217                        );
     218                        $unsubscribe_link = esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) );
     219
    197220                        $args = array(
    198221                                'tokens' => array(
    199222                                        'comment.id'             => $comment_id,
     
    202225                                        'parent-comment-user.id' => $parent_comment->user_id,
    203226                                        'poster.name'            => $poster_name,
    204227                                        'thread.url'             => esc_url( $thread_link ),
     228                                        'unsubscribe'            => $unsubscribe_link,
    205229                                ),
    206230                        );
    207231
     
    217241                 * @param int                  $comment_id     ID for the newly received comment.
    218242                 * @param int                  $commenter_id   ID of the user who made the comment.
    219243                 * @param array                $params         Arguments used with the original activity comment.
    220                  */
     244                 */
    221245                do_action( 'bp_activity_sent_reply_to_reply_notification', $parent_comment, $comment_id, $commenter_id, $params );
    222246        }
    223247}
  • src/bp-core/admin/bp-core-admin-schema.php

     
    539539        );
    540540
    541541        $emails       = bp_email_get_schema();
    542         $descriptions = bp_email_get_type_schema();
     542        $descriptions = bp_email_type_schema();
    543543
    544544        // Add these emails to the database.
    545545        foreach ( $emails as $id => $email ) {
     
    552552                foreach ( $tt_ids as $tt_id ) {
    553553                        $term = get_term_by( 'term_taxonomy_id', (int) $tt_id, bp_get_email_tax_type() );
    554554                        wp_update_term( (int) $term->term_id, bp_get_email_tax_type(), array(
    555                                 'description' => $descriptions[ $id ],
     555                                'description' => $descriptions[ $id ]['description'],
    556556                        ) );
    557557                }
    558558        }
  • src/bp-core/bp-core-actions.php

     
    109109
    110110// Activation redirect.
    111111add_action( 'bp_activation', 'bp_add_activation_redirect' );
     112
     113// Email unsubscribe.
     114add_action( 'bp_get_request_unsubscribe', 'bp_emails_unsubscribe_handler' );
     115
  • src/bp-core/bp-core-filters.php

     
    10241024        $tokens['recipient.email']     = '';
    10251025        $tokens['recipient.name']      = '';
    10261026        $tokens['recipient.username']  = '';
    1027         $tokens['unsubscribe']         = site_url( 'wp-login.php' );
    10281027
    10291028
    10301029        // Who is the email going to?
     
    10411040                }
    10421041
    10431042                if ( $user_obj ) {
    1044                         // Unsubscribe link.
    1045                         $tokens['unsubscribe'] = esc_url( sprintf(
    1046                                 '%s%s/notifications/',
    1047                                 bp_core_get_user_domain( $user_obj->ID ),
    1048                                 function_exists( 'bp_get_settings_slug' ) ? bp_get_settings_slug() : 'settings'
    1049                         ) );
    10501043                        $tokens['recipient.username'] = $user_obj->user_login;
    10511044                }
    10521045        }
  • src/bp-core/bp-core-functions.php

     
    28982898 *                       on the email delivery class you are using.
    28992899 */
    29002900function bp_send_email( $email_type, $to, $args = array() ) {
     2901
    29012902        static $is_default_wpmail = null;
    29022903        static $wp_html_emails    = null;
    29032904
     
    29212922                'tokens' => array(),
    29222923        ), 'send_email' );
    29232924
    2924 
    29252925        /*
    29262926         * Build the email.
    29272927         */
     
    29542954
    29552955        if ( $must_use_wpmail ) {
    29562956                $to = $email->get( 'to' );
    2957 
    29582957                return wp_mail(
    29592958                        array_shift( $to )->get_address(),
    29602959                        $email->get( 'subject', 'replace-tokens' ),
     
    29892988        }
    29902989
    29912990        $delivery = new $delivery_class();
     2991
    29922992        $status   = $delivery->bp_email( $email );
    29932993
    29942994        if ( is_wp_error( $status ) ) {
     
    32663266}
    32673267
    32683268/**
    3269  * Get a list of emails for populating email type taxonomy terms.
     3269 * Summary.
    32703270 *
     3271 * Description.
     3272 *
    32713273 * @since 2.5.1
     3274 * @deprecated 2.6 Use bp_email_type_schema()
     3275 * @see bp_email_type_schema()
    32723276 *
    3273  * @return array
     3277 * @return array Array of the email type descriptions.
    32743278 */
    32753279function bp_email_get_type_schema() {
    3276         return array(
    3277                 'activity-comment'                   => __( 'A member has replied to an activity update that the recipient posted.', 'buddypress' ),
    3278                 'activity-comment-author'            => __( 'A member has replied to a comment on an activity update that the recipient posted.', 'buddypress' ),
    3279                 'activity-at-message'                => __( 'Recipient was mentioned in an activity update.', 'buddypress' ),
    3280                 'groups-at-message'                  => __( 'Recipient was mentioned in a group activity update.', 'buddypress' ),
    3281                 'core-user-registration'             => __( 'Recipient has registered for an account.', 'buddypress' ),
    3282                 'core-user-registration-with-blog'   => __( 'Recipient has registered for an account and site.', 'buddypress' ),
    3283                 'friends-request'                    => __( 'A member has sent a friend request to the recipient.', 'buddypress' ),
    3284                 'friends-request-accepted'           => __( 'Recipient has had a friend request accepted by a member.', 'buddypress' ),
    3285                 'groups-details-updated'             => __( "A group's details were updated.", 'buddypress' ),
    3286                 'groups-invitation'                  => __( 'A member has sent a group invitation to the recipient.', 'buddypress' ),
    3287                 'groups-member-promoted'             => __( "Recipient's status within a group has changed.", 'buddypress' ),
    3288                 'groups-membership-request'          => __( 'A member has requested permission to join a group.', 'buddypress' ),
    3289                 'messages-unread'                    => __( 'Recipient has received a private message.', 'buddypress' ),
    3290                 'settings-verify-email-change'       => __( 'Recipient has changed their email address.', 'buddypress' ),
    3291                 'groups-membership-request-accepted' => __( 'Recipient had requested to join a group, which was accepted.', 'buddypress' ),
    3292                 'groups-membership-request-rejected' => __( 'Recipient had requested to join a group, which was rejected.', 'buddypress' ),
     3280        $type_schema_description = wp_list_pluck( bp_email_type_schema(), 'description' );
     3281        return $type_schema_description;
     3282}
     3283
     3284/**
     3285 * Get a list of emails for populating email type taxonomy terms.
     3286 *
     3287 * @since
     3288 *
     3289 * @return array Array of the email type schema.
     3290 */
     3291function bp_email_type_schema() {
     3292
     3293        $activity_comment = array(
     3294                'description'   => __( 'A member has replied to an activity update that the recipient posted.', 'buddypress' ),
     3295                'unsubscribe'   => array(
     3296                        'meta_key'      => 'notification_activity_new_reply',
     3297                        'message'       => __( 'You will no longer receive emails when someone replies to an update or comment you posted.', 'buddypress' ),
     3298                        ),
    32933299        );
     3300
     3301        $activity_comment_author = array(
     3302                'description'   => __( 'A member has replied to a comment on an activity update that the recipient posted.', 'buddypress' ),
     3303                'unsubscribe'   => array(
     3304                        'meta_key'      => 'notification_activity_new_reply',
     3305                        'message'       => __( 'You will no longer receive emails when someone replies to an update or comment you posted.', 'buddypress' ),
     3306                        ),
     3307        );
     3308
     3309        $activity_at_message = array(
     3310                'description'   => __( 'Recipient was mentioned in an activity update.', 'buddypress' ),
     3311                'unsubscribe'   => array(
     3312                        'meta_key'      => 'notification_activity_new_mention',
     3313                        'message'       => __( 'You will no longer receive emails when someone mentions you in an update.', 'buddypress' ),
     3314                ),
     3315        );
     3316
     3317        $groups_at_message = array(
     3318                'description'   => __( 'Recipient was mentioned in a group activity update.', 'buddypress' ),
     3319                'unsubscribe'   => array(
     3320                        'meta_key'      => 'notification_activity_new_mention',
     3321                        'message'       => __( 'You will no longer receive emails when someone mentions you in an update.', 'buddypress' ),
     3322                ),
     3323        );
     3324
     3325        $core_user_registration = array(
     3326                'description'   => __( 'Recipient has registered for an account.', 'buddypress' ),
     3327                'unsubscribe'   => false,
     3328        );
     3329
     3330        $core_user_registration_with_blog = array(
     3331                'description'   => __( 'Recipient has registered for an account and site.', 'buddypress' ),
     3332                'unsubscribe'   => false,
     3333        );
     3334
     3335        $friends_request = array(
     3336                'description'   => __( 'A member has sent a friend request to the recipient.', 'buddypress' ),
     3337                'unsubscribe'   => array(
     3338                        'meta_key'      => 'notification_friends_friendship_request',
     3339                        'message'       => __( 'You will no longer receive emails when someone sends you a friend request.', 'buddypress' ),
     3340                ),
     3341        );
     3342
     3343        $friends_request_accepted = array(
     3344                'description'   => __( 'Recipient has had a friend request accepted by a member.', 'buddypress' ),
     3345                'unsubscribe'   => array(
     3346                        'meta_key'      => 'notification_friends_friendship_accepted',
     3347                        'message'       => __( 'You will no longer receive emails when someone accepts your friendship request.', 'buddypress' ),
     3348                ),
     3349        );
     3350
     3351        $groups_details_updated = array(
     3352                'description'   => __( "A group's details were updated.", 'buddypress' ),
     3353                'unsubscribe'   => array(
     3354                        'meta_key'      => 'notification_groups_group_updated',
     3355                        'message'       => __( 'You will no longer receive emails when one of your groups is updated.', 'buddypress' ),
     3356                ),
     3357        );
     3358
     3359        $groups_details_updated = array(
     3360                'description'   => __( "A group's details were updated.", 'buddypress' ),
     3361                'unsubscribe'   => array(
     3362                        'meta_key'      => 'notification_groups_group_updated',
     3363                        'message'       => __( 'You will no longer receive emails when one of your groups is updated.', 'buddypress' ),
     3364                ),
     3365        );
     3366
     3367        $groups_invitation = array(
     3368                'description'   => __( 'A member has sent a group invitation to the recipient.', 'buddypress' ),
     3369                'unsubscribe'   => array(
     3370                        'meta_key'      => 'notification_groups_invite',
     3371                        'message'       => __( 'You will no longer receive emails when you are invited to join a group.', 'buddypress' ),
     3372                ),
     3373        );
     3374
     3375        $groups_member_promoted = array(
     3376                'description'   => __( "Recipient's status within a group has changed.", 'buddypress' ),
     3377                'unsubscribe'   => array(
     3378                        'meta_key'      => 'notification_groups_admin_promotion',
     3379                        'message'       => __( 'You will no longer receive emails when you have been promoted in a group.', 'buddypress' ),
     3380                ),
     3381        );
     3382
     3383        $groups_member_promoted = array(
     3384                'description'   => __( "Recipient's status within a group has changed.", 'buddypress' ),
     3385                'unsubscribe'   => array(
     3386                        'meta_key'      => 'notification_groups_admin_promotion',
     3387                        'message'       => __( 'You will no longer receive emails when you have been promoted in a group.', 'buddypress' ),
     3388                ),
     3389        );
     3390
     3391        $groups_membership_request = array(
     3392                'description'   => __( 'A member has requested permission to join a group.', 'buddypress' ),
     3393                'unsubscribe'   => array(
     3394                        'meta_key'      => 'notification_groups_membership_request',
     3395                        'message'       => __( 'You will no longer receive emails when someone requests to be a member of your group.', 'buddypress' ),
     3396                ),
     3397        );
     3398
     3399        $messages_unread = array(
     3400                'description'   => __( 'Recipient has received a private message.', 'buddypress' ),
     3401                'unsubscribe'   => array(
     3402                        'meta_key'      => 'notification_messages_new_message',
     3403                        'message'       => __( 'You will no longer receive emails when someone sends you a message.', 'buddypress' ),
     3404                ),
     3405        );
     3406
     3407        $settings_verify_email_change = array(
     3408                'description'   => __( 'Recipient has changed their email address.', 'buddypress' ),
     3409                'unsubscribe'   => false,
     3410        );
     3411
     3412        $groups_membership_request_accepted = array(
     3413                'description'   => __( 'Recipient had requested to join a group, which was accepted.', 'buddypress' ),
     3414                'unsubscribe'   => array(
     3415                        'meta_key'      => 'notification_membership_request_completed',
     3416                        'message'       => __( 'You will no longer receive emails when your request to join a group has been accepted or denied.', 'buddypress' ),
     3417                ),
     3418        );
     3419
     3420        $groups_membership_request_rejected = array(
     3421                'description'   => __( 'Recipient had requested to join a group, which was rejected.', 'buddypress' ),
     3422                'unsubscribe'   => array(
     3423                        'meta_key'      => 'notification_membership_request_completed',
     3424                        'message'       => __( 'You will no longer receive emails when your request to join a group has been accepted or denied.', 'buddypress' ),
     3425                ),
     3426        );
     3427
     3428        $email_type_schema_array = array(
     3429                'activity-comment'                   => $activity_comment,
     3430                'activity-comment-author'            => $activity_comment_author,
     3431                'activity-at-message'                => $activity_at_message,
     3432                'groups-at-message'                  => $groups_at_message,
     3433                'core-user-registration'             => $core_user_registration,
     3434                'core-user-registration-with-blog'   => $core_user_registration_with_blog,
     3435                'friends-request'                    => $friends_request,
     3436                'friends-request-accepted'           => $friends_request_accepted,
     3437                'groups-details-updated'             => $groups_details_updated,
     3438                'groups-invitation'                  => $groups_invitation,
     3439                'groups-member-promoted'             => $groups_member_promoted,
     3440                'groups-membership-request'          => $groups_membership_request,
     3441                'messages-unread'                    => $messages_unread,
     3442                'settings-verify-email-change'       => $settings_verify_email_change,
     3443                'groups-membership-request-accepted' => $groups_membership_request_accepted,
     3444                'groups-membership-request-rejected' => $groups_membership_request_rejected,
     3445        );
     3446
     3447        /**
     3448        * Email types schema.
     3449        *
     3450        * @since
     3451        *
     3452        * @param array $email_type_schema_array {
     3453        *     The array of email types and their schema.
     3454        *
     3455        *     @type string $description The description of the action which causes this to trigger.
     3456        *     @type array  $email_type_schema_array['unsubscribe'] {
     3457        *           The unsubscribe array.
     3458        *           Setting the value to false indicates that a user cannot unsubscribe from this type.
     3459        *
     3460        *           @type string $email_type_schema_array['unsubscribe']['meta_key']    The meta_key used to toggle the email setting for this notification.
     3461        *           @type string $email_type_schema_array['unsubscribe']['message']     The message shown when the user has successfully unsubscribed.
     3462        *     }
     3463        * }
     3464        */
     3465        return apply_filters( 'bp_email_type_schema', $email_type_schema_array );
    32943466}
     3467
     3468/**
     3469 * Handles unsubscribe action to unsubscribe user from notification emails.
     3470 *
     3471 * @since
     3472 *
     3473 */
     3474function bp_emails_unsubscribe_handler() {
     3475
     3476        $request = $_GET;
     3477        $admin_email   = get_bloginfo( 'admin_email' );
     3478        $bp_email_schema = bp_email_type_schema();
     3479
     3480        $user_id = ( isset( $request['uid'] ) && ! empty( $request['uid'] ) ) ? (int) $request['uid'] : '';
     3481        $notification_type = ( isset( $request['nt'] ) && ! empty( $request['nt'] ) ) ? esc_attr( $request['nt'] ) : '';
     3482        $to_check = ( isset( $request['nn'] ) && ! empty( $request['nn'] ) ) ? $request['nn'] : '';
     3483
     3484        $check_args = array(
     3485                'uid' => $user_id,
     3486                'nt'  => $notification_type,
     3487        );
     3488
     3489        $check = bp_hash_array( $check_args );
     3490
     3491        $current_user = is_user_logged_in() ? wp_get_current_user() : false;
     3492
     3493        if ( empty( $user_id ) || empty( $notification_type ) || empty( $to_check ) || ! array_key_exists( $notification_type, $bp_email_schema ) ) {
     3494
     3495                $settings_link = site_url( 'wp-login.php' );
     3496                $result_message = __( 'Sorry, something has gone wrong.', 'buddypress' );
     3497                $how_to_unsubscribe_message = __( 'Please log in and go to your settings to unsubscribe from notifications.', 'buddypress' );
     3498        } elseif ( ! hash_equals( $check, $to_check ) ) {
     3499
     3500                $settings_link = site_url( 'wp-login.php' );
     3501                $result_message = __( 'Sorry the security check failed.', 'buddypress' );
     3502                $how_to_unsubscribe_message = __( 'Please log in and go to your settings to unsubscribe from notifications.', 'buddypress' );
     3503
     3504        } elseif ( is_user_logged_in() && (int) $current_user->ID !== (int) $user_id ) {
     3505
     3506                $settings_link = esc_url( sprintf(
     3507                        '%s%s/notifications/',
     3508                        bp_core_get_user_domain( (int) $current_user->ID ),
     3509                        function_exists( 'bp_get_settings_slug' ) ? bp_get_settings_slug() : 'settings'
     3510                ) );
     3511
     3512                $result_message = __( 'Something has gone wrong.', 'buddypress' );
     3513                $how_to_unsubscribe_message = __( 'Please go to your settings to unsubscribe from notifications.', 'buddypress' );
     3514        } else {
     3515
     3516                $settings_link = esc_url( sprintf(
     3517                        '%s%s/notifications/',
     3518                        bp_core_get_user_domain( $user_id ),
     3519                        function_exists( 'bp_get_settings_slug' ) ? bp_get_settings_slug() : 'settings'
     3520                ) );
     3521
     3522                // unsubscribe them by setting the usermeta to 'no'
     3523                $notification_meta_key = $bp_email_schema[ $notification_type ]['unsubscribe']['meta_key'];
     3524                $is_unsubscribed = bp_update_user_meta( $user_id, $notification_meta_key, 'no' );
     3525
     3526                $result_message = ( empty( $is_unsubscribed ) && bp_get_user_meta( $user_id, $notification_meta_key, true ) !== 'no' ) ? __( 'Sorry, something has gone wrong with unsubscribing you from these emails.', 'buddypress' ) : $bp_email_schema[ $notification_type ]['unsubscribe']['message'];
     3527
     3528                $how_to_unsubscribe_message = __( 'You can change this or any other email notification preferences in your email settings.', 'buddypress' );
     3529        }
     3530
     3531        $message = sprintf(
     3532                '%1$s <a href="%2$s">%3$s</a>',
     3533                $result_message,
     3534                $settings_link,
     3535                $how_to_unsubscribe_message
     3536        );
     3537
     3538        bp_core_add_message( $message );
     3539        bp_core_redirect( esc_url( remove_query_arg( array_keys( $request ) ) ) );
     3540}
     3541
     3542/**
     3543 * Creates unsubscribe link for notification emails.
     3544 *
     3545 * @since
     3546 *
     3547 * @param string        $redirect_to The URL to which the unsubscribe query string is appended.
     3548 * @param array         $args        {
     3549 *
     3550 *    Used to build unsubscribe query string.
     3551 *
     3552 *    @type string $notification_type Which notification type is being sent.
     3553 *    @type string $user_id           The ID of the user to whom the notification is sent.
     3554 *    @type string $redirect_to       Optional. The url to which the user will be redirected. Default is the activity directory.
     3555 *
     3556 * }
     3557 * @return string The unsubscribe link.
     3558 */
     3559function bp_email_get_unsubscribe_link( $args = null ) {
     3560
     3561        $bp_emails_type_schema = bp_email_type_schema();
     3562
     3563        if ( ! is_array( $args ) || ! isset( $args['notification_type'] ) || ! array_key_exists( $args['notification_type'], $bp_emails_type_schema ) ) {
     3564                return site_url( 'wp-login.php' );
     3565        }
     3566
     3567        $notification_type = $unsubscribe_args['nt'] = esc_attr( $args['notification_type'] );
     3568        $user_id = $unsubscribe_args['uid'] = (int) $args['user_id'];
     3569
     3570        // if the activity type is not unsubscribable (ununsubscribable), return false
     3571        if ( empty( $bp_emails_type_schema[ $notification_type ]['unsubscribe'] ) ) {
     3572                return false;
     3573        }
     3574
     3575        $redirect_to = ( isset( $args['redirect_to'] ) ) ? isset( $args['redirect_to'] ) : bp_get_activity_directory_permalink();
     3576
     3577        $check = bp_hash_array( $unsubscribe_args );
     3578
     3579        $unsubscribe_args['nn'] = $check;
     3580        $unsubscribe_args['action'] = 'unsubscribe';
     3581
     3582        $unsubscribe_link = esc_url( add_query_arg( $unsubscribe_args, $redirect_to ) );
     3583
     3584        /**
     3585         * Filters the unsubscribe link.
     3586         *
     3587         * @since
     3588         *
     3589         * @param string        $redirect_to    URL to which the unsubscribe query string is appended.
     3590         * @param array         $args           Used to build unsubscribe query string.
     3591         */
     3592        return apply_filters( 'bp_email_get_unsubscribe_link', $unsubscribe_link, $redirect_to, $args );
     3593}
     3594
  • src/bp-core/bp-core-options.php

     
    893893         */
    894894        return apply_filters( 'bp_get_theme_package_id', bp_get_option( '_bp_theme_package_id', $default ) );
    895895}
     896
     897/**
     898 * Get a persistent salt not dependent on salts in wp-config.php.
     899 *
     900 * @return string
     901 *
     902 */
     903function bp_get_salt() {
     904
     905        $salt = bp_get_option( 'bp_persistent_salt' );
     906        if ( ! $salt ) {
     907                $salt = base64_encode( mcrypt_create_iv( 12, MCRYPT_DEV_URANDOM ) );
     908                bp_add_option( 'bp_persistent_salt', $salt );
     909        }
     910
     911        return $salt;
     912}
     913
     914/**
     915 * Get a function that makes a checkable hash for the given args.
     916 *
     917 * @param  array        $args   Any array.
     918 *
     919 * @return string
     920 *
     921 */
     922function bp_hash_array( $args ) {
     923
     924        $salt = bp_get_salt();
     925
     926        // order doesn't matter
     927        ksort( $args );
     928
     929        $string = ( is_array( $args ) ) ? implode( ':', $args ) : (string) $args;
     930
     931        // should this return a substring like the nonce does? It's quite long.
     932        $check = hash_hmac( 'md5', $string, $salt );
     933
     934        return $check;
     935}
  • src/bp-friends/bp-friends-notifications.php

     
    3232                return;
    3333        }
    3434
     35        $unsubscribe_args = array(
     36                'user_id'           => (int) $friend_id,
     37                'notification_type' => 'friends-request',
     38        );
     39        $unsubscribe_link = esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) );
     40
    3541        $args = array(
    3642                'tokens' => array(
    3743                        'friend-requests.url' => esc_url( bp_core_get_user_domain( $friend_id ) . bp_get_friends_slug() . '/requests/' ),
     
    4046                        'initiator.id'        => $initiator_id,
    4147                        'initiator.url'       => esc_url( bp_core_get_user_domain( $initiator_id ) ),
    4248                        'initiator.name'      => bp_core_get_user_displayname( $initiator_id ),
     49                        'unsubscribe'             => $unsubscribe_link,
    4350                ),
    4451        );
    4552        bp_send_email( 'friends-request', $friend_id, $args );
     
    6370                return;
    6471        }
    6572
     73        $unsubscribe_args = array(
     74                'user_id'           => (int) $initiator_id,
     75                'notification_type' => 'friends-request-accepted',
     76        );
     77        $unsubscribe_link = esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) );
     78
    6679        $args = array(
    6780                'tokens' => array(
    6881                        'friend.id'      => $friend_id,
     
    7083                        'friend.name'    => bp_core_get_user_displayname( $friend_id ),
    7184                        'friendship.id'  => $friendship_id,
    7285                        'initiator.id'   => $initiator_id,
     86                        'unsubscribe'    => $unsubscribe_link,
    7387                ),
    7488        );
    7589        bp_send_email( 'friends-request-accepted', $initiator_id, $args );
  • src/bp-groups/bp-groups-notifications.php

     
    6868                        continue;
    6969                }
    7070
     71                $unsubscribe_args = array(
     72                        'user_id'           => (int) $user_id,
     73                        'notification_type' => 'groups-details-updated',
     74                );
     75                $unsubscribe_link = esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) );
     76
    7177                $args = array(
    7278                        'tokens' => array(
    7379                                'changed_text' => $changed_text,
     
    7581                                'group.id'     => $group_id,
    7682                                'group.url'    => esc_url( bp_get_group_permalink( $group ) ),
    7783                                'group.name'   => $group->name,
     84                                'unsubscribe'  => $unsubscribe_link,
    7885                        ),
    7986                );
    8087                bp_send_email( 'groups-details-updated', (int) $user_id, $args );
     
    115122                        'item_id'           => $group_id,
    116123                        'secondary_item_id' => $requesting_user_id,
    117124                        'component_name'    => buddypress()->groups->id,
    118                         'component_action'  => 'new_membership_request'
     125                        'component_action'  => 'new_membership_request',
    119126                ) );
    120127        }
    121128
     
    124131                return;
    125132        }
    126133
     134        $unsubscribe_args = array(
     135                'user_id'           => (int) $admin_id,
     136                'notification_type' => 'groups-membership-request',
     137        );
     138        $unsubscribe_link = esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) );
     139
    127140        $group = groups_get_group( array( 'group_id' => $group_id ) );
    128141        $args  = array(
    129142                'tokens' => array(
     
    136149                        'profile.url'          => esc_url( bp_core_get_user_domain( $requesting_user_id ) ),
    137150                        'requesting-user.id'   => $requesting_user_id,
    138151                        'requesting-user.name' => bp_core_get_user_displayname( $requesting_user_id ),
     152                        'unsubscribe'              => $unsubscribe_link,
    139153                ),
    140154        );
    141155        bp_send_email( 'groups-membership-request', (int) $admin_id, $args );
     
    172186                return;
    173187        }
    174188
     189        $unsubscribe_args = array(
     190                'user_id'           => (int) $requesting_user_id,
     191                'notification_type' => 'notification_membership_request_completed',
     192        );
     193        $unsubscribe_link = esc_url( bp_email_get_unsubscribe_link( $user_groups_link, $unsubscribe_args ) );
     194
    175195        $group = groups_get_group( array( 'group_id' => $group_id ) );
    176196        $args  = array(
    177197                'tokens' => array(
     
    184204        );
    185205
    186206        if ( ! empty( $accepted ) ) {
     207
     208                $unsubscribe_args = array(
     209                        'user_id'           => (int) $requesting_user_id,
     210                        'notification_type' => 'groups-membership-request-accepted',
     211                );
     212                $unsubscribe_link = esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) );
     213
     214                $args['tokens']['unsubscribe'] = $unsubscribe_link;
     215
    187216                bp_send_email( 'groups-membership-request-accepted', (int) $requesting_user_id, $args );
     217
    188218        } else {
     219
     220                $unsubscribe_args = array(
     221                        'user_id'           => (int) $requesting_user_id,
     222                        'notification_type' => 'groups-membership-request-rejected',
     223                );
     224                $unsubscribe_link = esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) );
     225
     226                $args['tokens']['unsubscribe'] = $unsubscribe_link;
     227
    189228                bp_send_email( 'groups-membership-request-rejected', (int) $requesting_user_id, $args );
    190229        }
    191230}
     
    226265                return;
    227266        }
    228267
     268        $unsubscribe_args = array(
     269                'user_id'           => (int) $user_id,
     270                'notification_type' => 'groups-member-promoted',
     271        );
     272        $unsubscribe_link = esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) );
     273
    229274        $group = groups_get_group( array( 'group_id' => $group_id ) );
    230275        $args  = array(
    231276                'tokens' => array(
     
    235280                        'group.name'  => $group->name,
    236281                        'promoted_to' => $promoted_to,
    237282                        'user.id'     => $user_id,
     283                        'unsubscribe' => $unsubscribe_link,
    238284                ),
    239285        );
    240286        bp_send_email( 'groups-member-promoted', (int) $user_id, $args );
     
    277323        }
    278324
    279325        $invited_link = bp_core_get_user_domain( $invited_user_id ) . bp_get_groups_slug();
     326
     327        $unsubscribe_args = array(
     328                'user_id'           => (int) $invited_user_id,
     329                'notification_type' => 'groups-invitation',
     330        );
     331        $unsubscribe_link = esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) );
     332
    280333        $args         = array(
    281334                'tokens' => array(
    282335                        'group'        => $group,
     
    286339                        'inviter.url'  => bp_core_get_user_domain( $inviter_user_id ),
    287340                        'inviter.id'   => $inviter_user_id,
    288341                        'invites.url'  => esc_url( $invited_link . '/invites/' ),
     342                        'unsubscribe'  => $unsubscribe_link,
    289343                ),
    290344        );
    291345        bp_send_email( 'groups-invitation', (int) $invited_user_id, $args );
  • src/bp-messages/bp-messages-notifications.php

     
    5858                        continue;
    5959                }
    6060
     61                $unsubscribe_args = array(
     62                        'user_id'           => (int) $recipient->user_id,
     63                        'notification_type' => 'messages-unread',
     64                );
     65                $unsubscribe_link = esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) );
     66
    6167                $args = array(
    6268                        'tokens' => array(
    6369                                'usermessage' => wp_strip_all_tags( stripslashes( $message ) ),
     
    6470                                'message.url' => esc_url( bp_core_get_user_domain( $recipient->user_id ) . bp_get_messages_slug() . '/view/' . $thread_id . '/' ),
    6571                                'sender.name' => $sender_name,
    6672                                'usersubject' => sanitize_text_field( stripslashes( $subject ) ),
     73                                'unsubscribe' => $unsubscribe_link,
    6774                        ),
    6875                );
    6976                bp_send_email( 'messages-unread', $ud, $args );
  • tests/phpunit/testcases/admin/functions.php

     
    252252                        'hide_empty' => false,
    253253                ) );
    254254
    255                 $correct_descriptions = bp_email_get_type_schema();
     255                $correct_descriptions = bp_email_type_schema();
    256256                foreach ( $d_terms as $d_term ) {
    257                         $correct_description = $correct_descriptions[ $d_term->slug ];
     257                        $correct_description = $correct_descriptions[ $d_term->slug ]['description'];
    258258                        $this->assertSame( $correct_description, $d_term->description );
    259259                }
    260260        }