namespace, '/me', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_item' ), 'permission_callback' => array( $this, 'permission_public' ), ), ) ); register_rest_route( $this->namespace, '/me/stats', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_stats' ), 'permission_callback' => array( $this, 'permission_logged_in' ), ), ) ); } /** * Returns the activity totals shown on the member's home page. * * @param WP_REST_Request $request Request object. * @return WP_REST_Response */ public function get_stats( $request ) { unset( $request ); return rest_ensure_response( self::stats_for( get_current_user_id() ) ); } /** * Counts a member's posts, comments, likes received and joined spaces. * * @param int $user_id Member ID. * @return array */ public static function stats_for( $user_id ) { global $wpdb; $posts = Tables::name( 'posts' ); $comments = Tables::name( 'comments' ); $reactions = Tables::name( 'reactions' ); $spaces = Tables::name( 'spaces' ); $members = Tables::name( 'space_members' ); // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Custom tables; small indexed counts for one member. $stats = array( 'posts' => (int) $wpdb->get_var( $wpdb->prepare( 'SELECT COUNT(id) FROM %i WHERE user_id = %d AND status = %s', $posts, $user_id, 'published' ) ), 'comments' => (int) $wpdb->get_var( $wpdb->prepare( 'SELECT COUNT(id) FROM %i WHERE user_id = %d AND status = %s', $comments, $user_id, 'published' ) ), 'likes' => (int) $wpdb->get_var( $wpdb->prepare( 'SELECT COUNT(r.id) FROM %i r INNER JOIN %i p ON r.object_id = p.id WHERE r.object_type = %s AND r.type = %s AND p.user_id = %d AND p.status = %s AND r.user_id <> %d', $reactions, $posts, 'post', 'like', $user_id, 'published', $user_id ) ) + (int) $wpdb->get_var( $wpdb->prepare( 'SELECT COUNT(r.id) FROM %i r INNER JOIN %i c ON r.object_id = c.id WHERE r.object_type = %s AND r.type = %s AND c.user_id = %d AND c.status = %s AND r.user_id <> %d', $reactions, $comments, 'comment', 'like', $user_id, 'published', $user_id ) ), 'spaces' => (int) $wpdb->get_var( $wpdb->prepare( 'SELECT COUNT(m.id) FROM %i m INNER JOIN %i s ON m.space_id = s.id WHERE m.user_id = %d AND m.status = %s AND s.type = %s AND s.status = %s', $members, $spaces, $user_id, 'active', 'space', 'published' ) ), ); // phpcs:enable /** * Filters the totals shown on a member's home page. * * @param array $stats Totals keyed by posts, comments, likes and spaces. * @param int $user_id Member ID. */ return apply_filters( 'spacebay_member_stats', $stats, $user_id ); } /** * Returns the current viewer. Guests receive only "logged_in: false". * * @param WP_REST_Request $request Request object. * @return WP_REST_Response */ public function get_item( $request ) { unset( $request ); $user = wp_get_current_user(); if ( ! $user->exists() ) { return rest_ensure_response( array( 'logged_in' => false ) ); } return rest_ensure_response( array( 'logged_in' => true, 'id' => $user->ID, 'display_name' => $user->display_name, 'avatar' => get_avatar_url( $user->ID, array( 'size' => 96 ) ), 'can' => array( 'manage' => current_user_can( Capabilities::MANAGE ), 'moderate' => current_user_can( Capabilities::MODERATE ), ), ) ); } }