BP_REST_Blogs_Endpoint
Blogs endpoints.
Description
Use /blogs/ Use /blogs/{id}
Source
File: bp-blogs/classes/class-bp-rest-blogs-endpoint.php
class BP_REST_Blogs_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()->blogs->id; } /** * 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' ), ) ); register_rest_route( $this->namespace, '/' . $this->rest_base . '/(?P<id>[\d]+)', array( 'args' => array( 'id' => array( 'description' => __( 'A unique numeric ID for the Blog.', 'buddyboss' ), 'type' => 'integer', ), ), array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_item' ), 'permission_callback' => array( $this, 'get_item_permissions_check' ), 'args' => array( 'context' => $this->get_context_param( array( 'default' => 'view', ) ), ), ), 'schema' => array( $this, 'get_item_schema' ), ) ); } /** * Retrieve Blogs. * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response | WP_Error * @since 0.1.0 * * @api {GET} /wp-json/buddyboss/v1/blogs Blogs * @apiName GetBBBlogs * @apiGroup Blogs * @apiDescription Retrieve blogs * @apiVersion 1.0.0 * @apiParam {Number} [page] Current page of the collection. * @apiParam {Number} [per_page=10] Maximum number of items to be returned in result set. * @apiParam {String} [search] Limit results to those matching a string. * @apiParam {Number} [user_id] ID of the user whose blogs user can post to. * @apiParam {Array} [include] Ensure result set includes specific IDs. * @apiParam {String=active,alphabetical,newest,random} [type=active] Ensure result set includes specific IDs. */ public function get_items( $request ) { $args = array( 'type' => $request['type'], 'include_blog_ids' => $request['include'], 'user_id' => $request['user_id'], 'search_terms' => $request['search'], 'page' => $request['page'], 'per_page' => $request['per_page'], ); /** * Filter the query arguments for the request. * * @param array $args Key value array of query var to query value. * @param WP_REST_Request $request The request sent to the API. * * @since 0.1.0 */ $args = apply_filters( 'bp_rest_blogs_get_items_query_args', $args, $request ); // false is the default value for some args. foreach ( $args as $key => $value ) { if ( empty( $value ) ) { $args[ $key ] = false; } } // Check if user is valid. if ( 0 !== $request['user_id'] ) { $user = get_user_by( 'id', $request['user_id'] ); if ( ! $user instanceof WP_User ) { return new WP_Error( 'bp_rest_blogs_get_items_user_failed', __( 'There was a problem confirming if user ID provided is a valid one.', 'buddyboss' ), array( 'status' => 500, ) ); } } // Actually, query it. $blogs = bp_blogs_get_blogs( $args ); $retval = array(); foreach ( (array) $blogs['blogs'] as $blog ) { $retval[] = $this->prepare_response_for_collection( $this->prepare_item_for_response( $blog, $request ) ); } $response = rest_ensure_response( $retval ); $response = bp_rest_response_add_total_headers( $response, $blogs['total'], $args['per_page'] ); /** * Fires after blogs are fetched via the REST API. * * @param array $blogs Fetched blogs. * @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_blogs_get_items', $blogs, $response, $request ); return $response; } /** * Check if a given request has access to blog items. * * @param WP_REST_Request $request Full data about the request. * * @return WP_Error|bool * @since 0.1.0 */ public function get_items_permissions_check( $request ) { /** * Filter the blogs `get_items` permissions check. * * @param bool|WP_Error $retval Returned value. * @param WP_REST_Request $request The request sent to the API. * * @since 0.1.0 */ return apply_filters( 'bp_rest_blogs_get_items_permissions_check', true, $request ); } /** * Retrieve a blog. * * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response|WP_Error * @since 0.1.0 * * @api {GET} /wp-json/buddyboss/v1/blogs/:id Blog * @apiName GetBBBlog * @apiGroup Blogs * @apiDescription Retrieve blog * @apiVersion 1.0.0 * @apiParam {Number} id A unique numeric ID for the Blog. */ public function get_item( $request ) { $blog = $this->get_blog_object( $request['id'] ); if ( empty( $blog->blog_id ) || empty( $blog->admin_user_id ) ) { return new WP_Error( 'bp_rest_blog_invalid_id', __( 'Invalid blog ID.', 'buddyboss' ), array( 'status' => 404, ) ); } $retval = array( $this->prepare_response_for_collection( $this->prepare_item_for_response( $blog, $request ) ), ); $response = rest_ensure_response( $retval ); /** * Fires after a blog is fetched via the REST API. * * @param stdClass $blog Fetched blog. * @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_blogs_get_item', $blog, $response, $request ); return $response; } /** * Check if a given request has access to get information about a specific blog. * * @param WP_REST_Request $request Full details about the request. * * @return WP_Error|bool * @since 0.1.0 */ public function get_item_permissions_check( $request ) { /** * Filter the blog `get_item` permissions check. * * @param bool|WP_Error $retval Returned value. * @param WP_REST_Request $request The request sent to the API. * * @since 0.1.0 */ return apply_filters( 'bp_rest_blogs_get_item_permissions_check', true, $request ); } /** * Prepares blogs data for return as an object. * * @param BP_Blogs_Blog $blog Blog object. * @param WP_REST_Request $request Full details about the request. * * @return WP_REST_Response * @since 0.1.0 */ public function prepare_item_for_response( $blog, $request ) { $data = array( 'id' => $blog->blog_id, 'user_id' => $blog->admin_user_id, 'name' => $blog->name, 'domain' => $blog->domain, 'path' => $blog->path, 'permalink' => $this->get_blog_domain( $blog ), 'description' => stripslashes( $blog->description ), 'last_activity' => bp_rest_prepare_date_response( $blog->last_activity ), ); // Get item schema. $schema = $this->get_item_schema(); // Blog Avatars. if ( ! empty( $schema['properties']['avatar_urls'] ) ) { $data['avatar_urls'] = array( 'thumb' => bp_get_blog_avatar( array( 'type' => 'thumb', 'blog_id' => $blog->blog_id, 'admin_user_id' => $blog->admin_user_id, ) ), 'full' => bp_get_blog_avatar( array( 'type' => 'full', 'blog_id' => $blog->blog_id, 'admin_user_id' => $blog->admin_user_id, ) ), ); } $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; $data = $this->add_additional_fields_to_object( $data, $request ); $data = $this->filter_response_by_context( $data, $context ); $response = rest_ensure_response( $data ); $response->add_links( $this->prepare_links( $blog ) ); /** * Filter a blog returned from the API. * * @param WP_REST_Response $response Response generated by the request. * @param WP_REST_Request $request Request used to generate the response. * @param BP_Blogs_Blog $blog The blog object. * * @since 0.1.0 */ return apply_filters( 'bp_rest_blogs_prepare_value', $response, $request, $blog ); } /** * Prepare links for the request. * * @param BP_Blogs_Blog $blog Blog object. * * @return array * @since 0.1.0 */ protected function prepare_links( $blog ) { $base = sprintf( '/%s/%s/', $this->namespace, $this->rest_base ); $url = $base . $blog->blog_id; // Entity meta. $links = array( 'self' => array( 'href' => rest_url( $url ), ), 'collection' => array( 'href' => rest_url( $base ), ), 'user' => array( 'href' => rest_url( bp_rest_get_user_url( $blog->admin_user_id ) ), 'embeddable' => true, ), ); /** * Filter links prepared for the REST response. * * @param array $links The prepared links of the REST response. * @param BP_Blogs_Blog $blog Blog object. * * @since 0.1.0 */ return apply_filters( 'bp_rest_blogs_prepare_links', $links, $blog ); } /** * Get blog permalink. * * @param BP_Blogs_Blog $blog Blog object. * * @return string */ protected function get_blog_domain( $blog ) { // Bail early. if ( empty( $blog->domain ) && empty( $blog->path ) ) { return ''; } if ( empty( $blog->domain ) && ! empty( $blog->path ) ) { return bp_get_root_domain() . $blog->path; } $protocol = is_ssl() ? 'https://' : 'http://'; $permalink = $protocol . $blog->domain . $blog->path; return apply_filters( 'bp_get_blog_permalink', $permalink ); } /** * Get a blog object from a blog_id. * * @param int $blog_id Blog ID. * * @return stdClass|int * @since 0.1.0 */ public function get_blog_object( $blog_id ) { $blogs = current( bp_blogs_get_blogs( array( 'include_blog_ids' => array( $blog_id ), ) ) ); if ( ! empty( $blogs[0] ) ) { return $blogs[0]; } return 0; } /** * Get the blogs 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_blogs', 'type' => 'object', 'properties' => array( 'id' => array( 'context' => array( 'embed', 'view', 'edit' ), 'description' => __( 'A unique numeric ID for the blog.', 'buddyboss' ), 'readonly' => true, 'type' => 'integer', ), 'user_id' => array( 'context' => array( 'embed', 'view', 'edit' ), 'description' => __( 'A unique numeric ID for the blog admin.', 'buddyboss' ), 'readonly' => true, 'type' => 'integer', ), 'name' => array( 'context' => array( 'embed', 'view', 'edit' ), 'description' => __( 'The name of the blog.', 'buddyboss' ), 'readonly' => true, 'type' => 'string', 'arg_options' => array( 'sanitize_callback' => 'sanitize_text_field', ), ), 'permalink' => array( 'context' => array( 'embed', 'view', 'edit' ), 'description' => __( 'The permalink of the blog.', 'buddyboss' ), 'readonly' => true, 'type' => 'string', 'format' => 'uri', ), 'description' => array( 'context' => array( 'embed', 'view', 'edit' ), 'description' => __( 'The description of the blog.', 'buddyboss' ), 'readonly' => true, 'type' => 'string', ), 'path' => array( 'context' => array( 'embed', 'view', 'edit' ), 'description' => __( 'The path of the blog.', 'buddyboss' ), 'readonly' => true, 'type' => 'string', ), 'domain' => array( 'context' => array( 'embed', 'view', 'edit' ), 'description' => __( 'the domain of the blog.', 'buddyboss' ), 'readonly' => true, 'type' => 'string', ), 'last_activity' => array( 'context' => array( 'embed', 'view', 'edit' ), 'description' => __( "The last activity date from the blog, in the site's timezone.", 'buddyboss' ), 'type' => 'string', 'format' => 'date-time', ), ), ); // Blog Avatars. if ( true === buddypress()->avatar->show_avatars ) { $avatar_properties = array(); $avatar_properties['full'] = array( /* translators: 1: Full avatar width in pixels. 2: Full avatar height in pixels */ 'description' => sprintf( __( 'Avatar URL with full image size (%1$d x %2$d pixels).', 'buddyboss' ), number_format_i18n( bp_core_avatar_full_width() ), number_format_i18n( bp_core_avatar_full_height() ) ), 'type' => 'string', 'format' => 'uri', 'context' => array( 'embed', 'view', 'edit' ), ); $avatar_properties['thumb'] = array( /* translators: 1: Thumb avatar width in pixels. 2: Thumb avatar height in pixels */ 'description' => sprintf( __( 'Avatar URL with thumb image size (%1$d x %2$d pixels).', 'buddyboss' ), number_format_i18n( bp_core_avatar_thumb_width() ), number_format_i18n( bp_core_avatar_thumb_height() ) ), 'type' => 'string', 'format' => 'uri', 'context' => array( 'embed', 'view', 'edit' ), ); $schema['properties']['avatar_urls'] = array( 'description' => __( 'Avatar URLs for the blog.', 'buddyboss' ), 'type' => 'object', 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, 'properties' => $avatar_properties, ); } /** * Filter the blogs schema. * * @param array $schema The endpoint schema. * * @since 0.1.0 */ return apply_filters( 'bp_rest_blogs_schema', $this->add_additional_fields_schema( $schema ) ); } /** * Get the query params for blogs collections. * * @return array * @since 0.1.0 */ public function get_collection_params() { $params = parent::get_collection_params(); $params['context']['default'] = 'view'; $params['user_id'] = array( 'description' => __( 'ID of the user whose blogs user can post to.', 'buddyboss' ), 'default' => 0, 'type' => 'integer', 'sanitize_callback' => 'absint', 'validate_callback' => 'rest_validate_request_arg', ); $params['include'] = array( 'description' => __( 'Ensure result set includes specific IDs.', 'buddyboss' ), 'default' => array(), 'type' => 'array', 'items' => array( 'type' => 'integer' ), 'sanitize_callback' => 'wp_parse_id_list', 'validate_callback' => 'rest_validate_request_arg', ); $params['type'] = array( 'description' => __( 'Limit result set to items with a specific type.', 'buddyboss' ), 'default' => 'active', 'type' => 'string', 'enum' => array( 'active', 'alphabetical', 'newest', 'random' ), 'sanitize_callback' => 'sanitize_key', 'validate_callback' => 'rest_validate_request_arg', ); /** * Filters the collection query params. * * @param array $params Query params. */ return apply_filters( 'bp_rest_blogs_collection_params', $params ); } }
Changelog
Version | Description |
---|---|
0.1.0 | Introduced. |
Methods
- __construct — Constructor.
- get_blog_domain — Get blog permalink.
- get_blog_object — Get a blog object from a blog_id.
- get_collection_params — Get the query params for blogs collections.
- get_item — Retrieve a blog.
- get_item_permissions_check — Check if a given request has access to get information about a specific blog.
- get_item_schema — Get the blogs schema, conforming to JSON Schema.
- get_items — Retrieve Blogs.
- get_items_permissions_check — Check if a given request has access to blog items.
- prepare_item_for_response — Prepares blogs data for return as an object.
- prepare_links — Prepare links for the request.
- 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.