作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
斯科特·芬内尔的头像

斯科特•芬耐尔

Scott写过数百个WordPress主题和插件. 他专门从事第三方API集成,他是一个活跃的技术作家.

工作经验

15

Share

提升你的地位的最好方法之一 WordPress的开发者至少在您的客户眼中,是熟练使用api. 这里有一个实现WordPress API的常见场景:你的客户要求你向他们的站点添加一个小部件, 例如, 电子邮件订阅小部件. 您从他们的第三方电子邮件服务中获取一些代码——可能是脚本标记或 iframe-将其粘贴到页面中,然后回复客户:“明白了!”

不幸的是, 如果你面对的是一个要求更高的客户,他们会注意到你的以下缺点:

  • 尽管小部件, 就像网站的其他部分一样, 具有无衬线字体, 不太对. 这个小部件使用的是Helvetica字体,而不是您安装的自定义字体.
  • 小部件的订阅表单触发一个新的页面加载, 如果放在文章的中间,哪一个会造成破坏.
  • 这个小部件似乎在页面的其余部分加载之后需要额外的时间, 哪一种感觉不和谐又廉价.
  • 客户端希望订阅者使用基于他们订阅的帖子的元数据进行标记, 这个小部件不提供任何类似于这个功能的东西.
  • 客户端发现他们现在必须管理两个仪表板(wp-admin和电子邮件服务的管理区域)很烦人。.

在这一点上,两件事之一可能会合理地发生. 你可以宣称这些东西是“有就好”,并向你的客户保证这些东西的优点 80/20的解决方案,或者你可以满足这些要求. 就我个人经验而言, 我发现满足这样的要求——就是说, 展示对第三方服务的精通——是让客户相信你是一个WordPress向导的可靠方法. 另外,这通常很有趣.

在过去十年中, 我使用WordPress作为一个平台来使用大约50种不同的API. 一些最常见的api是MailChimp, 谷歌分析, 谷歌地图, CloudFlare, 和Bitbucket都. 但如果你需要做更多,如果你需要一个定制的解决方案?

如何开发WordPress API客户端

在本文中, 我将针对通用的“电子邮件服务”API进行开发, 我尽我所能让事情变得尽可能的不可知论. 然而,我确实觉得假设我们正在处理一个JSON REST API是合理的. 以下是一些背景主题,可能会帮助您欣赏本文中的技术要点:

如果你发现自己对这些话题有点熟悉,并且有兴趣深入挖掘, 现在暂停并下载优秀的 Postman 应用程序. 它允许您在不编写代码的情况下与api通信.

邮差仪表盘的截图

Postman. 也许是我最喜欢的开发工具?

但是,如果你对这些不熟悉,请继续阅读. 具有一定程度WordPress经验的技术观众将从本文中获益最多, 但我会尽力解释的 value 以一种不那么专业的方式来介绍每种技术. 非技术读者离开本文时,将能够在赞助本文之前评估每个点的ROI,并在交付后判断实现的质量.

Note: 如果您需要快速复习课程,您可以查看我们的 WordPress REST API指南.

没有进一步的序言, 请允许我与您分享一些不同的技术,我发现自己对大多数API都很欣赏, project, 和我一起工作的团队.

瞬态:什么时候握住它们,什么时候折叠它们

在我的开篇, 我注意到,客户发现跨越两个管理区域很烦人:wp-admin和他们的电子邮件服务的仪表板. 解决这个问题的一个好方法是在wp-admin中为它们提供一个仪表板小部件, 显示他们最近的订阅者活动摘要.

wp-admin仪表板小部件的屏幕截图

一个我们可能在WordPress中提供的仪表板UI类型的示例, 为我们的客户省去了找第三方电子邮件服务提供商的麻烦.

但话说回来, 这可能需要向远程API(由电子邮件服务提供的API)发出多个HTTP请求。, 导致页面加载时间过长. 这个性能问题的解决方案是将API调用存储为瞬态. This 食典委的文章 提供了一个很好的解释,你一定要读,但我将总结一下:

  1. 从远程API获取数据.
  2. 使用 set_transient () 根据您对性能的判断,您可以选择到期时间, 速度限制, 以及在此特定应用程序中显示过时数据的误差范围.
  3. 继续您的业务逻辑——处理数据,返回一个值,不管是什么情况.
  4. 当你再次需要数据时, 如在下一页加载, 在暂态缓存中检查它 get_transient () 然后得出结论,您需要从API获取它.

我认为这是一个有益的和可行的基础, 但是如果您考虑一下REST动词,您可以更进一步. 在五个最常见的方法中(GET, POST, PATCH, PUT, DELETE), 其中只有一个属于你的临时缓存. 你能猜出是哪一个吗? It’s GET. 在我的插件里, 我几乎总是有一个PHP类专门用于抽象对所讨论的远程API的调用, 实例化该类时的参数是HTTP方法. 如果它不是GET调用,那么我根本不打算调用任何缓存层.

此外, 如果不是GET调用, 那么我采取一些行动以某种方式改变远程数据是合理的, 也许可以加上, editing, 或者删除电子邮件订阅者. 这可能是使该资源的现有缓存失效的好时机 delete_transient ().

回到我们的WordPress邮件订阅API的例子, 以下是它在实践中的工作方式:

  • 显示最近订阅者的仪表板小部件将调用API端点 /用户 通过GET请求. 因为它是一个GET请求,所以它被存储在我的临时缓存中.
  • 订阅电子邮件列表的侧边栏小部件将调用API端点 /用户 通过POST请求. 因为这是POST请求, 它不仅会避开我的暂存缓存, 这会促使我删除临时缓存的相关部分, 以便仪表板小部件反映这个新的订阅者.
  • 命名瞬变时, 我经常按照我调用的远程API URL对它们进行命名,以此来组织它们. 这是识别要删除的正确暂态的方便方法. 如果它是一个接受参数的端点, 我将把它们连接到一个字符串中,并将它们也添加到暂态名称中.

作为客户或其他技术含量较低的利益相关者, 在应用程序从远程服务提取数据的任何时候,都应该专门请求临时缓存——或者至少讨论一下. 你应该熟悉优秀的人 查询监控 插件来查看瞬态是如何工作的. 它将为您提供一个界面,用于浏览作为暂存的数据, 的频率, 能维持多久.

有时候瞬变还不够好

一些高级WordPress托管服务实际上不允许你在生产环境中使用瞬态. 他们有代码在运行, 也许以MU插件或其他脚本的形式, 它将拦截您使用瞬态API的尝试,并通过 对象缓存 instead. WP-Engine,在其最常见的配置中,是这方面的一个主要例子.

标题中描述的phpMyAdmin视图的截图

phpMyAdmin UI中的一个令人震惊的景象:一个完全没有瞬态的生产站点? 这可能意味着对象缓存正在工作.

如果您只是存储和检索数据, 实际上,你不需要关心这个,甚至可能永远不会注意到它的发生. 整个家族 * _transient () 函数将为您提供相同的最终结果, 只是过滤使用对象缓存而不是临时缓存. 但是,在尝试删除瞬态时,您可能会遇到问题. 这是为什么.

如果您的API集成足够复杂,需要自己的设置页面, 您可能希望包含一个UI,以允许管理用户执行以下操作 清除插件的整个临时缓存. 此按钮最常见的用途是当客户端直接更改远程服务上的一些数据时, 并且想要使我们存储在WordPress中的缓存失效. 如果客户端更改帐户凭据,此按钮也可能会派上用场, API keys, 或者只是作为调试的“出厂重置”按钮.

选项按钮截图

一个UI示例,它允许客户端为其API数据清空本地缓存.

即使您足够聪明,可以为所有的瞬态键命名空间,这样您就有希望识别它们中的每一个 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的专家.

作为客户, 需要注意的关键是在登台环境和生产环境之间异常的缓存行为. 换句话说, 尽管在暂存阶段测试新一批工作始终是一种很好的做法, 在生产环境中也必须同样小心地测试缓存.

远程API可以帮助告知你的PHP类层次结构

在为我的插件布置各种PHP类时, 例如,我经常发现模仿API端点的定义方式很有帮助, 以下端点似乎有什么共同之处?

他们都回来了 集合, 我指的是GET请求的结果, 返回0到多的结果,其中每个结果都是数组的一个成员. 这听起来可能相当明显, 但我发现它是一个有用的提示以下类结构在我的PHP代码:

  • class.集合.php抽象类
  • class.用户.php 继承抽象类; 集合.
  • class.lists.php 继承抽象类; 集合.
  • class.活动.php 继承抽象类; 集合.

抽象类将把查询参数数组作为它的唯一参数:分页之类的东西, 列排序, 排序顺序, 搜索过滤器. 它将具有用于调用远程API等常见任务的方法, 处理错误, 并可能将结果转化为HTML

订阅意味着同意我们的 隐私政策

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

加入总冠军® 社区.