При определении параметров класса Action я предоставляю пользователю список шаблонов, чтобы при определяя действие, они могут выбрать шаблон для отправки. Чтобы получить шаблоны электронных писем из плагина последующих писем, я использую их API-клиент, а именно метод get_emails() (который, в свою очередь, преобразуется в вызов GET к конечной точке /emails в разделе их URL-адрес API).
Проблема в следующем: при каждой загрузке страницы вызывается действие ninja_forms_register_actions, во время которого я создаю экземпляр своего класса действия. Во время вызова __construct мы заполняем настройки действия и для этого вызываем API Follow Up Emails. Это инициирует загрузку страницы, во время которой вызывается действие 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
В некоторых подобных ситуациях я бы добавил проверку на DOING_AJAX, однако это не подходит по двум причинам: мне все еще нужно, чтобы эти данные были доступны процессам AJAX Ninja Forms, а также я не уверен, действительно ли здесь будет установлен DOING_AJAX, поскольку API FUE не использует 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;
}
Редактировать: Таким образом, решение для блокировки не работает И 100% — в итоге я сделал это с помощью задания WP Cron — каждые десять минут мы извлекаем список шаблонов, а не по мере необходимости, и сохраняем его в опции. Мне это решение не особенно нравится, но лучшего я пока придумать не смог. Все еще интересно, есть ли общее решение этой проблемы.
Подробнее здесь: https://stackoverflow.com/questions/373 ... ng-own-api