概念
WordPress REST API通过发送和接收 JSON 对象的数据为应用程序与WordPress站点进行交互提供了一个接口。它是WordPress区块编辑器的基础,并且可以使我们的主题,插件或自定义应用程序呈现崭新的,功能强大的界面,以管理和发布网站内容。
使用WordPress REST API,可以创建一个插件来为WordPress提供全新的管理体验,构建全新的交互式前端体验,或将WordPress内容带入完全独立的应用程序中。
REST API是WordPress的面向开发人员的功能。它提供对网站内容的数据访问,并实施相同的身份验证限制-您可以通过REST API公开访问您网站上公开的内容,而私有内容,受密码保护的内容,内部用户,自定义帖子类型,元数据仅可用于身份验证,或者如果将其专门设置为可使用。如果不是开发人员,则要了解有关API的最重要的事情是,它可以启用块编辑器和现代的插件界面,而不会损害网站的安全性或隐私性。
API是应用程序编程接口。REST是Representational State Transfer(表现层状态转移)的缩写,是用于将应用程序数据建模和访问为相互关联的对象和集合的一组概念。WordPress REST API提供了代表帖子,页面,分类法和其他内置WordPress数据类型的REST端点(URL)。您的应用程序可以向这些端点发送和接收JSON数据,以查询,修改和创建您站点上的内容。JSON是一种开放标准数据格式,重量轻且易于阅读。当向API请求内容或向API发送内容时,响应也将以JSON返回。由于许多编程语言都广泛支持JSON,因此开发人员可以使用多种开发环境构建WordPress应用程序,当然 REST API 只是WordPress提供的众多API之一
简单使用
自WordPress 4.7起,REST API已集成到核心中,因此无需任何插件即可获得基本功能。
如果只是访问他人或者自己网站的公开的数据,只要在浏览器输入以下地址就可以。
1、文章
(1)获取最新文章(默认获取到最新的10篇文章)
http://www.website.com/wp-json/wp/v2/posts
与
http://www.website.com/wp-json/wp/v2/posts?page=1
效果相同,page用于指定页数,WP REST API 默认返回10条数据,用page指定数据获取的游标。如
http://www.website.com/wp-json/wp/v2/posts?page=2
可取回最新的第11条数据到第20条数据,以此类推。
(2)设置获取的每页文章数量及分页
http://www.website.com/wp-json/wp/v2/posts?filter[posts_per_page]=5
filter[posts_per_page]=5 用于指定返回文章每页的数量,这里指定每页数量为5篇。
filter[posts_per_page]与page联合使用:
http://www.website.com/wp-json/wp/v2/posts?filter[posts_per_page]=5&page=2
(3)获取指定分类的文章
http://www.website.com/wp-json/wp/v2/posts?filter[cat]=2
filter[cat]=2 指定分类ID为2 ,返回分类ID为2的文章。
分类ID是每个分类目录在创建时自动生成的ID,在wordpress后台“文章”==》“分类目录”中,把鼠标放在分类名称上面,页面下方会出现一个网址,网址中的参数tag_ID=2就是这个分类名称的分类ID。如果没有出现网址,可以点击分类名称下的“编辑”,然后查看网页地址栏,同样可以得到tag_ID=2。下面的标签ID的获得方法也一样。
(4)获取指定标签的文章
http://www.website.com/wp-json/wp/v2/posts?filter[tag]=library
filter[tag]=library 指定标签名为“library”的文章
(5)获取指定分类和有指定标签的文章
http://www.website.com/wp-json/wp/v2/posts?filter[cat]=2&filter[tag]=library
上面两个结合一起,可以得到更具体精确的文章。
(6)获取指定日期的文章
http://www.website.com/wp-json/wp/v2/posts?filter[year]=2016&filter[monthnum]=03
filter[year]=2016&filter[monthnum]=03 设置指定的日期
(7)获取指定作者的文章
http://www.website.com/wp-json/wp/v2/posts?filter[author_name]=jinyun
filter[author_name]=jinyun设置指定作者名字
(8)按关键词搜索文章
http://www.website.com/wp-json/wp/v2/posts?filter[s]=直播源
filter[s]=金云 :按给定的关键词搜索文章,返回包含“金云”关键词的文章。
(9)获取随机文章
http://www.website.com/wp-json/wp/v2/posts?filter[orderby]=rand
其中orderby还可以为指定的字段排序
(10)获取相关文章
在网站中,在做SEO优化和页面内容布局时,获取相关文章是比较常见的,可以通过以上几个条件组合来达到获取相关文章的效果。
按标签获取相关文章:
http://www.website.com/wp-json/wp/v2/posts?filter[orderby]=rand&filter[tag]=library&filter[posts_per_page]=6
按分类获取相关文章:
http://www.website.com/wp-json/wp/v2/posts?filter[orderby]=rand&filter[cat]=2&filter[posts_per_page]=6
(11)获取指定文章的数据
http://www.website.com/wp-json/wp/v2/posts/189
得到ID为189的文章数据
2、分类和标签
(1)获取所有的分类
http://www.website.com/wp-json/wp/v2/categories
(2)获取指定分类ID的分类信息
http://www.website.com/wp-json/wp/v2/categories/2
(3)获取所有的标签
http://www.website.com/wp-json/wp/v2/tags
(4)获取指定标签ID的标签信息
http://www.website.com/wp-json/wp/v2/tags/3
3、媒体文件
(1)获取所有的媒体信息
http://www.website.com/wp-json/wp/v2/media
(2)获取指定媒体ID的媒体信息
http://www.website.com/wp-json/wp/v2/media/17
4、页面
(1)获取所有的页面信息
http://www.website.com/wp-json/wp/v2/pages
(2)获取指定页面ID的页面信息
http://www.website.com/wp-json/wp/v2/pages/289
5、类型
(1)获取当前wordpress所有的内容类型
http://www.website.com/wp-json/wp/v2/types
一般情况下会返回post,page和attachment三种类型
(2)获取指定类型
http://www.website.com/wp-json/wp/v2/types/post
6、评论
(1)获取所有评论信息
http://www.website.com/wp-json/wp/v2/comments
(2)获取指定评论ID的单条评论信息
http://www.website.com/wp-json/wp/v2/comments/2
7、用户
(1)获取所有的用户信息
http://www.website.com/wp-json/wp/v2/users
(2)获取指定用户ID的用户信息
http://www.website.com/wp-json/wp/v2/users/1
以上即是WP REST API 内置API接口最为常用的接口数据获取方法。
C#库WordPressPCL
如果要访问受保护的端点,比如对自己的网站进行发布文章等操作,则该库支持通过JSON Web令牌(JWT)进行身份验证。
1、首先需要在网站安装以下插件:
插件名称:JWT Authentication for WP REST API
插件官方地址:https://wordpress.org/plugins/jwt-authentication-for-wp-rest-api/
插件安装完成后还需要配置WP根目录下 wp-config.php 文件,加入
define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key'); define('JWT_AUTH_CORS_ENABLE', true);
并且不能加在文件最后,否则无效。插件所在文件夹权限不对也可能造成无法认证。
2、然后 VS 可以使用 NuGet 搜索安装 WordPressPCL,并在程序中添加引用
3、例子:
using System; using System.IO; using WordPressPCL.Models; namespace WPFdj { class Class1 { private async void TestWP() { var client = new WordPressPCL.WordPressClient("https://www.guihet.com/wp-json/"); client.AuthMethod = WordPressPCL.Models.AuthMethod.JWT; await client.RequestJWToken("账号名", "账号密码"); Stream s = File.OpenRead(@"E:\Download\postimage2.jpg"); string createdMediapath = null;//图片在服务器的路径 if (await client.IsValidJWToken()) { var createdMedia = await client.Media.Create(s, DateTime.Now.ToString("yyMMdd") + ".jpg");//上传图片 createdMediapath = createdMedia.SourceUrl; } var post = new WordPressPCL.Models.Post();//新建文章 post.Title = new WordPressPCL.Models.Title("标题");//文章标题 post.Content = new WordPressPCL.Models.Content(createdMediapath+"黑鸟播放是一个记录折腾的网站 ..");//文章内容 post.Slug = "biaoti";//文章别名 post.Status = Status.Draft;//发布状态,草稿 if (await client.IsValidJWToken()) { var createdPost = await client.Posts.Create(post); string postid = createdPost.Id.ToString();//取该文章ID } } } }
这样就可以先运行起来,更多功能可以查看WiKi,慢慢添加:
https://github.com/wp-net/WordPressPCL/wiki
禁用方法
REST API 采用 GET 请求方式,这就为 DDOS 攻击提供了一个新的攻击途径,所以我们应尽可能的禁止掉这些不必要的功能需求,并且去掉 head 里面输出 wp-json 链接。在此也说下查看 WP JSON REST API 是否开启的方法:http://域名/wp-json/,若输出数据则是开启状态。
直接将以下代码添加到主题的 functions.php 文件中即可禁用 JSON REST API :
/** * WordPress完全禁用REST API(最新版)- 黑鸟博客 */ // 屏蔽 REST API if ( version_compare( get_bloginfo( 'version' ), '4.7', '>=' ) ) { function lxtx_disable_rest_api( $access ) { return new WP_Error( 'rest_api_cannot_acess', '无访问权限', array( 'status' => rest_authorization_required_code() ) ); } add_filter( 'rest_authentication_errors', 'lxtx_disable_rest_api' ); } else { // Filters for WP-API version 1.x add_filter( 'json_enabled', '__return_false' ); add_filter( 'json_jsonp_enabled', '__return_false' ); // Filters for WP-API version 2.x add_filter( 'rest_enabled', '__return_false' ); add_filter( 'rest_jsonp_enabled', '__return_false' ); } // 移除头部 wp-json 标签和 HTTP header 中的 link remove_action('template_redirect', 'rest_output_link_header', 11 ); remove_action('wp_head', 'rest_output_link_wp_head', 10 ); remove_action('xmlrpc_rsd_apis', 'rest_output_rsd');