BuddyPress REST API入门指南

文章目录
  1. 入门
    1. 认证
    2. 设置JWT认证
  2. 请求示例
    1. 动态
    2. 私信
    3. 群组
  3. 扩展BP REST API
  4. 挑战
    1. 完整性
    2. 再造逻辑
    3. 支持的插件
  5. 结束语

  https://apppresser.com/buddypress-rest-api/

BuddyPress REST API允许您从第三方网站或应用程序与BuddyPress进行交互。

你可以做很多的事情,比如获取动态条目、上传动态更新、与群组和成员的互动,以及更多。它并没有100%与插件中的功能对等,但它有大部分的功能。

在这篇文章中,我将给你介绍BP REST API的主要组件,以及我们使用它们的经验中的一些提示。

入门

确保你至少使用WP 5.0和BuddyPress 5.0。

你可以在https://yoursite.com/wp-json/buddypress/v1/中与各个端点进行互动,你可以在这里看到完整的列表

要测试API是否可用,登录到你的网站。然后使用Postman发送一个GET请求到https://你的网址/wp-json/buddypress/v1/activity

你应该看到一个动态数据的列表。

认证

如果您从WordPress插件或主题中调用API,您不需要担心认证问题。API会检测用户是否已登录,并返回相应的数据。

如果您使用的是第三方应用程序,您就不能使用cookie来确认用户是否登录,所以您需要使用OAuth或JWT。JWT(json web token)认证效果很好,比oAuth更简单,所以我们就用它。

设置JWT认证

安装此插件,并按照配置说明进行操作。

确保您定义了您的密匙,并在您的wp-config.php文件中添加以下代码来启用CORS。

define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key');
define('JWT_AUTH_CORS_ENABLE', true);

然后,你应该可以通过发送一个POST请求到/wp-json/jwt-auth/v1/token,并将你的用户名和密码作为url参数来获得一个令牌。保存该令牌,我们将把它硬编码到我们的API调用中。(对于一个成熟的应用程序,你需要为此创建一个图形界面,但这是后话了) 现在可以在授权头中使用这个Bearer令牌来获取敏感数据,比如私人信息。

请求示例

BP REST API有很多可用的端点,而且他们还在增加更多的端点。这不是一个详尽的列表,而是一些如何与API交互的例子。

动态

要抓取所有的网站动态,发送GET请求到http://你的网址/wp-json/buddypress/v1/activity

下面是写稿时可用的参数清单。

$args = array(
    'exclude'           => $request['exclude'],
    'in'                => $request['include'],
    'page'              => $request['page'],
    'per_page'          => $request['per_page'],
    'search_terms'      => $request['search'],
    'sort'              => $request['order'],
    'spam'              => $request['status'],
    'display_comments'  => $request['display_comments'],
    'site_id'           => $request['site_id'],
    'group_id'          => $request['group_id'],
    'count_total'       => true,
    'fields'            => 'all',
    'show_hidden'       => false,
    'update_meta_cache' => true,
    'filter'            => false,
);

使用参数的例子是这样的。

http://你的网址/wp-json/buddypress/v1/activity?group_id=2&display_comments=false&per_page=12 要发布一个新的动态,请向同一个端点发出 POST 请求。唯一需要的参数是 "content",当然你必须像上面描述的那样,在授权头中发送你的 Bearer令牌。

要发布一个动态评论,你可以提出同样的请求,但要添加一个activity_comment的类型,并包含parentid

https://你的网址/wp-json/buddypress/v1/activity?content=mycomment&parent=247&id=247&type=activity_comment 成员 要列出所有成员,请发送一个经过认证的GET请求到https://你的网址/wp-json/buddypress/v1/members

变量:

$args = array(
            'type'           => $request['type'],
            'user_id'        => $request['user_id'],
            'user_ids'       => $request['user_ids'],
            'xprofile_query' => $request['xprofile'],
            'include'        => $request['include'],
            'exclude'        => $request['exclude'],
            'member_type'    => $request['member_type'],
            'search_terms'   => $request['search'],
            'per_page'       => $request['per_page'],
            'page'           => $request['page'],
);

要获得某一位用户的信息,只需在请求的末尾添加用户的ID:https://你的网址/wp-json/buddypress/v1/members/12 你也可以使用POST创建成员,添加或删除好友关系在本文撰写时还不是API的一部分。

私信

BuddyPress的私信像电子邮件,有收件箱,和发件箱。有多个私信的串,就像电子邮件。

要得到所有的私信串,你可以发送一个请求像这样:.../wp-json/buddypress/v1/messages/?box=inbox&user_id=1

一条私信串是一个数组对象,它有关于私信的信息,如ID、收件人、消息数组、最近的消息、日期等。下面是一个私信串对象的例子。

{
        "id": 42,
        "primary_item_id": 55,
        "secondary_item_id": 1,
        "subject": {
            "rendered": "New thread"
        },
        "excerpt": {
            "rendered": "hey there!"
        },
        "message": {
            "rendered": "<p>hey there!</p>\\n"
        },
        "date": "2019-06-03T21:23:34",
        "unread": 1,
        "sender_ids": {
            "1": 1
        },
        "recipients": {
            "1": {
                "id": 83,
                "user_id": 1,
                "thread_id": 42,
                "unread_count": 1,
                "sender_only": 0,
                "is_deleted": 0
            }
        },
        "messages": [
            {
                "id": 55,
                "thread_id": 42,
               "sender_id": 1,
                "subject": {
                    "raw": "New thread",
                    "rendered": "New thread"
                },
               "message": {
                    "raw": "hey there!",
                    "rendered": "<p>hey there!</p>\\n"
                },
                "date_sent": "2019-06-03 21:23:34"
            }
        ]
    }

要获取一个私信串,请添加私信串的id:.../wp-json/buddypress/v1/messages/5 检索私信的参数。

$args = array(
            'user_id'      => $request['user_id'],
            'box'          => $request['box'],
            'type'         => $request['type'],
            'page'         => $request['page'],
            'per_page'     => $request['per_page'],
            'search_terms' => $request['search'],
        );

要发布新的私信,请向/messages发送一个POST请求,其中包含以下参数:subjectcontentrecipients

https://site.com/wp-json/buddypress/v1/messages/?subject=reply to thread 5&content=this is my reply&recipients=1 要回复一个已有的私信串,请添加该私信串的id并删除subject

https://site.com/wp-json/buddypress/v1/messages/?content=this is my reply&id=5&recipients=1

群组

要获取所有的群组,...wp-json/buddypress/v1/groups 要获得一个单独的群组,请在末尾添加群组ID...wp-json/buddypress/v1/groups/12 要获得一个组的成员...wp-json/buddypress/v1/groups/1/members 要添加成员到一个组,请向成员端点发送一个POST请求,并在最后加上要添加的用户ID.../wp-json/buddypress/v1/groups/1/members/37 要从组中删除成员,使用与上述相同的请求,但使用DELETE。

扩展BP REST API

有各种钩子和过滤器可用于扩展API。您可以在API文档中找到所有可用的钩子和过滤器。

这里有几个使用钩子和过滤器扩展BP REST API的例子。

// add something to the activity post
add_filter( 'bp_rest_activity_pre_insert_value', function( $prepared_activity, $request ) {
 
    $prepared_activity->content .= $request['my_custom_param'];
    return $prepared_activity;
 
}, 10, 2 );
// add an endpoint. This is probably a bad idea, you should use your own rest base slug, not buddypress/v1. You must add your own callbacks as well.
add_action( 'bp_rest_api_init', function() {
 
    register_rest_route( 'buddypress/v1', '/my-endpoint', array(
        array(
            'methods'             => WP_REST_Server::READABLE,
            'callback'            => array( $this, 'get_items' ),
            'permission_callback' => array( $this, 'get_items_permissions_check' ),
        ),
    ) );
 
} );
// send the admin an email when a new group is created
add_action( 'bp_rest_groups_create_item', function( $group, $response, $request ) {
    $to = '[email protected]';
    $subject = 'New group created!';
    $body = 'The group name is ' . $group->name;
    $headers = array('Content-Type: text/html; charset=UTF-8');
      
    wp_mail( $to, $subject, $body, $headers );
}, 10, 3 );

挑战

完整性

BP REST API还没有完全和BuddyPress同步,所以有些功能不存在。比如说,好友组件是不存在的,你得自己滚动添加/删除好友的方式。它还需要自定义代码来上传带有活动帖子或消息的图片。

再造逻辑

与任何第三方应用程序一样,最难的部分是重新创建网站上已经存在的逻辑。例如,添加朋友按钮。当有人点击它之后,你需要发送API请求,并显示结果。如果失败了就显示错误,成功了就显示成功信息,或者是待定。你需要把这些数据保存到应用中,然后把按钮改成 "等待请求",如果成功,则改成 "取消好友"。这种类型的考虑发生在每一次用户交互中,这需要很多额外的考虑。

支持的插件

支持第三方插件是很难的。比方说,有人在BuddyPress的活动发布中使用了一个图片滤镜插件。你必须在应用中重建整个UI,然后构建端点来处理活动上传时的图片过滤器的处理。

也就是说,挑战也是乐趣的一部分。

结束语

当你使用BuddyPress的API与网站脱钩后,就会有很多新的可能性。BuddyPress是一个强大的自托管社交互动插件,你可以建立一个像Facebook Messenger一样的私人消息应用,一个Instagram风格的照片分享应用,甚至一个完整的Facebook风格的社交社区应用。

你可以重建UI,让它更快,更专注于你的特定用例。你可以离线缓存数据,利用推送通知,移动设备功能,如相机和地理定位,等等。

我们计划用它打造更多酷炫的东西,希望你也能做到。

通过www.DeepL.com/Translator(免费版)翻译