Teams for WooCommerce Memberships Developer Documentation

This document provides an overview of structure, hooks, and helpful methods in Teams for WooCommerce Memberships. To make adjustments to plugin functionality in an upgrade-safe manner, you should be very familiar with WordPress hooks — actions and filters — as these allow you to make modifications to plugin behavior.

Our goal is to ensure this plugin is easy to work with for customizations. If a hook doesn’t exist where you think it should, please submit a ticket so we can consider its addition.

This reference lists helpful filters, actions, and methods and is meant to be a directory. This document may not outline every available or hook or method, so please see the plugin’s inline documentation for additional details on parameters, returned values, and usage, or example usage.

Please be aware that this document is meant for developers to use as a reference, and some of these code samples are structural samples rather than working snippets. We do not support or do plugin customizations as per our support policy. You can get in touch with an expert for help with customizations.

If you need help changing this code or extending it, we recommend getting in touch with a WooExpert.

Please be aware that the plugin namespace is \SkyVerge\WooCommerce\Memberships\Teams -- references to classes in this document will prefix global namespaces or complete namespaces with a backslash (\); a relative class name, such as "Team", implies that this object would live in the plugin namespace, such as \SkyVerge\WooCommerce\Memberships\Teams\Team

Data Structure

↑ Back to top

Teams for WC Memberships leverages a few custom data structures, but you would also benefit from being familiar with the data structure of WooCommerce Memberships itself. The Memberships Data Structure overview and developer documentation will be helpful resources.

We also recommend reviewing the methods in the WC_Memberships_User_Membership class, as these methods are quite commonly used by developers to manipulate user memberships. User memberships can easily be instantiated with the wc_memberships_get_user_membership() global method.

For its own functionality, Teams adds a “team” and “invitation” custom post type to manage groups of members, and invitations to join a team. Teams also makes modifications to particular products and membership plans to store additional data related to purchasing a team, and managing team access.

Teams

↑ Back to top

Post type: wc_memberships_team

The team post serves as a data store for all team information, such as purchase record, owner, and members (along with the roles of each member on the team).

The team owner is stored as the post_author, given a team can only have one owner, and the configured team name is stored as the post_title. The team’s post_parent is the post ID of the Membership Plan to which the team grants access (as currently a team can only provide access to a single plan).

Team posts store other data about the team as well:

meta keydata typestored value
_product_idintthe ID for the product that was purchased to create the team
_order_idintthe ID for the order in which the team was purchased
_subscription_idintif the team was purchased via a subscription product, this is the ID of the subscription to which access is tied
_seat_countintthe maximum number of available seats on this team
_member_idintthe ID of a member on the team; there can be multiple pieces of _member_id metadata if multiple seats are occupied
_membership_end_datestringthe day membership start to expire, based on the plan length; owners cannot remove members after this date if removals are enabled

Team Invitation

↑ Back to top

Post type: wc_team_invitation

Invitation posts store data about invitations sent to particular emails. The invitation post will use custom statuses to determine the invitation status: wcmti-pending, wcmti-accepted, or wcmti-cancelled. The post_author is the user who sent the invitation, while the post_parent is the team to which the invitation belongs.

Pending invitations will store no meta, but accepted invitations will add 2 pieces of meta data:

meta keydata typestored value
_accepted_user_idintthe user ID of the customer who accepted the invitation
_accepted_datestringthe date on which the invitation was accepted

Product Data

↑ Back to top

To associate a team with a product or variation, the product post will store a few pieces of data:

meta keydata typestored value
_wc_memberships_for_teams_has_team_membershipstringyes or no
_wc_memberships_for_teams_pricingstringper_member or per_team (dictates the pricing fields for the team)
_wc_memberships_for_teams_max_member_countintthe maximum seats that a team can have upon purchase
_wc_memberships_for_teams_min_member_countintthe minimum seats required to purchase a team
_wc_memberships_for_teams_planintthe ID of the membership plan to which the team will have access

User capabilities

↑ Back to top

Teams provides a few custom WP User capabilities for both admin management of teams, and frontend management for team owners and managers.

capabilitydescriptiondefault roles
memberships_teamgrants admin access to manage teamsWP: administrator
WP: shop manager
wc_memberships_for_teams_renew_team_membershiplets a user renew team accessteam owner
wc_memberships_for_teams_manage_team_settingslets a user manage team settings (e.g., name)team owner
wc_memberships_for_teams_manage_team
wc_memberships_for_teams_manage_team_members
lets a user manage a team and which members belongteam owner
team manager
wc_memberships_for_teams_remove_team_memberlets a user remove team membersteam owner
team manager

Team Lifecycle

↑ Back to top

You can hook into the team lifecycle at several instances to fire third party code or adjust teams.

Created Team Filters

↑ Back to top

When a new team is created, the team data can be filtered.

wc_memberships_for_teams_new_team_data

@since 1.0.0

@param array $data team data

@param array $args an array of team arguments {

  • @type string $name the team name
  • @type int $plan_id the plan id the team has access to
  • @type int $owner_id the user id the team is assigned to
  • @type int $product_id the product id that creates the team (optional)
  • @type int $order_id the order id that contains the product that creates the team (optional)

}

Created Team Actions

↑ Back to top

Team creation and management also fires several actions that can be used to run additional code.

wc_memberships_for_teams_team_created

Fires after a team has been created. This action hook is similar to wc_memberships_for_teams_team_saved but doesn’t fire when teams are manually created from admin.

@since 1.0.0

@param Team $team the team that was just created

@param bool $updating whether this is a post update or a newly created team

wc_memberships_for_teams_team_saved

Fires after a team has been created. This action hook is similar to wc_memberships_for_teams_team_created but will also fire when a team is manually created in admin, or upon an import or via command line interface, etc.

@since 1.0.0

@param Team $team the team that was just saved

@param bool $updating whether this is a post update or a newly created team

wc_memberships_for_teams_process_team_meta

Fires when a team is saved/updated from admin.

@since 1.0.0

@param int $post_id post identifier

@param \WP_Post $post the post object

Invitation Lifecycle

↑ Back to top

You can hook into the team lifecycle at several instances to fire third party code or adjust invitations.

Created Invitation Filters

↑ Back to top

When a new invitation is created, the invitation data can be filtered.

wc_memberships_for_teams_new_invitation_post_data

@since 1.0.0

@param array $data new invitation post data

@param array $args array of Invitation arguments {

  • @type string $email email of the invitation recipient
  • @type int $team_id the team id
  • @type int $sender_id the sender user id
  • @type string $role the role to assign the invited user to

}

wc_memberships_for_teams_join_team_redirect_to

Filters the URL to redirect to when a user joins a team by invitation or via link

@since 1.0.4

@param string $redirect_to URL to redirect to

@param \SkyVerge\WooCommerce\Memberships\Teams\Team $team
the team object

@param false|\SkyVerge\WooCommerce\Memberships\Teams\Invitation $invitation
the invitation object

Created Invitation Actions

↑ Back to top

Invitation creation will also fire an action that can be used to run additional code.

wc_memberships_for_teams_invitation_created

Fires after an invitation has been created.

@since 1.0.0

@param \SkyVerge\WooCommerce\Memberships\Teams\Invitation $invitation
the invitation that was just created

Frontend Hooks

↑ Back to top

This is a non-exhaustive list; these represent some often-used frontend hooks.

Frontend Filters

↑ Back to top

wc_memberships_for_teams_product_team_user_input_fields

Filters user input fields for a team product.

@since 1.0.0

@param array $fields associative array of user input fields

@param \WC_Product $product the product

wc_memberships_for_teams_add_team_member_form_fields

Filters form fields for the add team member form on frontend.

@since 1.0.0

@param array $fields associative array of form fields

wc_memberships_team_teams_area_sections

Filters the available sections for the teams area.

@since 1.0.0

@param array $sections associative array with teams area id and label of each section

wc_memberships_for_teams_teams_area_{$section_id}_title

Filters the teams area section name title. Core section IDs include “members”, “add-member”, and “settings”.

@since 1.0.0

@param string $section_name
the section name (e.g. “Members”, “Add Member”, “Settings”…)

@param Team $team the current team displayed

wc_memberships_for_teams_teams_area_my_team_details

Filters the teams area team details.

@since 1.0.0

@param array $details
associative array of settings labels and HTML content for each row

@param Team $team the team the details are for

Frontend Actions

↑ Back to top

wc_memberships_for_teams_before_renewal_auto_login

Fires right before logging a team member in. Can throw \SV_WC_Plugin_Exception to halt the login completely.

@since 1.0.0

@param int $log_in_user_id the user ID of the member to log in

@param \SkyVerge\WooCommerce\Memberships\Teams\Team $team team instance

@param bool $allow_login whether automatic log in is allowed

Admin Hooks

↑ Back to top

This is a non-exhaustive list; these represent some often-used admin hooks.

Admin Filters

↑ Back to top

wc_memberships_for_teams_team_member_roles

Filters the list of available team member roles. Note that this does not include owner by design.

@since 1.0.0

@param array $roles an associative array of role => label pairs

wc_memberships_for_teams_settings

Filters Memberships for Teams settings.

@since 1.0.0

@param array $settings array of teams settings

wc_memberships_for_teams_invitation_statuses

Filters invitation statuses.

@since 1.0.0

@param array $statuses associative array of statuses and their arguments

wc_memberships_for_teams_skip_invitations

Filters sending an invitation when adding members to a team

@since 1.1.2

@param bool $skip_invitations whether invitations should be skipped

@param null|\SkyVerge\WooCommerce\Memberships\Teams\Team
optional argument to evaluate if invitations should be skipped for a particular team

@param null|int|string|\WP_User
optional entity being invited to join a team (either email, ID or object)

wc_memberships_for_teams_team_membership_can_be_renewed

Filters whether a team membership can be renewed @since 1.0.0 @param bool $can_be_renewed whether can be renewed by a user @param \SkyVerge\WooCommerce\Memberships\Teams\Team $team the team to renew membership for

wc_memberships_for_teams_team_management_status

Filters team management status

@since 1.0.0

@param array
an associative array with two keys: “can_be_managed” and “messages”

@param \SkyVerge\WooCommerce\Memberships\Teams\Team $team
the related team

wc_memberships_for_teams_team_can_add_seats

Filters whether a team can have seats added

@since 1.1.0

@param bool $can_add_seats whether seats can be added

@param \SkyVerge\WooCommerce\Memberships\Teams\Team $this
the Team object

wc_memberships_for_teams_team_can_remove_seats

Filters whether a team can have seats removed

@since 1.1.0

@param bool $can_remove_seats whether seats can be removed

@param \SkyVerge\WooCommerce\Memberships\Teams\Team $this
the Team object

wc_memberships_for_teams_allow_editing_user_membership

Filters the editing of a user membership

@since 1.1.2

@param bool $allow_edit default true for non-subscription linked memberships

@param \WC_Memberships_User_Membership|\WC_Memberships_Integration_Subscriptions_User_Membership $user_membership
membership object

wc_memberships_for_teams_should_perform_seat_change

Filters whether a seat change should be performed

@since 1.1.0

@param bool $should_perform_seat_change

@param \SkyVerge\WooCommerce\Memberships\Teams\Team $this
the Team object

@param int $new_seat_count the desired seat count

wc_memberships_for_teams_should_prorate_seat_change

Filters whether a seat change should be prorated

@since 1.1.0

@param bool $should_prorate_seat_change default false

@param \SkyVerge\WooCommerce\Memberships\Teams\Team $this
the Team object

@param int $new_seat_count the desired seat count

wc_memberships_for_teams_seat_change_notice_message

Filters the notice message that is shown after a successful seat change

@since 1.1.0

@param string $seat_change_message the notice message

@param WC_Order $order the order object

@param \WC_Order_Item $item
the order item object that contains the seat change data

@param \SkyVerge\WooCommerce\Memberships\Teams\Team $this
the Team object

Admin Actions

↑ Back to top

wc_memberships_for_teams_before_team_billing_details

Fires before the billing details in edit team screen.

@since 1.0.0

@param \SkyVerge\WooCommerce\Memberships\Teams\Team $team
the team instance

wc_memberships_for_teams_after_team_billing_details

Fires before the billing details in edit team screen.

@since 1.0.0

@param \SkyVerge\WooCommerce\Memberships\Teams\Team $team
the team instance

Methods and Global Functions

↑ Back to top

This is a non-exhaustive list; these represent some often-used plugin methods.

Plugin main class

↑ Back to top

The instance of the main plugin class can be accessed with: wc_memberships_for_teams()

Any other plugin classes are instantiated in this main plugin class, or another class that’s instantiated by the main plugin class. Therefore, if you want to unhook methods in a particular class, you’ll need to use this helper to access the class instance. For example, many classes are instantiated by the main plugin class, and can be accessed with:

wc_memberships_for_teams()->get_*_instance()

For example:

wc_memberships_for_teams()->get_orders_instance()

Classes that are not instantiated in the main plugin class can be accessed through instances of the class that instantiates them:

wc_memberships_for_teams()->get_frontend_instance()->get_teams_area_instance()

Teams object

↑ Back to top

While we won’t list every method here, the Team object is a good one to review, as this provides methods to get or set almost any piece of team data, or programmatically process seat changes, member invites, adding or removing members, etc.

An instance of this class can be accessed with:

wc_memberships_for_teams_get_team( $team_id_or_post )

Conditional Checks

↑ Back to top

There are a few conditional checks that can help you determine team or product information.

wc_memberships_for_teams_is_valid_team_member_role( $role )

Checks if a team member role is valid or not.

@since 1.0.0

@param string $role the role to check

\SkyVerge\WooCommerce\Memberships\Teams\Product::has_team_membership( $product )

Checks if a product has a team membership attached (purchasing this product creates a team). You must pass an instance of WC_Product to this method.

@since 1.0.0

@param \WC_Product $product

\SkyVerge\WooCommerce\Memberships\Teams\Product::has_per_member_pricing( $product )

Checks if a product uses per-member pricing (false if per-team pricing is used). You must pass an instance of WC_Product to this method.

@since 1.0.0

@param \WC_Product $product

Global & Static Functions

↑ Back to top

A non-exhaustive list of some helpful global and static methods for use in customizations.

\SkyVerge\WooCommerce\Memberships\Teams\Product::get_min_member_count( $product )

Gets the minimum member count required to purchase the team product; returns the integer count or null if not set. You must pass an instance of WC_Product to this method.

@since 1.0.0

@param \WC_Product $product

\SkyVerge\WooCommerce\Memberships\Teams\Product::get_max_member_count( $product )

Gets the maximum member count allowed when purchasing the team product; returns the integer count or null if not set. You must pass an instance of WC_Product to this method.

@since 1.0.0

@param \WC_Product $product

\SkyVerge\WooCommerce\Memberships\Teams\Product::get_membership_plan_id( $product )

Gets the membership plan ID that will be granted to a team created via this product; returns the integer count or null if not set. You must pass an instance of WC_Product to this method.

@since 1.0.0

@param \WC_Product $product

wc_memberships_for_teams_get_team( $id_or_post )

Can be used to get an instance of a team. Accepts the team post object or post ID. Returns a Team instance if found, or false on failure.

@since 1.0.0

@param int|\WP_Post $post
optional team id or post object, defaults to current global post object

wc_memberships_for_teams_get_teams( $user_id, $args, $return, $force_refresh )

Returns a list of teams for a user (should be preferred over get_posts() calls to protect against data structure changes). Can return either a plain list of team objects or an associative array with query results and team objects, and will return false on failure.

@since 1.0.0

@param int $user_id optional, defaults to current user

@param array $args
an array of arguments to pass to \WP_Query – additionally, a few special arguments can be passed:

{

  • @type string|array $status team status, defaults to ‘any’
  • @type string|array $role a comma-separated list or array of team member roles, defaults to ‘owner, manager’ – specifying this will only fetch teams that the user has one of the given roles
  • @type int $paged the page number for paging the results (corresponds to paged param for get_posts())

}

@param string $return
(optional) what to return – set to ‘query’ to return the \WP_Query instance instead of a list of invitation instances

@param bool $force_refresh
(optional) whether to force reloading the results even if a previous result has been memoized, defaults to false

wc_memberships_for_teams_get_user_membership_team( $user_membership_id )

Returns the team for a given user membership, if any. Returns false if the membership does not belong to a team.

@since 1.0.0

@param int $user_membership_id user membership id

wc_memberships_for_teams_get_team_members( $team_id, $args, $return, $null )

Returns a list of team members given the input query (should be preferred over get_posts() calls to protect against data structure changes). Can return either a plain list of team member objects or an associative array with query results and team member objects.

@since 1.0.0

@param int|\SkyVerge\WooCommerce\Memberships\Teams\Team $team_id
team id or instance to get the team members for

@param array $args
(optional) an array of arguments to pass to \WP_Query – additionally, a few special arguments can be passed:

{

  • @type string|array $role a comma-separated list or array of team member roles, empty by default – specifying this will only fetch members with the given role
  • @type int $paged the page number for paging the results, corresponds to paged param for get_users()
  • @type int $per_page the number of team members to fetch per page, corresponds to the number param for get_users()

}

@param string $return
(optional) what to return – set to ‘query’ to return the \WP_User_Query instance instead of a list of team member instances

@param bool $force_refresh
(optional) whether to force reloading the results even if a previous result has been memoized, defaults to false

wc_memberships_for_teams_get_team_member_roles()

Returns a an associative array of available team member roles.

@since 1.0.0

wc_memberships_for_teams_create_team( $args )

Programmatically creates a team. Returns a new Team object on success which can then be used to add additional data, but will return \SV_WC_Plugin_Exception on failure.

@since 1.0.0

@param array $args (see below)

@param string $action ‘create’ or ‘renew’; defaults to ‘create’

@return Team|\SV_WC_Plugin_Exception

The arguments you can pass in to create a new team are as follows:

array keydata typerequiredvalue
owner_idintrequiredowner user ID
plan_idint|\WC_Memberships_Planrequiredplan ID or instance to which the team will have access
product_idint|\WC_Productproduct ID or instance that can be used to purchase the team; required if a team should be renewable
order_idint\WC_OrderID or instance of the order in which the team was purchased
namestringteam name; defaults to “Team”
seatsintthe seat count for the team; if not provided, product_id must be specified, and the team will use the max member count from the product/variation

wc_memberships_for_teams_create_invitation( $args )

Programmatically creates a team invitation. Returns a new Invitation object on success which can then be used to add additional data, but will throw \SV_WC_Plugin_Exception on failure.

@since 1.0.0

@param array $args (see below)

@return Invitation|\SV_WC_Plugin_Exception

The arguments you can pass in to create a new invitation are as follows:

array keydata typerequiredvalue
team_idint|objectrequiredteam ID or instance for the invitation
emailstringrequiredthe email address to which the invitation should be sent
sender_idintthe sender’s user ID (default: current user)
rolestringthe team role to assign to the invited user, defaults to ‘member’

wc_memberships_for_teams_get_invitation( $id, $email )

Returns a specific invitation for a team, or false on failure.

@since 1.0.0

@param string|int|\WP_Post|Invitation|Team $id
invitation token, id, or instance; or team id or instance

@param string $email
(optional) invitation recipient email, required if $id is a team id or instance

wc_memberships_for_teams_get_invitations( $team_id, $args, $return, $force_refresh )

Returns a list of invitations (should be preferred over get_posts() calls to protect against data structure changes). Can return either a plain list of invitation objects or an associative array with query results and invitation objects.

@since 1.0.0

@param int $team_id
team id to get the invitations for

@param array $args
an array of arguments to pass to \WP_Query – additionally, a few special arguments can be passed:

{

  • @type string|array $status invitation status, defaults to ‘pending’, can be used instead of $post_status
  • string|array $role a comma-separated list or array of team member roles, empty by default – specifying this will only fetch invitations that grant the one of thge specified roles for the user
  • @type int $paged the page number for paging the results, corresponds to paged param for get_posts()
  • @type int $per_page the number of invitations to fetch per page, corresponds to the posts_per_page param for get_posts()

}

@param

@param string $return
(optional) what to return – set to ‘query’ to return the \WP_Query instance instead of a list of invitation instances

@param bool $force_refresh
(optional) whether to force reloading the results even if a previous result has been memoized, defaults to false

User Documentation

↑ Back to top

Return to user documentation →

Related Products

Let customers subscribe to your products or services and pay on a weekly, monthly or annual basis.

Power your membership association, online magazine, elearning sites, and more with access control to content/products and member discounts.