New Invitations API Coming in BuddyPress 5.0

As part of BuddyPress 5.0, we’ve included a new core API for managing invitations. This API stores data in a new table, bp_invitations, and introduces new classes to handle working with invitations stored in the new table. The API clears the way for the development of useful  features like site invitations (hopefully coming in 5.1) but starts by handling group invitations and membership requests.

For most users and developers, the changes will be subtle. Existing group invitations will be migrated to the invitations table, and the current behaviors have been maintained. Managing invitations and requests will still be accomplished using familiar functions like groups_invite_user() or groups_accept_membership_request(). Queries made using BP_Group_Member_Query will continue to work as expected.

However, if you are directly querying the bp_groups_members table to find invitations and membership requests, these queries will no longer work, since the pending memberships will be stored in the new bp_invitations table. Happily, we’ve introduced several new functions, like groups_get_invites() and groups_get_requests(), that make finding invitations easier and more reliable.

The signatures of several functions have changed from accepting one or two parameters to accepting an array of parameters to support the new flexibility of the underlying API. The following functions now accept an array of parameters and will issue a deprecation notice if standard parameters are passed into them:

  • groups_send_invites()
  • groups_send_membership_request()

Three membership request management functions have also changed from accepting a membership_id as the first parameter to relying on the user_id and group_id parameters to find the correct request to change:

  • groups_accept_membership_request()
  • groups_reject_membership_request()
  • groups_delete_membership_request()

Other improvements include the following:

  • BP_Invitation objects are cached
  • Queries made via the BP_Invitation class are cached
  • Extension is straightforward; see BP_Groups_Invitation_Manager for an example
  • Many scattered direct queries have been replaced by calls to the API
  • Messages included in invitations and requests are now included in the notice email

If you have any questions or comments, please let us know.

BuddyPress 2.6.0 Release Candidate 1…

BuddyPress 2.6.0 Release Candidate 1 is now available for testing. Please let us know of any issues via our issues tracker or on the BuddyPress support forums.

Thanks in advance for your help!

Changes to Some Extended Profile Input Types in BP 2.6.0

For BuddyPress 2.6.0, the core team worked to improve the structure of several extended profile input field types to improve the accessibility of the fields and also make them easier for developers to style. The field types that have been updated are checkboxes, radio buttons, and date boxes.

All three types have been restructured as <fieldset>s with the label for the field residing in the field set’s <legend>.

Checkboxes and radio buttons options have been wrapped in a new <div> with the class input-options and either checkbox-options or radio-button-options. Additionally, the labels for the individual options have been given the class option-label. These changes taken together should make it much easier to target option labels to apply styling. (Goodbye .selector > label + label to catch option labels!)

Date boxes have similarly gained a wrapper <div> with the classes input-options and datebox-selects around the three selects.

Here are some examples of how the code output for these fields has changed:

<!-- Checkbox inputs, before changes -->
<div class="editfield field_2 field_core-makeup optional-field visibility-public alt field_type_checkbox">
  <div class="checkbox">
    <label for="field_2">Core makeup</label>
    <label for="field_11_0"><input name="field_2[]" id="field_11_0" value="Goat" type="checkbox">Goat</label>
    <label for="field_12_1"><input name="field_2[]" id="field_12_1" value="Rhinoceros" type="checkbox">Rhinoceros</label>
    <label for="field_13_2"><input name="field_2[]" id="field_13_2" value="Slow Loris" type="checkbox">Slow Loris</label>
  </div>
</div>

<!-- Checkbox inputs, after changes -->
<div class="editfield field_2 field_core-makeup optional-field visibility-public alt field_type_checkbox">  
  <fieldset class="checkbox">
    <legend>Core makeup</legend>
    <div id="field_2" class="input-options checkbox-options">
      <label for="field_11_0" class="option-label"><input name="field_2[]" id="field_11_0" value="Goat" type="checkbox">Goat</label>
      <label for="field_12_1" class="option-label"><input name="field_2[]" id="field_12_1" value="Rhinoceros" type="checkbox">Rhinoceros</label>
      <label for="field_13_2" class="option-label"><input name="field_2[]" id="field_13_2" value="Slow Loris" type="checkbox">Slow Loris</label>
    </div>
  </fieldset>
</div>

<!-- Radio button inputs, before changes -->
<div class="editfield field_6 field_home-turf optional-field visibility-public field_type_radio">
  <div class="radio">
    <label for="field_6">Home turf</label>
    <div id="field_6">
      <label for="option_7"><input name="field_6" id="option_7" value="Honali" type="radio">Honali</label>
      <label for="option_8"><input name="field_6" id="option_8" value="Fantastica" type="radio">Fantastica</label>
      <label for="option_9"><input name="field_6" id="option_9" value="Toledo" type="radio">Toledo</label>
    </div>
  </div>
</div>

<!-- Radio button inputs, after changes -->
<div class="editfield field_6 field_home-turf optional-field visibility-public field_type_radio">
  <fieldset class="radio">
    <legend>Home turf</legend>
    <div id="field_6" class="input-options radio-button-options">
      <label for="option_7" class="option-label"><input name="field_6" id="option_7" value="Honali" type="radio">Honali</label>
      <label for="option_8" class="option-label"><input name="field_6" id="option_8" value="Fantastica" type="radio">Fantastica</label>
      <label for="option_9" class="option-label"><input name="field_6" id="option_9" value="Toledo" type="radio">Toledo</label>
    </div>      
  </fieldset>
</div>

<!-- Date box inputs, before changes -->
<div class="editfield field_10 field_birth-date optional-field visibility-public alt field_type_datebox">
  <div class="datebox">
    <label for="field_10_day">Birth date</label>
      
    <label for="field_10_day" class="bp-screen-reader-text">Select day</label>
    <select id="field_10_day" name="field_10_day">
      ...Day options...
    </select>

    <label for="field_10_month" class="bp-screen-reader-text">Select month</label>
    <select id="field_10_month" name="field_10_month">
      ...Month options...
    </select>

    <label for="field_10_year" class="bp-screen-reader-text">Select year</label>
    <select id="field_10_year" name="field_10_year">
      ...Year options...    
    </select>
  </div>
</div>

<!-- Date box inputs, after changes -->
<div class="editfield field_10 field_birth-date optional-field visibility-public alt field_type_datebox">
  <fieldset class="datebox">
    <legend>Birth date</legend>

    <div class="input-options datebox-selects">
      <label for="field_10_day" class="bp-screen-reader-text">Select day</label>
      <select id="field_10_day" name="field_10_day">
        ...Day options...
      </select>

      <label for="field_10_month" class="bp-screen-reader-text">Select month</label>
      <select id="field_10_month" name="field_10_month">
        ...Month options...
      </select>

      <label for="field_10_year" class="bp-screen-reader-text">Select year</label>
      <select id="field_10_year" name="field_10_year">
        ...Year options...
      </select>
    </div>
  </fieldset>
</div>

These changes represent a continued effort to update and improve BP templates and the markup they use. In this case we’ve aimed for improved accessibility by structuring our form markup using meaningful groupings of semantic elements and homogenized rendering across browsers and devices. If you have styled the above-mentioned form controls, please review your styles and make the necessary changes, if any.

Read more about these changes at #7083 and #6678.

#6678, #7083

BuddyPress 2.6.0 Beta 1

BuddyPress 2.6.0 Beta 1 is now available. Thanks in advance for helping us find problems by testing the beta on your weird multi-network setups!

BuddyPress Work Parties

At the end of the 2.5 development cycle, a rare event occurred: many friends of BuddyPress happened to be working together (I mean at the same time and in the same Slack channel–we always work together in spirit 🙂 ). It was super productive and entertaining, to boot. Let’s try to harness the magic again.

If you’d like to help out, please join us at these times:

  • Tuesday, April 5, 1400–1700
  • Thursday, April 14, 1900–2200

You can help out by adding new tickets, commenting on tickets, testing patches, writing patches, writing content for the Codex, answering questions on the BuddyPress support forum, or offering moral support. We’d love to have you.

#work-party