作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
提升你的地位的最好方法之一 WordPress的开发者至少在您的客户眼中,是熟练使用api. 这里有一个实现WordPress API的常见场景:你的客户要求你向他们的站点添加一个小部件, 例如, 电子邮件订阅小部件. 您从他们的第三方电子邮件服务中获取一些代码——可能是脚本标记或 iframe
-将其粘贴到页面中,然后回复客户:“明白了!”
不幸的是, 如果你面对的是一个要求更高的客户,他们会注意到你的以下缺点:
在这一点上,两件事之一可能会合理地发生. 你可以宣称这些东西是“有就好”,并向你的客户保证这些东西的优点 80/20的解决方案,或者你可以满足这些要求. 就我个人经验而言, 我发现满足这样的要求——就是说, 展示对第三方服务的精通——是让客户相信你是一个WordPress向导的可靠方法. 另外,这通常很有趣.
在过去十年中, 我使用WordPress作为一个平台来使用大约50种不同的API. 一些最常见的api是MailChimp, 谷歌分析, 谷歌地图, CloudFlare, 和Bitbucket都. 但如果你需要做更多,如果你需要一个定制的解决方案?
在本文中, 我将针对通用的“电子邮件服务”API进行开发, 我尽我所能让事情变得尽可能的不可知论. 然而,我确实觉得假设我们正在处理一个JSON REST API是合理的. 以下是一些背景主题,可能会帮助您欣赏本文中的技术要点:
如果你发现自己对这些话题有点熟悉,并且有兴趣深入挖掘, 现在暂停并下载优秀的 Postman 应用程序. 它允许您在不编写代码的情况下与api通信.
但是,如果你对这些不熟悉,请继续阅读. 具有一定程度WordPress经验的技术观众将从本文中获益最多, 但我会尽力解释的 value 以一种不那么专业的方式来介绍每种技术. 非技术读者离开本文时,将能够在赞助本文之前评估每个点的ROI,并在交付后判断实现的质量.
Note: 如果您需要快速复习课程,您可以查看我们的 WordPress REST API指南.
没有进一步的序言, 请允许我与您分享一些不同的技术,我发现自己对大多数API都很欣赏, project, 和我一起工作的团队.
在我的开篇, 我注意到,客户发现跨越两个管理区域很烦人:wp-admin和他们的电子邮件服务的仪表板. 解决这个问题的一个好方法是在wp-admin中为它们提供一个仪表板小部件, 显示他们最近的订阅者活动摘要.
但话说回来, 这可能需要向远程API(由电子邮件服务提供的API)发出多个HTTP请求。, 导致页面加载时间过长. 这个性能问题的解决方案是将API调用存储为瞬态. This 食典委的文章 提供了一个很好的解释,你一定要读,但我将总结一下:
set_transient ()
根据您对性能的判断,您可以选择到期时间, 速度限制, 以及在此特定应用程序中显示过时数据的误差范围.get_transient ()
然后得出结论,您需要从API获取它.我认为这是一个有益的和可行的基础, 但是如果您考虑一下REST动词,您可以更进一步. 在五个最常见的方法中(GET, POST, PATCH, PUT, DELETE), 其中只有一个属于你的临时缓存. 你能猜出是哪一个吗? It’s GET. 在我的插件里, 我几乎总是有一个PHP类专门用于抽象对所讨论的远程API的调用, 实例化该类时的参数是HTTP方法. 如果它不是GET调用,那么我根本不打算调用任何缓存层.
此外, 如果不是GET调用, 那么我采取一些行动以某种方式改变远程数据是合理的, 也许可以加上, editing, 或者删除电子邮件订阅者. 这可能是使该资源的现有缓存失效的好时机 delete_transient ()
.
回到我们的WordPress邮件订阅API的例子, 以下是它在实践中的工作方式:
/用户
通过GET请求. 因为它是一个GET请求,所以它被存储在我的临时缓存中./用户
通过POST请求. 因为这是POST请求, 它不仅会避开我的暂存缓存, 这会促使我删除临时缓存的相关部分, 以便仪表板小部件反映这个新的订阅者.作为客户或其他技术含量较低的利益相关者, 在应用程序从远程服务提取数据的任何时候,都应该专门请求临时缓存——或者至少讨论一下. 你应该熟悉优秀的人 查询监控 插件来查看瞬态是如何工作的. 它将为您提供一个界面,用于浏览作为暂存的数据, 的频率, 能维持多久.
一些高级WordPress托管服务实际上不允许你在生产环境中使用瞬态. 他们有代码在运行, 也许以MU插件或其他脚本的形式, 它将拦截您使用瞬态API的尝试,并通过 对象缓存 instead. WP-Engine,在其最常见的配置中,是这方面的一个主要例子.
如果您只是存储和检索数据, 实际上,你不需要关心这个,甚至可能永远不会注意到它的发生. 整个家族 * _transient ()
函数将为您提供相同的最终结果, 只是过滤使用对象缓存而不是临时缓存. 但是,在尝试删除瞬态时,您可能会遇到问题. 这是为什么.
如果您的API集成足够复杂,需要自己的设置页面, 您可能希望包含一个UI,以允许管理用户执行以下操作 清除插件的整个临时缓存. 此按钮最常见的用途是当客户端直接更改远程服务上的一些数据时, 并且想要使我们存储在WordPress中的缓存失效. 如果客户端更改帐户凭据,此按钮也可能会派上用场, API keys, 或者只是作为调试的“出厂重置”按钮.
即使您足够聪明,可以为所有的瞬态键命名空间,这样您就有希望识别它们中的每一个 delete_transient ()
,最好的情况可能仍然涉及原始SQL,这是我在WordPress中总是尽量避免的:
get_transient_prefix() );
$options = $wpdb -> options;
$t = esc_sql("_transient_timeout_$prefix%");
$sql = $wpdb -> prepare (
"
选择option_name
从选择美元
WHERE option_name LIKE '%s'
",
$t
);
$transients = $wpdb -> get_col( $sql );
//每个暂态...
Foreach ($transient作为$transient) {
//去掉WordPress前缀,以便到达临时键.
$key = str_replace('_transient_timeout_', ', $transient ');
//现在我们有了键,使用WordPress core来删除瞬态.
Delete_transient ($key);
}
}
?>
不方便,不高效. 相反,这种情况需要对象缓存 因为对象缓存为我们提供了一种方便的方式来将缓存的值分组在一起. This way, 当您需要清空与插件相关的所有缓存值时, 这是一个简单的单行调用 Wp_cache_delete ($key, $group)
.
我可以这样总结: 如果还不擅长管理数据的缓存,就不可能成为使用api的专家.
作为客户, 需要注意的关键是在登台环境和生产环境之间异常的缓存行为. 换句话说, 尽管在暂存阶段测试新一批工作始终是一种很好的做法, 在生产环境中也必须同样小心地测试缓存.
在为我的插件布置各种PHP类时, 例如,我经常发现模仿API端点的定义方式很有帮助, 以下端点似乎有什么共同之处?
他们都回来了 集合, 我指的是GET请求的结果, 返回0到多的结果,其中每个结果都是数组的一个成员. 这听起来可能相当明显, 但我发现它是一个有用的提示以下类结构在我的PHP代码:
class.集合.php
抽象类class.用户.php
继承抽象类; 集合
.class.lists.php
继承抽象类; 集合
.class.活动.php
继承抽象类; 集合
.抽象类将把查询参数数组作为它的唯一参数:分页之类的东西, 列排序, 排序顺序, 搜索过滤器. 它将具有用于调用远程API等常见任务的方法, 处理错误, 并可能将结果转化为HTML 菜单或jQueryUI自动建议. 实例化抽象类的类可能非常短, 可能只是指定要在。中使用的字符串而已
*.json
API端点URL.
类似地,以下端点有什么共同之处?
它们都返回一个 item, 我指的是一个具体的, 集合中的唯一成员:比如一个特定的电子邮件订阅者, 一个邮件列表, 或者一个电子邮件活动. 因此,我喜欢在我的PHP代码中使用以下结构:
class.item.php
抽象类class.订阅者.php
继承抽象类; Item
.class.list.php
继承抽象类; Item
.class.campaign.php
继承抽象类; Item
.抽象类的唯一参数是一个字符串,用于标识所请求的特定项. 再一次, 被实例化的类可能非常短, 可能只是指定要使用的字符串 * / duy736td.json
.
有许多方法可以构造类继承, 但即使你采取了我上面概述的不同方法, 我敢打赌,远程API的结构很有可能有助于了解应用程序的结构.
作为客户, 糟糕架构的一个常见症状是,您发现自己不得不在整个应用程序中反复请求相同的更改. 例如, 如果您请求报告每页返回100个结果,而不是10个, 你必须不断重复请求用户报告, 活动报告, 取消订阅的报告, etc, 您可能会检测到糟糕的类体系结构. 在这种情况下, 问一问你的团队,他们是否能从重构周期中获益是值得的:重构周期是一组工作,其目标不是改变产品的行为,而是改进底层代码,以便将来更容易改变产品的行为.
WP_Error
我很尴尬地承认,我花了比应该多几年的时间才开始正确使用 WP_Error
我代码中的函数族. 我倾向于用自己的方式编写代码, 要么假设永远不会有值得编程关注的错误,要么逐案处理它们. 使用远程api就像一束激光一样可以打破这种心态, 因为它提供了一个非常方便和强大的用例 WP_Error
.
回想一下,我在前面提到过,我经常有一个PHP类,其目的是向远程API发出HTTP请求. 当你剥开所有的样板, 所有的数据操作, 所有次要的问题, 这门课归根结底就是打电话 wp_remote_request ()
以便从API获取HTTP响应对象. 方便, wp_remote_request ()
将返回一个 WP_Error
如果调用由于某种原因未能执行, 但是如果调用成功地返回了一个不利类型的HTTP响应呢?
举个例子,也许我们给 /lists.json
端点,但此特定帐户尚未设置任何列表. 这将返回一个有效的HTTP响应,但状态码为400. 虽然这本身并不是致命的错误, 从一些前端代码的角度来看,它们想把这个API调用变成一个下拉菜单, 400也可以是 WSOD! 因此,我发现对的结果做一些额外的解析很有帮助 wp_remote_request ()
,可能会返回 WP_Error
毕竟:
url, $this -> args );
$code = wp_remote_retrieve_response_code($response);
$first_digit = $code[0];
$good_responses = array(2,3);
if( ! In_array ($first_digit, $good_responses) {
$body = wp_remote_retrieve_body($response);
$out = new WP_Error($code, $body);
} else {
$out = $response;
}
返回$;
}
?>
此模式有助于简化调用调用方类的代码, 因为我们知道我们可以安全地依靠 is_wp_error ()
在继续输出之前.
作为客户, 您应该偶尔扮演恶意用户的角色, 困惑的用户, 一个没有耐心的用户. 以不应该使用的方式使用应用程序. 做一些开发者不希望你做的事情. 记下发生的事情. 您会得到有用的错误消息吗? 您得到任何错误消息吗? 如果不是这样,也许值得赞助一组更好的错误处理工作.
ob_get_clean ()
现代可编程网络, 几乎每个站点都使用其他站点的api, 并通过自己的API使用, 已经成为一个令人难以置信的强大的代码竞技场. 但正是这种品质也会让它变得相当缓慢.
远程HTTP请求通常是给定页面加载中最耗时的部分. 由于这个原因,许多api驱动的组件通过Ajax或cron执行. 例如, 用于搜索电子邮件订阅者列表的自动建议可能应该根据需要ping远程数据源, 每次击键时, 而不是全部装载100个,当页面加载时,在DOM内调用000个订阅者. 如果这不是一个选择, 也许大型查询可以在夜间cron任务上同步, 这样就可以从本地镜像而不是远程API提取结果.
这种方法的问题是很难调试. 而不是简单地打开 WP_DEBUG
并让错误消息滚动到浏览器窗口, 您被困在浏览器网络控制台中, 或者将日志文件作为cron任务跟踪(希望如此)?)正在执行. 我觉得这很不舒服.
改善这种状况的一个方法是谨慎地、战略性地打电话给 error_log ()
. 但话说回来, 对于大型或繁忙的应用程序,日志记录的一个常见问题是, 错误日志可能会变得太大, 或者增长过快, 用于监视或解析. 因此,我们必须对记录的内容有选择性, 就像我们对待实际的应用程序逻辑一样,在这上面花同样多的心思. 遗憾的是,花了时间记录了一些奇怪的边缘情况错误,这些错误似乎只在一些不常见的cron任务上间歇性地发生,但却意识到,由于未能记录某些特定的数组成员,错误的真实性质再次逃避了您, say, 违例值.
因此,我的哲学变成了, 我并不总是记录,但当我记录时,我会记录所有的事情. 换句话说, 在确定了一个特别令人担忧的功能之后, 我会把网撒得越宽越好
这相当于 var_dump ()
将整个错误值放入错误日志文件中的单个条目中.
作为客户机,应该定期检查应用程序的总文件内存使用情况. 如果您注意到您的主机帐户突然遇到存储限制, 很有可能是错误日志失控造成的. 您的开发人员将从专注于更好的日志记录的工作周期中受益,您的客户也将受益!
请原谅本文的列表结构. 我无法将这些要点整合成一个更统一的文章主题,因为这些模式非常通用: 它们适用于任何JSON REST端点和任何WordPress输出.
这些都是我一遍又一遍地看到的模式, 不管远程API是什么, 或者我们在WordPress中使用它. 到目前为止,我已经将所有这些原则收集到一个插件样板中,这大大加快了我的工作速度. 你是否对每个项目都保留了相似的观点? 请分享它们,这样我就可以窃取它们并将它们添加到我的样板中!
一种使用WordPress发布API的便捷方式. 这个API可以被其他WordPress站点使用, 其他非wordpress网站, 甚至是出版网站本身. 这是将WordPress用作“无头”CMS或仅用于小规模Ajax侦听器的流行方法.
API密钥是管理身份验证的常用方法. WordPress API兼容多种身份验证方法. 其中之一是WordPress REST API OAuth插件, 它为用户提供了管理API密钥的界面.
WP-JSON可以被认为是WordPress的RSS视图和它的普通前端视图的兄弟. 这是输出WordPress数据的另一种方式, 尽管大多数人类读者不会想要使用这种格式的WordPress. 相反,它的目的是供API客户端使用.
世界级的文章,每周发一次.
世界级的文章,每周发一次.