BP_REST_XProfile_Types_Endpoint
XProfile Type endpoints.
Description
Use /xprofile/types
Source
File: bp-xprofile/classes/class-bp-rest-xprofile-types-endpoint.php
class BP_REST_XProfile_Types_Endpoint extends WP_REST_Controller {
/**
* Constructor.
*
* @since 0.1.0
*/
public function __construct() {
$this->namespace = bp_rest_namespace() . '/' . bp_rest_version();
$this->rest_base = buddypress()->profile->id . '/types';
}
/**
* Register the component routes.
*
* @since 0.1.0
*/
public function register_routes() {
register_rest_route(
$this->namespace,
'/' . $this->rest_base,
array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => array( $this, 'get_items' ),
'permission_callback' => array( $this, 'get_items_permissions_check' ),
'args' => $this->get_collection_params(),
),
'schema' => array( $this, 'get_item_schema' ),
)
);
}
/**
* Retrieve XProfile Types.
*
* @param WP_REST_Request $request Full data about the request.
*
* @return WP_REST_Response
* @since 0.1.0
*
* @api {GET} /wp-json/buddyboss/v1/xprofile/types Profile Types
* @apiName GetBBProfileTypes
* @apiGroup Profile Fields
* @apiDescription Retrieve Profile Types.
* @apiVersion 1.0.0
* @apiPermission LoggedInUser if the site is in Private Network.
*/
public function get_items( $request ) {
$registered_types = bp_get_member_types( array(), 'objects' );
$retval = array();
if ( ! empty( $registered_types ) ) {
foreach ( $registered_types as $type ) {
$retval[] = $this->prepare_response_for_collection(
$this->prepare_item_for_response( $type, $request )
);
}
}
$response = rest_ensure_response( $retval );
/**
* Fires after a list of field are fetched via the REST API.
*
* @param array $registered_types Fetched member types
* @param WP_REST_Response $response The response data.
* @param WP_REST_Request $request The request sent to the API.
*
* @since 0.1.0
*/
do_action( 'bp_rest_xprofile_types_get_items', $registered_types, $response, $request );
return $response;
}
/**
* Check if a given request has access to XProfile Types.
*
* @param WP_REST_Request $request Full data about the request.
*
* @return bool
* @since 0.1.0
*/
public function get_items_permissions_check( $request ) {
$retval = true;
if ( function_exists( 'bp_enable_private_network' ) && true !== bp_enable_private_network() && ! is_user_logged_in() ) {
$retval = new WP_Error(
'bp_rest_authorization_required',
__( 'Sorry, Restrict access to only logged-in members.', 'buddyboss' ),
array(
'status' => rest_authorization_required_code(),
)
);
}
if ( true === $retval && function_exists( 'bp_member_type_enable_disable' ) && false === bp_member_type_enable_disable() ) {
$retval = new WP_Error(
'bp_rest_authorization_required',
__( 'Sorry, Profile Types is disabled from setting.', 'buddyboss' ),
array(
'status' => rest_authorization_required_code(),
)
);
}
/**
* Filter the XProfile types `get_items` permissions check.
*
* @param bool $retval Returned value.
* @param WP_REST_Request $request The request sent to the API.
*
* @since 0.1.0
*/
return apply_filters( 'bp_rest_xprofile_types_get_items_permissions_check', $retval, $request );
}
/**
* Prepares single XProfile type to return as an object.
*
* @param array $type Xprofile Type.
* @param WP_REST_Request $request Full data about the request.
*
* @return WP_REST_Response
* @since 0.1.0
*/
public function prepare_item_for_response( $type, $request ) {
$data = array(
'labels' => array(
'name' => ( isset( $type->labels['name'] ) && ! empty( $type->labels['name'] ) ) ? $type->labels['name'] : '',
'singular_name' => ( isset( $type->labels['singular_name'] ) && ! empty( $type->labels['singular_name'] ) ) ? $type->labels['singular_name'] : '',
),
'has_directory' => ( isset( $type->has_directory ) ? $type->has_directory : false ),
'name' => ( isset( $type->name ) ? $type->name : '' ),
'directory_slug' => ( isset( $type->directory_slug ) ? $type->directory_slug : '' ),
);
// Get the edit schema.
$schema = $this->get_item_schema();
$schema = $schema['properties'];
$post_id = $this->bp_rest_member_type_post_by_type( $type->name );
// Define default visibility property.
if ( isset( $schema['enable_filter'] ) ) {
if ( ! empty( $post_id ) ) {
$data['enable_filter'] = (
! empty( get_post_meta( $post_id, '_bp_member_type_enable_filter', true ) )
? get_post_meta( $post_id, '_bp_member_type_enable_filter', true )
: (
// Added support for BP Member Types.
! empty( get_post_meta( $post_id, '_bp_member_type_enable_directory', true ) )
? get_post_meta( $post_id, '_bp_member_type_enable_directory', true )
: false
)
);
} else {
$data['enable_filter'] = false;
}
}
// Define default visibility property.
if ( isset( $schema['enable_remove'] ) ) {
if ( ! empty( $post_id ) ) {
$data['enable_remove'] = (
! empty( get_post_meta( $post_id, '_bp_member_type_enable_remove', true ) )
? get_post_meta( $post_id, '_bp_member_type_enable_remove', true )
: false
);
} else {
$data['enable_remove'] = false;
}
}
// Define default visibility property.
if ( isset( $schema['enable_profile_field'] ) ) {
if ( ! empty( $post_id ) ) {
$data['enable_profile_field'] = (
! empty( get_post_meta( $post_id, '_bp_member_type_enable_profile_field', true ) )
? get_post_meta( $post_id, '_bp_member_type_enable_profile_field', true )
: (
// Added support for BP Member Types.
! empty( get_post_meta( $post_id, '_bp_member_type_enable_registration', true ) )
? get_post_meta( $post_id, '_bp_member_type_enable_registration', true )
: false
)
);
} else {
$data['enable_profile_field'] = false;
}
}
// Define default visibility property.
if ( isset( $schema['bp-group-type'] ) ) {
$get_all_registered_group_types = bp_groups_get_group_types( array(), 'names' );
$get_selected_group_types = ( ! empty( $post_id ) && ! empty( get_post_meta( $post_id, '_bp_member_type_enabled_group_type_create', true ) ) ) ? get_post_meta( $post_id, '_bp_member_type_enabled_group_type_create', true ) : array();
$group_types = array();
if ( ! empty( $get_all_registered_group_types ) ) {
foreach ( $get_all_registered_group_types as $group_type ) {
$group_types[] = array(
'name' => $group_type,
'selected' => in_array( $group_type, $get_selected_group_types, true ),
);
}
}
$data['bp-group-type'] = $group_types;
}
// Define default visibility property.
if ( isset( $schema['bp-group-type-auto-join'] ) ) {
$get_all_registered_group_types = bp_groups_get_group_types( array(), 'names' );
$get_selected_group_types = ( ! empty( $post_id ) && ! empty( get_post_meta( $post_id, '_bp_member_type_enabled_group_type_auto_join', true ) ) ) ? get_post_meta( $post_id, '_bp_member_type_enabled_group_type_auto_join', true ) : array();
$group_types_auto_join = array();
if ( ! empty( $get_all_registered_group_types ) ) {
foreach ( $get_all_registered_group_types as $group_type ) {
$group_types_auto_join[] = array(
'name' => $group_type,
'selected' => in_array( $group_type, $get_selected_group_types, true ),
);
}
}
$data['bp-group-type-auto-join'] = $group_types_auto_join;
}
// Define default visibility property.
if ( isset( $schema['bp-member-type-enabled-invite'] ) ) {
if ( ! empty( $post_id ) ) {
$data['bp-member-type-enabled-invite'] = (
! empty( get_post_meta( $post_id, '_bp_member_type_enable_invite', true ) )
? get_post_meta( $post_id, '_bp_member_type_enable_invite', true )
: false
);
} else {
$data['bp-member-type-enabled-invite'] = false;
}
}
// Define default visibility property.
if ( isset( $schema['bp-member-type-invite'] ) ) {
$member_types = bp_get_member_types( array(), 'names' );
$get_selected_member_types = ( ! empty( $post_id ) && ! empty( get_post_meta( $post_id, '_bp_member_type_allowed_member_type_invite', true ) ) ) ? get_post_meta( $post_id, '_bp_member_type_allowed_member_type_invite', true ) : array();
$member_types_invite = array();
if ( ! empty( $member_types ) ) {
foreach ( $member_types as $member_type ) {
$member_types_invite[] = array(
'name' => $member_type,
'selected' => in_array( $member_type, $get_selected_member_types, true ),
);
}
}
$data['bp-member-type-invite'] = $member_types_invite;
}
// Define default visibility property.
if ( isset( $schema['wp_roles'] ) ) {
if ( ! empty( $post_id ) ) {
$data['wp_roles'] = get_post_meta( $post_id, '_bp_member_type_wp_roles', true );
} else {
$data['wp_roles'] = '';
}
}
$response = rest_ensure_response( $data );
/**
* Filter the XProfile field returned from the API.
*
* @param WP_REST_Response $response The response data.
* @param WP_REST_Request $request Request used to generate the response.
* @param array $type Xprofile Type
*
* @since 0.1.0
*/
return apply_filters( 'bp_rest_xprofile_types_prepare_value', $response, $request, $type );
}
/**
* Get the XProfile types schema, conforming to JSON Schema.
*
* @return array
* @since 0.1.0
*/
public function get_item_schema() {
$schema = array(
'$schema' => 'http://json-schema.org/draft-04/schema#',
'title' => 'bp_xprofile_types',
'type' => 'object',
'properties' => array(
'labels' => array(
'context' => array( 'embed', 'view', 'edit' ),
'description' => __( 'Labels to use in various parts of the interface.', 'buddyboss' ),
'type' => 'object',
'arg_options' => array(
'sanitize_callback' => null,
'validate_callback' => null,
),
'properties' => array(
'name' => array(
'description' => __( 'Default name. Should typically be plural.', 'buddyboss' ),
'type' => 'string',
'context' => array( 'embed', 'view', 'edit' ),
'readonly' => true,
),
'singular_name' => array(
'description' => __( 'Singular name.', 'buddyboss' ),
'type' => 'string',
'context' => array( 'embed', 'view', 'edit' ),
'readonly' => true,
),
),
),
'has_directory' => array(
'description' => __( 'Whether the profile type should have its own type-specific directory.', 'buddyboss' ),
'type' => 'boolean',
'context' => array( 'embed', 'view', 'edit' ),
'readonly' => true,
),
'name' => array(
'description' => __( 'Slug of the member type.', 'buddyboss' ),
'type' => 'string',
'context' => array( 'embed', 'view', 'edit' ),
'readonly' => true,
),
'directory_slug' => array(
'description' => __( 'Directory slug of the member type.', 'buddyboss' ),
'type' => 'string',
'context' => array( 'embed', 'view', 'edit' ),
'readonly' => true,
),
),
);
$post_types = get_post_types();
if (
! empty( $post_types )
&& (
in_array( 'bp-member-type', $post_types, true )
|| in_array( 'bmt-member-type', $post_types, true ) // Added support for BP Member Types.
)
) {
$schema['properties']['enable_filter'] = array(
'description' => __( 'Display this profile type in "Types" filter in Members Directory.', 'buddyboss' ),
'type' => 'boolean',
'context' => array( 'embed', 'view', 'edit' ),
'readonly' => true,
);
$schema['properties']['enable_remove'] = array(
'description' => __( 'Hide all members of this type from Members Directory.', 'buddyboss' ),
'type' => 'boolean',
'context' => array( 'embed', 'view', 'edit' ),
'readonly' => true,
);
$schema['properties']['enable_profile_field'] = array(
'description' => __( 'Allow users to self-select as this profile type from the "Profile Type" profile field dropdown.', 'buddyboss' ),
'type' => 'boolean',
'context' => array( 'embed', 'view', 'edit' ),
'readonly' => true,
);
if (
bp_is_active( 'groups' )
&& function_exists( 'bp_restrict_group_creation' )
&& false === bp_restrict_group_creation()
) {
$schema['properties']['bp-group-type'] = array(
'description' => __( 'Which group types this profile type is allowed to create.', 'buddyboss' ),
'type' => 'object',
'context' => array( 'embed', 'view', 'edit' ),
'readonly' => true,
);
}
if (
bp_is_active( 'groups' )
&& function_exists( 'bp_disable_group_type_creation' )
&& function_exists( 'bp_enable_group_auto_join' )
&& true === bp_disable_group_type_creation()
&& true === bp_enable_group_auto_join()
) {
$schema['properties']['bp-group-type-auto-join'] = array(
'description' => __( 'Group types will automatically approve all membership requests from users of this profile type.', 'buddyboss' ),
'type' => 'object',
'context' => array( 'embed', 'view', 'edit' ),
'readonly' => true,
);
}
if (
bp_is_active( 'invites' )
&& function_exists( 'bp_disable_invite_member_type' )
&& true === bp_disable_invite_member_type()
) {
$schema['properties']['bp-member-type-enabled-invite'] = array(
'description' => __( 'Allow members to select the profile type that the invited recipient will be automatically assigned to on registration.', 'buddyboss' ),
'type' => 'boolean',
'context' => array( 'embed', 'view', 'edit' ),
'readonly' => true,
);
$schema['properties']['bp-member-type-invite'] = array(
'description' => __( 'Allowed profile types to select on the email invites.', 'buddyboss' ),
'type' => 'object',
'context' => array( 'embed', 'view', 'edit' ),
'readonly' => true,
);
}
$schema['properties']['wp_roles'] = array(
'description' => __( 'Users of this profile type will be auto-assigned to the following WordPress roles.', 'buddyboss' ),
'type' => 'array',
'context' => array( 'embed', 'view', 'edit' ),
'readonly' => true,
);
}
/**
* Filters the xprofile field group schema.
*
* @param array $schema The endpoint schema.
*/
return apply_filters( 'bp_rest_xprofile_types_schema', $schema );
}
/**
* Get the query params for the XProfile types.
*
* @return array
* @since 0.1.0
*/
public function get_collection_params() {
$params = parent::get_collection_params();
$params['context']['default'] = 'view';
unset( $params['page'] );
unset( $params['per_page'] );
unset( $params['search'] );
/**
* Filters the collection query params.
*
* @param array $params Query params.
*/
return apply_filters( 'bp_rest_xprofile_types_collection_params', $params );
}
/**
* Get Member post by profile type.
*
* @param string $member_type Member type name.
*
* @return array
*/
protected function bp_rest_member_type_post_by_type( $member_type ) {
if ( empty( $member_type ) ) {
return;
}
global $wpdb;
// phpcs:disable
$query = "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '%s' AND LOWER(meta_value) = '%s'";
$query = $wpdb->prepare( $query, '_bp_member_type_key', $member_type );
$post_id = $wpdb->get_var( $query );
// Fallback to legacy way to retrieve profile type from name by using singular label.
if ( ! $post_id ) {
$name = str_replace( array( '-', '-' ), array( ' ', ',' ), $member_type );
$query = "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '%s' AND LOWER(meta_value) = '%s'";
$query = $wpdb->prepare( $query, '_bp_member_type_label_singular_name', $name );
$post_id = $wpdb->get_var( $query );
}
// phpcs:enable
return apply_filters( 'bp_member_type_post_by_type', $post_id );
}
}
Changelog
| Version | Description |
|---|---|
| 0.1.0 | Introduced. |
Methods
- __construct — Constructor.
- bp_rest_member_type_post_by_type — Get Member post by profile type.
- get_collection_params — Get the query params for the XProfile types.
- get_item_schema — Get the XProfile types schema, conforming to JSON Schema.
- get_items — Retrieve XProfile Types.
- get_items_permissions_check — Check if a given request has access to XProfile Types.
- prepare_item_for_response — Prepares single XProfile type to return as an object.
- register_routes — Register the component routes.
Questions?
We're always happy to help with code or other questions you might have! Search our developer docs, contact support, or connect with our sales team.