我目前正在尝试找出 2 个 Wordpress 插件之间的集成:WooCommerce 跟进电子邮件插件和忍者表单插件(最终目标是我们可以发送手动类型的跟进电子邮件模板作为响应忍者表单提交的操作)。我们正在使用 Ninja Forms 3,因为它物有所值。
在定义Action 类的选项时,我向用户提供了模板列表,以便在定义操作时他们可以选择要发送的模板。为了从后续电子邮件插件中获取电子邮件模板,我正在使用他们的API 客户端,特别是get_emails()
方法(反过来,它会转换为对/emails
API URL 下端点的 GET 调用)。
问题是这样的:在每个页面加载时ninja_forms_register_actions
都会调用动作,在此期间我会实例化我的动作类。在__construct
调用期间,我们填充操作的设置,为此,我们调用 Follow Up Emails API。这将启动页面加载,在此期间ninja_forms_register_actions
调用操作...
虽然我确实预料到了这个问题,但我计划的解决方案并没有帮助:也就是说,我计划使用瞬态来存储 API 调用的结果,如下所示:
private static function _get_templates()
{
error_log('_get_templates() started - ' . microtime(true));
if (false === ($templates = get_transient(self::TEMPLATE_TRANSIENT))) {
error_log('_get_templates() fetching - ' . microtime(true));
$fue_api = self::fue_api();
$templates = $fue_api->get_emails();
set_transient(self::TEMPLATE_TRANSIENT, $templates, self::TEMPLATE_TRANSIENT_EXPIRY);
error_log('_get_templates() fetched - ' . microtime(true));
}
error_log('_get_templates() done - ' . microtime(true));
return $templates;
}
但是,我的日志中的结果如下:
[22-May-2016 23:53:33 UTC] _get_templates() started - 1463961213.692187
[22-May-2016 23:53:33 UTC] _get_templates() fetching - 1463961213.694222
[22-May-2016 23:53:34 UTC] _get_templates() started - 1463961214.05998
[22-May-2016 23:53:34 UTC] _get_templates() fetching - 1463961214.061054
[22-May-2016 23:53:38 UTC] _get_templates() started - 1463961218.660683
[22-May-2016 23:53:38 UTC] _get_templates() fetching - 1463961218.661265
[22-May-2016 23:53:40 UTC] _get_templates() started - 1463961220.772228
[22-May-2016 23:53:40 UTC] _get_templates() fetching - 1463961220.774142
[22-May-2016 23:53:41 UTC] _get_templates() started - 1463961221.150277
[22-May-2016 23:53:41 UTC] _get_templates() fetching - 1463961221.654757
[22-May-2016 23:53:45 UTC] _get_templates() started - 1463961225.306565
[22-May-2016 23:53:45 UTC] _get_templates() fetching - 1463961225.308898
[22-May-2016 23:53:46 UTC] _get_templates() started - 1463961226.281794
[22-May-2016 23:53:46 UTC] _get_templates() fetching - 1463961226.283803
这一直持续到我终止 Web 服务器进程或其他诸如删除/重命名插件文件夹之类的激烈操作,此时瞬态中充满了 HTTP 错误代码(这本身并不令人惊讶)。很明显,我的瞬态解决方案不起作用,因为直到请求之后瞬态仍未设置。
在某些情况下,我会添加一个检查DOING_AJAX
,但是这不适合有两个原因 - 我仍然需要这些数据可供 Ninja Forms AJAX 进程使用,而且我不确定 DOING_AJAX 是否真的会在这里设置,因为 FUE API 不使用admin-ajax.php
. 我正在考虑更改为以下内容:
private static function _get_templates()
{
error_log('_get_templates() started - ' . microtime(true));
if (false === get_option(self::TEMPLATE_LOCK_OPTION, false) && false === ($templates = get_transient(self::TEMPLATE_TRANSIENT))) {
delete_option(self::TEMPLATE_LOCK_OPTION);
add_option(self::TEMPLATE_LOCK_OPTION, true, '', 'no');
error_log('_get_templates() fetching - ' . microtime(true));
$fue_api = self::fue_api();
$templates = $fue_api->get_emails();
delete_option(self::TEMPLATE_LOCK_OPTION);
set_transient(self::TEMPLATE_TRANSIENT, $templates, self::TEMPLATE_TRANSIENT_EXPIRY);
error_log('_get_templates() fetched - ' . microtime(true));
}
error_log('_get_templates() done - ' . microtime(true));
return $templates;
}
但是使用选项作为锁感觉很脏和错误,而且我觉得在使用对象缓存时它为错误留下了空间(例如 WPEngine 等)。有没有更好/正常的方法来处理这个问题,或者,上述是否没有真正的问题?
编辑:所以锁定解决方案也不能 100% 工作 - 我最终通过 WP Cron 作业完成了这项工作 - 每十分钟我们获取模板列表,而不是根据需要,并将其存储在一个选项中。我不喜欢这个解决方案——但我还没有想出一个更好的解决方案。如果这个问题有一个通用的解决方案,仍然很感兴趣。