Chr*_*lly 8 php ajax wordpress ninja-forms
我目前正在尝试找出2个Wordpress插件之间的集成:WooCommerce跟进电子邮件插件和Ninja Forms插件(最终目标是我们可以发送手动类型的后续电子邮件模板作为响应忍者表单的操作提交).我们正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
但是我的日志中的结果如下:
[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
Run Code Online (Sandbox Code Playgroud)
这一直持续到我杀死网络服务器进程或其他像删除/重命名插件文件夹这样的事情,此时瞬态充满了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;
}
Run Code Online (Sandbox Code Playgroud)
但是使用选项作为锁感到肮脏和错误,我觉得它在使用对象缓存时会留下错误的空间(例如WPEngine等).是否有更好/正常的方法来解决这个问题,或者,上述问题是否存在真正的问题?
编辑:所以锁定解决方案也不能100%运行 - 我最终使用WP Cron作业完成了这项工作 - 我们每十分钟获取模板列表,而不是根据需要,并将其存储在一个选项中.我不喜欢特别喜欢这个解决方案 - 但我还没有能够提出一个更好的解决方案.如果这个问题有一个共同的解决方案,仍然感兴趣.
小智 0
最后打印的错误日志和第一个预期的 error_log 之间的方法/函数之一正在再次调用您的方法。要获得循环/递归开始的线索,您可以使用 debug_backtrace() 来获取调用堆栈以及循环/递归开始的点。
最好的开始位置是将 debug_backtrace 放在上次工作的 error_log 之后。