Wordpress API:从私有 wordpress.com 站点获取帖子

Wordpress API: Get posts from private wordpress.com site

我正在构建一个移动应用程序,我想使用 wordpress.com api 从我的 wordpress.com 站点获取帖子。通常,您可以按照此处的说明进行操作:https://developer.wordpress.com/docs/api/getting-started/。但是,在这种情况下,我尝试访问的 wordpress.com 站点设置为 'private'。

当我尝试发出 api 获取请求时,我收到 403 错误消息 "User cannot access this private blog"。

是否可以使用 wordpress.com api 从私人 wordpress.com 博客加载帖子?

我希望当有人控制发出 api 请求的应用程序并且还控制目标私有站点(就像这里的例子)时,这是可能的。这似乎是 api.

的一个很好的用例

我暂时不想将站点更改为私有。我也不希望应用程序的用户必须在任何地方输入登录凭据。我希望应用程序本身能够在加载帖子时提供相关凭据。

我已经完成了各种 oauth 操作,例如获取 client_id、client_secret_key 和令牌,但我没有看到任何从私人站点实际加载帖子的方法。

我看过之前问的问题,没有答案,比如:https://wordpress.stackexchange.com/questions/180637/fetching-private-posts-or-custom-post-types-via-wp-api-with-basic-authenticationHow to retrieve private posts from wordpress using JSON rest api?.

我能够(大部分)解决这个问题。是的,绝对可以使用 wordpress.api 从私有 wordpress.com 站点加载 post。

为了做到这一点,您对私有站点的任何 api 调用(get、post 等)都需要在 header 连同请求。您从 wordpress.com 获得令牌。

请注意,此描述是关于 wordpress.com api,而不是 wordpress.org api。

要获取该令牌,您可以按照此处的步骤操作:https://developer.wordpress.com/docs/oauth2/。您可能会获得需要定期刷新的短期令牌或永久令牌。您从 server-side 代码方法中获取永久令牌。

有几种不同的方法可以做到这一点:

所有这些都要求您向 wordpress.com 注册一个单独的 url,此处:https://developer.wordpress.com/apps/。在该站点上,您创建一个新的 "app" 将请求许可。如果您有网站,该应用程序可以使用您的 url,或者只使用您在开发中使用的本地主机站点(如果您不在开发中使用它,甚至可以只使用本地主机端口 url——关键就是得到一个 client_id 并在请求过程中使用它)。在那里,您将获得执行这些步骤所需的 client_id 和 client_secret_code。从那里:

1) 您可以只使用 curl 代码查询 api 并取回授权代码,然后使用该授权代码进行另一个查询以获取令牌。请注意,wordpress.com oauth2 文档中的 curl 代码位于 PhP 中(不是纯 curl)。

2) 您可以直接在您的应用中提供获取令牌的方法,如上面链接的 wordpress oauth2 文档中所述。对于 ionic 应用程序,这可能需要使用 inappbrowser 插件,才能转到 api 应用程序授予您权限的页面。

3) 另一种可能性:wordpress 设置了一个相当简单的 node-based 过程来获取令牌:转到 https://github.com/Automattic/node-wpcom-oauth, download the code there, and follow the steps. A very helpful tutorial on that is at:http://haiku2.com/2015/11/how-to-setup-a-wordpress-com-oauth-token/。它已经有几年历史了,但现在仍然有效。

获得令牌后,将其包含在 header 中以进行调用。例如,使用来自 @angular/common/http 的 HttpClient(对于 ionic/angular/typescript 应用程序):

var token = 'YOUR TOKEN'
var url = 'THE API ENDPOINT'
return new Promise((resolve) => {  
        let headers = new HttpHeaders();
        headers.append('Authorization', 'Bearer ' + token)
        this.http.get(url, {headers: headers}) 
        .subscribe(data => {
            console.log(data)
            }, err => {
            console.log(err);
        });
 });

这应该都有效...除非您遇到 CORS(跨源)问题。

如果它似乎不起作用,或者如果您收到有关结果为空、令牌无效或 'Access-Control-Allow-Origin' header 不存在的错误,那么有一个很好的机会 CORS 是问题所在。

在 ionic 上——也许还有其他 web-based 工具——您可能需要配置您的设置以使用 wordpress.com 端点作为代理服务器。相关信息在这里:https://blog.ionicframework.com/handling-cors-issues-in-ionic/.

对于 ionic 和 ios--当您想将应用程序放到设备或模拟器上时,由于 ionic 在 2017 年晚些时候实现了 WKWebView,因此在较新的 ionic 版本中存在一组单独的 CORS 问题.

这里有更多详细信息:https://blog.ionicframework.com/wkwebview-for-all-a-new-webview-for-ionic/。要解决 ios 设备上的 CORS 问题,您必须绕过 CORS。 Ionic 目前的建议是使用 Ionic Native http 插件。现在的实现似乎有点不一致,但这是我目前看到的唯一解决方案。