namespace, '/members', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_items' ), 'permission_callback' => array( $this, 'permission_directory' ), 'args' => array_merge( $this->paging_args( 50 ), array( 'orderby' => array( 'type' => 'string', 'enum' => array( 'newest', 'name' ), 'default' => 'newest', ), ) ), ), ) ); register_rest_route( $this->namespace, '/members/(?P\d+)', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_item' ), 'permission_callback' => array( $this, 'permission_directory' ), ), ) ); } /** * Requires a logged-in user and an enabled directory (managers always pass). * * @return true|WP_Error */ public function permission_directory() { $logged_in = $this->permission_logged_in(); if ( true !== $logged_in ) { return $logged_in; } if ( 'off' === Settings::get( 'member_directory' ) && ! SpaceAccess::is_manager( get_current_user_id() ) ) { return $this->forbidden(); } return true; } /** * Searches members. * * @param WP_REST_Request $request Request. * @return WP_REST_Response */ public function get_items( $request ) { $result = MemberDirectory::query( array( 'search' => $request['search'], 'page' => $request['page'], 'per_page' => $request['per_page'], 'orderby' => $request['orderby'], ) ); return $this->paged_response( $result['items'], $result['total'], $request['per_page'] ); } /** * Returns one member with the spaces both people can see. * * @param WP_REST_Request $request Request. * @return WP_REST_Response|WP_Error */ public function get_item( $request ) { $user = get_userdata( absint( $request['id'] ) ); $profile = $user ? Profiles::get( $user->ID ) : null; if ( ! $user || ( is_multisite() && ! is_user_member_of_blog( $user->ID ) ) || ( $profile && 'active' !== $profile['status'] ) ) { return new WP_Error( 'spacebay_member_not_found', __( 'Member not found.', 'spacebay' ), array( 'status' => 404 ) ); } $viewer_id = get_current_user_id(); $spaces = array(); $data = MemberDirectory::profile( $user, $profile, $viewer_id ); foreach ( $data['hidden'] ? array() : Membership::for_user( $user->ID ) as $space_id => $membership ) { $space = SpaceRepository::find( $space_id ); if ( $space && 'active' === $membership['status'] && SpaceAccess::can_see( $space, $viewer_id ) ) { $spaces[] = SpaceFormatter::space( $space, $viewer_id ); } } $data['spaces'] = $spaces; $data['can_message'] = \SpaceBay\Messages\Rules::can_message( $viewer_id, $user->ID ); $data['blocked'] = $viewer_id && \SpaceBay\Messages\Rules::has_blocked( $viewer_id, $user->ID ); if ( \SpaceBay\Gamification\Gamification::enabled() && ( ! $data['hidden'] || $user->ID === $viewer_id ) ) { $data['achievements'] = \SpaceBay\Gamification\Gamification::summary( $user->ID, $viewer_id ); } /** * Filters the data of a member profile page, so add-ons can add their own * parts (for example the shop of SpaceBay Pro). * * @since 1.0.0 * * @param array $data Profile data. * @param int $user_id Member. * @param int $viewer_id Viewer, 0 for a visitor. */ $data = (array) apply_filters( 'spacebay_member_profile', $data, (int) $user->ID, (int) $viewer_id ); return rest_ensure_response( $data ); } }