Skip to:
Content

BuddyPress.org


Ignore:
Timestamp:
04/28/2021 11:50:21 PM (5 years ago)
Author:
dcavins
Message:

Member Invites: Add creation, deletion functions.

Introduce functions that apply the logic in
BP_Members_Invitation_Manager, including:

  • bp_members_invitations_get_invites
  • bp_members_invitations_user_has_sent_invites
  • bp_members_invitations_invite_user
  • bp_members_invitation_resend_by_id
  • bp_members_invitations_delete_by_id
  • bp_members_invitations_delete_invites
  • bp_members_invitations_get_hash
  • bp_get_members_invitation_from_request

See #8139.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-members/bp-members-functions.php

    r12905 r12918  
    33433343}
    33443344add_action( 'bp_core_activated_user', 'bp_send_welcome_email', 10, 1 );
     3345
     3346/**
     3347 * Get invitations to the BP community filtered by arguments.
     3348 *
     3349 * @since 8.0.0
     3350 *
     3351 * @param array $args     Invitation arguments.
     3352 *                        See BP_Invitation::get() for list.
     3353 *
     3354 * @return array $invites     Matching BP_Invitation objects.
     3355 */
     3356function bp_members_invitations_get_invites( $args = array() ) {
     3357        $invites_class = new BP_Members_Invitation_Manager();
     3358        return $invites_class->get_invitations( $args );
     3359}
     3360
     3361/**
     3362 * Check whether a user has sent any community invitations.
     3363 *
     3364 * @since 8.0.0
     3365 *
     3366 * @param int $user_id ID of user to check for invitations sent by.
     3367 *                     Defaults to the current user's ID.
     3368 *
     3369 * @return bool $invites True if user has sent invites.
     3370 */
     3371function bp_members_invitations_user_has_sent_invites( $user_id = 0 ) {
     3372        if ( 0 === $user_id ) {
     3373                $user_id = bp_loggedin_user_id();
     3374                if ( ! $user_id ) {
     3375                        return false;
     3376                }
     3377        }
     3378        $invites_class = new BP_Members_Invitation_Manager();
     3379        $args = array(
     3380                'inviter_id' => $user_id,
     3381        );
     3382        return (bool) $invites_class->invitation_exists( $args );
     3383}
     3384
     3385/**
     3386 * Invite a user to a BP community.
     3387 *
     3388 * @since 8.0.0
     3389 *
     3390 * @param array|string $args {
     3391 *     Array of arguments.
     3392 *     @type int    $invitee_email Email address of the user being invited.
     3393 *     @type int    $network_id    ID of the network to which the user is being invited.
     3394 *     @type int    $inviter_id    Optional. ID of the inviting user. Default:
     3395 *                                 ID of the logged-in user.
     3396 *     @type string $date_modified Optional. Modified date for the invitation.
     3397 *                                 Default: current date/time.
     3398 *     @type string $content       Optional. Message to invitee.
     3399 *     @type bool   $send_invite   Optional. Whether the invitation should be
     3400 *                                 sent now. Default: false.
     3401 * }
     3402 * @return bool True on success, false on failure.
     3403 */
     3404function bp_members_invitations_invite_user( $args ) {
     3405        $r = bp_parse_args( $args, array(
     3406                'invitee_email' => '',
     3407                'network_id'    => get_current_network_id(),
     3408                'inviter_id'    => bp_loggedin_user_id(),
     3409                'date_modified' => bp_core_current_time(),
     3410                'content'       => '',
     3411                'send_invite'   => 0
     3412        ), 'community_invite_user' );
     3413
     3414        $inv_args = array(
     3415                'invitee_email' => $r['invitee_email'],
     3416                'item_id'       => $r['network_id'],
     3417                'inviter_id'    => $r['inviter_id'],
     3418                'date_modified' => $r['date_modified'],
     3419                'content'       => $r['content'],
     3420                'send_invite'   => $r['send_invite']
     3421        );
     3422
     3423        // Create the invitataion.
     3424        $invites_class = new BP_Members_Invitation_Manager();
     3425        $created       = $invites_class->add_invitation( $inv_args );
     3426
     3427        /**
     3428         * Fires after the creation of a new network invite.
     3429         *
     3430         * @since 8.0.0
     3431         *
     3432         * @param array    $r       Array of parsed arguments for the network invite.
     3433         * @param int|bool $created The ID of the invitation or false if it couldn't be created.
     3434         */
     3435        do_action( 'bp_members_invitations_invite_user', $r, $created );
     3436
     3437        return $created;
     3438}
     3439
     3440/**
     3441 * Resend a membership invitation email by id.
     3442 *
     3443 * @since 8.0.0
     3444 *
     3445 * @param int $id ID of the invitation to resend.
     3446 * @return bool True on success, false on failure.
     3447 */
     3448function bp_members_invitation_resend_by_id( $id = 0 ) {
     3449
     3450        // Find the invitation before deleting it.
     3451        $existing_invite = new BP_Invitation( $id );
     3452        $invites_class   = new BP_Members_Invitation_Manager();
     3453        $success         = $invites_class->send_invitation_by_id( $id );
     3454
     3455        if ( ! $success ) {
     3456                return $success;
     3457        }
     3458
     3459        /**
     3460         * Fires after the re-sending of a network invite.
     3461         *
     3462         * @since 8.0.0
     3463         *
     3464         * @param BP_Invitation $existing_invite The invitation that was resent.
     3465         */
     3466        do_action( 'bp_members_invitations_resend_invitation', $existing_invite );
     3467
     3468        return $success;
     3469}
     3470
     3471/**
     3472 * Delete a membership invitation by id.
     3473 *
     3474 * @since 8.0.0
     3475 *
     3476 * @param int $id ID of the invitation to delete.
     3477 * @return int|bool Number of rows deleted on success, false on failure.
     3478 */
     3479function bp_members_invitations_delete_by_id( $id = 0 ) {
     3480
     3481        // Find the invitation before deleting it.
     3482        $existing_invite = new BP_Invitation( $id );
     3483        $invites_class   = new BP_Members_Invitation_Manager();
     3484        $success         = $invites_class->delete_by_id( $id );
     3485
     3486        if ( ! $success ) {
     3487                return $success;
     3488        }
     3489
     3490        // Run a different action depending on the status of the invite.
     3491        if ( ! $existing_invite->invite_sent ) {
     3492                /**
     3493                 * Fires after the deletion of an unsent community invite.
     3494                 *
     3495                 * @since 8.0.0
     3496                 *
     3497                 * @param BP_Invitation $existing_invite The invitation to be deleted.
     3498                 */
     3499                do_action( 'bp_members_invitations_canceled_invitation', $existing_invite );
     3500        } else if ( ! $existing_invite->accepted ) {
     3501                /**
     3502                 * Fires after the deletion of a sent, but not yet accepted, community invite.
     3503                 *
     3504                 * @since 8.0.0
     3505                 *
     3506                 * @param BP_Invitation $existing_invite The invitation to be deleted.
     3507                 */
     3508                do_action( 'bp_members_invitations_revoked_invitation', $existing_invite );
     3509        } else {
     3510                /**
     3511                 * Fires after the deletion of a sent and accepted community invite.
     3512                 *
     3513                 * @since 8.0.0
     3514                 *
     3515                 * @param BP_Invitation $existing_invite The invitation to be deleted.
     3516                 */
     3517                do_action( 'bp_members_invitations_deleted_invitation', $existing_invite );
     3518        }
     3519
     3520        return $success;
     3521}
     3522
     3523/**
     3524 * Delete a membership invitation.
     3525 *
     3526 * @since 8.0.0
     3527 *
     3528 * @param intring $args {
     3529 *     Array of arguments.
     3530 *     @type int|array $id            Id(s) of the invitation(s) to remove.
     3531 *     @type int       $invitee_email Email address of the user being invited.
     3532 *     @type int       $network_id    ID of the network to which the user is being invited.
     3533 *     @type int       $inviter_id    ID of the inviting user.
     3534 *     @type int       $accepted      Whether the invitation has been accepted yet.
     3535 *     @type int       $invite_sent   Whether the invitation has been sent yet.
     3536 * }
     3537 * @return bool True if all were deleted.
     3538 */
     3539function bp_members_invitations_delete_invites( $args ) {
     3540        $r = bp_parse_args( $args, array(
     3541                'id'            => false,
     3542                'invitee_email' => '',
     3543                'network_id'    => get_current_network_id(),
     3544                'inviter_id'    => null,
     3545                'accepted'      => null,
     3546                'invite_sent'   => null
     3547        ), 'members_invitations_delete_invites' );
     3548
     3549        $inv_args = array(
     3550                'id'            => $r['id'],
     3551                'invitee_email' => $r['invitee_email'],
     3552                'item_id'       => $r['network_id'],
     3553                'inviter_id'    => $r['inviter_id'],
     3554                'accepted'      => $r['accepted'],
     3555                'invite_sent'   => $r['invite_sent']
     3556        );
     3557
     3558        // Find the invitation(s).
     3559        $invites       = bp_members_invitations_get_invites( $inv_args );
     3560        $total_count   = count( $invites );
     3561
     3562        // Loop through, deleting each invitation.
     3563        $deleted = 0;
     3564        foreach ( $invites as $invite ) {
     3565                $success = bp_members_invitations_delete_by_id( $invite->id );
     3566                if ( $success ) {
     3567                        $deleted++;
     3568                }
     3569        }
     3570
     3571        return $deleted === $total_count;
     3572}
     3573
     3574/**
     3575 * Get hash based on details of a membership invitation and the inviter.
     3576 *
     3577 * @since 8.0.0
     3578 *
     3579 * @param BP_Invitation object $invitation Invitation to create hash from.
     3580 *
     3581 * @return string $hash Calculated sha1 hash.
     3582 */
     3583function bp_members_invitations_get_hash( BP_Invitation $invitation ) {
     3584        $hash = false;
     3585
     3586        if ( ! empty( $invitation->id ) ) {
     3587                $inviter_ud = get_userdata( $invitation->inviter_id );
     3588                if ( $inviter_ud ) {
     3589                        /*
     3590                         * Use some inviter details as part of the hash so that invitations from
     3591                         * users who are subsequently marked as spam will be invalidated.
     3592                         */
     3593                        $hash = wp_hash( "{$invitation->inviter_id}:{$invitation->invitee_email}:{$inviter_ud->user_status}:{$inviter_ud->user_registered}" );
     3594                }
     3595        }
     3596
     3597        // If there's a problem, return a string that will change and thus fail.
     3598        if ( ! $hash ) {
     3599                $hash = wp_generate_password( 32, false );
     3600        }
     3601
     3602        /**
     3603         * Filters the hash calculated by the invitation details.
     3604         *
     3605         * @since 8.0.0
     3606         *
     3607         * @param string $hash Calculated sha1 hash.
     3608         * @param BP_Invitation object $invitation Invitation hash was created from.
     3609         */
     3610        return apply_filters( 'bp_members_invitations_get_hash', $hash, $invitation );
     3611}
     3612
     3613/**
     3614 * Get the current invitation specified by the $_GET parameters.
     3615 *
     3616 * @since 8.0.0
     3617 *
     3618 * @return BP_Invitation $invite Invitation specified by the $_GET parameters.
     3619 */
     3620function bp_get_members_invitation_from_request() {
     3621        $invites_class = new BP_Members_Invitation_Manager();
     3622        $invite        = $invites_class->get_by_id( 0 );
     3623
     3624        if ( bp_get_members_invitations_allowed() && ! empty( $_GET['inv'] ) ) {
     3625                // Check to make sure the passed hash matches a calculated hash.
     3626                $maybe_invite = $invites_class->get_by_id( absint( $_GET['inv'] ) );
     3627                $hash = bp_members_invitations_get_hash( $maybe_invite );
     3628                if ( $_GET['ih'] === $hash ) {
     3629                        $invite = $maybe_invite;
     3630                }
     3631        }
     3632
     3633        /**
     3634         * Filters the invitation specified by the $_GET parameters.
     3635         *
     3636         * @since 8.0.0
     3637         *
     3638         * @param BP_Invitation $invite Invitation specified by the $_GET parameters.
     3639         */
     3640        return apply_filters( 'bp_get_members_invitation_from_request', $invite );
     3641}
Note: See TracChangeset for help on using the changeset viewer.