访问了一个博客,发现这个博客上有一个api自动推送的新闻集锦页面,每次打开页面的时候,后台会自动去请求一次api,获取到最新的数据并展现,这样就实现了内容的实时更新。但由于目前很多api都限制了使用次数,这种打开页面即请求api的方式,在站点本身访客较多的情况下,对api站点的请求次数也是非常频繁的,一旦达到了次数的上限,api拒绝响应,就可能导致后来的来访用户无法正常访问该页面。
一些自己的想法
于是就考虑了这样一个问题,如果在自己的博客上放这样一个内容,该如何处理呢?几周前参考张戈博客的文章,无插件实现了博客的sitemap时,接触到了linux的定时任务,具体实现是设置一个php文件来生成php版本sitemap页面,然后利用linux定时任务间隔一段时间后抓取这个页面并另存为xml版本的sitemap,这样就完成了一套自动化的流程。这个模式似乎也可以用在这个命题中,定时去抓取一次数据,判断该数据的更新时间,如果同最后一次自动发布的时间不同,则让php整理一下数据并自动发布一篇新的文章,如果相同,则认为这些数据已经发布过了,不再进行处理。
wp的文章发布函数
查了一下手册,wordpress确实提供了可以用来发布或者更新一篇新的文章的函数,这个函数就是“wp_insert_post”,只需要传入一个固定格式的数组,“wp_insert_post”会自动处理好同数据库的衔接。正常书写博客一般是不需要用到这个函数的,该函数经常被用于采集或是处理作者的投稿上。
wp_insert_post的参数:
- $postarr:(数组) (必需) 组成要更新或插入的文章的元素数组
- $wp_error:(bool) (可选)是否返回错误信息,默认值:假
- $fire_after_hooks:(bool) (5.6.0版本添加,可选) 是否触发 after insert 钩子,默认值:真
$postarr的参数
键值 | 类型 | 数据用途 |
---|---|---|
id | int | 如果等于0以外的值,则具有该id的文章将被更新,为0则新建一篇; |
post_author | int | 添加文章的用户的id,默认为当前用户id; |
post_date | string | 发布日期,默认为当前时间; |
post_date_gmt | string | 在 GMT 时区发布的日期,默认值为 的值$post_date; |
post_content | string | 文章内容,默认为空; |
post_content_filtered | string | 过滤后的文章内容,默认为空; |
post_title | string | 文章标题,默认为空; |
post_excerpt | string | 文章摘录,默认为空; |
post_status | string | 发布状态,默认"草稿"; |
post_type | string | 文章类型,默认"发布"; |
comment_status | string | 文章是否可以接受评论。接受"打开"或"关闭",默认值是"default_comment_status"选项的值; |
ping_status | string | 文章是否可以接受 ping,接受"打开"或"关闭",默认值是"default_ping_status"选项的值; |
post_password | string | 访问文章的密码,默认为空; |
post_name | string | 文章别名,默认是创建新文章时经过清理的文章标题; |
to_ping | string | 以空格或回车分隔的要 ping 的 URL 列表,默认为空; |
pinged | string | 已被 ping 的 URL 的空格或回车分隔列表,默认为空; |
post_modified | string | 上次修改文章的日期,默认为当前时间; |
post_modified_gmt | string | 最后一次在 GMT 时区修改文章的日期,默认为当前时间; |
post_parent | int | 为它所属的文章设置此项,如果有的话,默认为0; |
menu_order | int | 文章的显示顺序,默认为; |
post_mime_type | string | 文章的mime类型,默认为空; |
guid | string | 用于引用文章的全局唯一id,默认为空; |
import_id | int | 插入新文章时要使用的文章id,如果指定,则不得与任何现有文章id匹配,默认为0; |
post_category | array | 类别id数组,默认为“default_category”选项的值; |
tags_input | array | 标签名称、slug 或id的数组,默认为空; |
tax_input | array | 由分类名称键入的分类术语数组。如果分类是分层的,则术语列表需要是术语id的数组或以逗号分隔的id字符串。如果分类法是非分层的,则术语列表可以是包含术语名称或 slug 的数组,或者是逗号分隔的名称或 slug 字符串。这是因为,在分层分类法中,子术语可以与不同的父术语具有相同的名称,因此连接它们的唯一方法是使用id。默认为空; |
meta_input | array | 自定义栏目数组,默认为空。(4.4.0版本添加) |