我学到了2023年为WordPress构建数据同步插件的知识
#php #wordpress #oop #learning

作为PHP和WordPress插件开发的相对新来者,一开始构建自定义数据同步工具的任务一开始就感到艰巨。客户需要定期将数据从复杂的第三方API提取到WordPress自定义帖子类型和媒体附件中。有了很高的期望,我知道插件需要坚固,灵活和良好的结构。

在整个开发过程中,我学到了有关将外部数据同步到WordPress的最佳实践的巨大数量。在这篇文章中,我想分享有关优化,工具和体系结构的关键知识,以帮助我构建有效的插件。无论您是集成第三方API还是处理大量数据,这些技巧都将帮助您迈向可维护的可伸缩方法。

使用作曲家进行插件依赖性管理

在此项目之前,我不熟悉作曲家。但是对于复杂插件任何PHP项目,它对于依赖项管理都是无价的。

作曲家允许您:

  • 声明依赖项:轻松从Packagist和Github中汲取PHP包装。
// composer.json
{
  "require": {
    "monolog/monolog": "^2.0" 
  }  
}
  • 管理更新:作曲家可以使依赖关系自动保持最新。

  • 简化安装:其他开发人员可以使用一个composer install安装DEP。

对于我的插件,作曲家允许我快速整合库以登录,迁移和API请求而不大惊小怪。

优化大量批处理处理

核心要求是从API中进口数百个记录和相关的媒体资产。与事后看来,我会说一个好的经验法则是:批处理过程,总是。

顺利处理:

  • 块大批量:进口数百个物品时,将它们分成几百个较小的块。这样可以防止击中PHP超时或内存限制。
// Pseudocode for chunking data sync

$batchSize = 100;
$data = downloadAPIData(); 

foreach(array_chunk($data, $batchSize) as $chunk) {

  // Process sync chunk
  processData($chunk); 

  // Queue next chunk 
  queueNextImportBatch($chunk);

}
  • 注意限制:WordPress主机,例如WPENGINE限制php执行时间,每个请求( wpengine caps caps caps 60秒)。批处理避免了超时。

  • 调整php设置:增加max_execution_timememory_limit以适合您的批量尺寸,但请仔细测试。

  • 队列故障:大型同步期间偶尔发生故障。队列失败的记录以后重试。

理解这样的细微差别进行了一些反复试验,但是在早期意识到托管限制并在周围进行设计至关重要。对于任何复杂的批处理处理,我现在知道彻底掌握WP-Cron的行为和局限性是多么重要。

在内外学习WordPress Cron

我严重依赖wp_cron()来安排重复同步。但是它的局限性使我振作起来。

wp_cron()学习:

  • 不是真正的cron wp_cron()使用页面加载,而不是背景cron作业。因此,在低流量站点上同步摊位。

  • 避免长期工作:不要安排wp_cron()中的铁杆处理或请求超时。

  • 解决方法:使用真正的cron调用php脚本或插件模仿cron。

  • 仔细安排:“每日”克朗可能不会每天流量低。保守或依靠第三方服务来定期ping您的wp-cron.php文件以促进按时任务运行。

使用数据库表构建自定义队列

为了解决最大执行时间限制,我使用数据库表构建了一个自定义队列。这允许通过使用CRON作业将任务执行分解为块。在理解其局限性之后,我决定使用WP-Cron。一些设计技巧:

  • 将作业存储在包含ID,有效载荷,检索等作业数据的wp_queue表中,等等

  • 写Cron Jobs以在以下时间的间隔上安排脱水工作。

// Dequeue jobs every 5 minutes
wp_schedule_event(time(), '5min', 'myplugin_dequeue_cron'); 
  • 在每个dequeue上,在重新加入其余的之前处理X作业。

  • 在脱水时使用行锁以防止比赛条件。

这让我在多个较小的cron执行中分解同步以避免超时。

使用OOP和可维护代码的坚实原理

客户期望插件随着时间的推移而稳健且可维护,我承诺在可能的情况下使用坚实的原理。 Solid是罗伯特·C·马丁(Robert C.

  • 单一责任原则
  • 开放/关闭原理
  • Liskov替代原则
  • 接口隔离原理
  • 依赖性反转原理

WordPress插件不需要OOP,但是使用面向对象的代码和固有原理使插件更容易维护和扩展。

OOP和固体的一些好处:

  • 封装:群相关的特征以隐藏复杂性。

  • 模块化:不同的类允许分离每个SRP。

  • 可重用性:子类和继承能够重复使用父逻辑。

  • 可维护性:固体促进构建可维护的自适应代码。

当您 can 以程序风格的方式获得,我强烈建议您用于非平凡插件的OOP/Solid。投资的时间在后来的开发中得到了回报。

要实现固体,我采用了一种面向对象的方法,并根据功能将同步逻辑分为单独的类:

  • 数据检索器 - 负责从外部API
  • 获取数据
  • 数据处理器 - 解析,归一化并准备进口数据
  • 数据作者 - 将处理的数据导入WordPress

使用依赖项注入,我能够在运行时独立配置每个类。这使系统比拥有一个单片程序脚本更具动态和灵活性。在道路上添加新的数据源或调整逻辑会更简单。

采用坚实的原则需要更多的计划和架构,但是我相信,从长远来看,通过提高可维护性,它将获得回报。我的客户对插件体系结构的模块化却有多凝聚感到非常满意。

构建强大的记录仪

在复杂的同步过程中,强大的记录对于监视和调试问题至关重要。

像大多数非平凡的编程项目一样,我在整个开发过程中遇到了许多错误,边缘案例和意外问题。值得庆幸的是,我学到了一些有用的工具和技术来调试WordPress插件:

  • 自定义Logger类 - 我创建了一个简单的记录类,用于调试消息和错误。这使我可以轻松地跟踪执行并查明发生问题的地方。
  • wp_debug常数 - 在wp -config.php中启用wp_debug常数显示PHP警告和通知。非常适合在开发过程中捕捉问题。
  • Xdebug- PHP扩展程序,允许步骤调试和性能分析。当您需要暂停执行和分析变量值时,无价。
  • whoops-一个PHP库,它会导致有用的错误消息和堆栈跟踪。使调试的令人沮丧得多。
  • 浏览器开发人员工具 - 在调试基于React的管理员UI时,网络面板和JavaScript控制台非常有用。
  • 邮递员或卷曲以轻松查询和测试API端点

在解决不可避免的插件问题时保持我的理智,在调试,伐木和错误处理的工具和实践上投入时间。

  • 为一致的API创建一个记录类:
// Pseudocode logger

class Logger {

  public function info($message){}
  public function error($message){}

}
  • 日志密钥事件,例如API请求,数据库查询,批量总计。

  • 实现过滤的日志级别(信息,警告,错误等)。

  • 支持控制台,文件和数据库记录。

不要等到错误堆积 - 尽早构建一个记录仪以保持插件的作用。

其他WordPress插件

这还有其他一些常见的陷阱:

  • 小心地处理激活/停用/卸载挂钩。

  • 遵循WordPress编码标准。

  • 在输出之前对消毒和逃脱动态数据。

  • 学习设置页面和数据存储的最佳实践。

  • 利用模块化,可扩展代码的动作和过滤器。

花点时间学习特定于WordPress的公约 - 它将在稳定中支付红利。

仔细考虑JavaScript前端

我辩论的一个决定是是否与React构建Admin UI。最后,我选择不 - 方便使用复杂的UI,但该项目的反应过于杀伤。

在添加JavaScript前端之前要考虑的事情:

pros

  • 更少的页面重新加载。
  • 轻松管理复杂的组件状态。
  • 使用诸如React或Vue的熟悉框架。

cons

  • 陡峭的学习曲线,如果新的JS框架。
  • 其他资产和建立过程。
  • 通常不必要的复杂性。

对于许多插件,从香草JavaScript开始就足够了。仅在您有经验或需要其高级功能的情况下才能达到React/Vue。

关键要点

首先,虽然复杂,但我从构建此自定义插件方面出现了更大的熟练性。优化大量数据,掌握WP Cron,利用作曲家和应用OOP/SOLID在构建系统中至关重要。

构建可维护的,可扩展的插件所需的学习有组织的方法,而不仅仅是PHP基础知识。

**ð§您从解决自定义WordPress项目中学到了什么教训?在评论中分享您的经验!**

快乐黑客