Перехват до W3 Total Cache
Я разрабатываю плагин, в котором мне нужно считывать User Agent и отправлять пользовательские заголовки для определенных агентов. Однако у некоторых пользователей установлен плагин W3 Total Cache, и когда мое условие срабатывает для отправки пользовательского заголовка, этот заголовок отправляется для ВСЕХ User Agent'ов, не выполняя мою логику событий. Я попытался загрузить свое событие с помощью...
add_action('plugins_loaded','MY_PLUGIN::checkRules',-1000000000);
...но W3 Total Cache перехватывает запросы через .htaccess или другим механизмом. К сожалению, мне нужно выполнять это на уровне plugins_loaded, потому что мне требуется выполнять запросы к get_option.
Как я могу заставить свой плагин работать, даже если активирован W3 Total Cache?
Если кэширование включено на уровне .htaccess, вы мало что можете сделать через плагин, чтобы перехватить этот трафик. Вместо этого вам следует разработать набор рекомендуемых правил .htaccess, которые будут работать как с W3TC, так и с вашим плагином, чтобы либо пропускать трафик, либо возвращать закэшированный контент.
Возможно, автоматически сгенерируйте список пользовательских агентов, для которых вы хотите отправлять пользовательские заголовки, и используйте этот список — через .htaccess — чтобы разрешить определённому трафику обходить кэш.
Я нашел решение. Необходимо использовать W3TC версии 0.9.2.4 или выше, потому что именно с этой версией я тестировал свои изменения кода. Мне пришлось редактировать код моего плагина и найти все места, где я проверяю user-agent и возвращаю ответ. Непосредственно перед тем, как вернуть отрицательный ответ (например, 404 или 403 — в зависимости от настроек плагина), я добавил эту строку:
define('DONOTCACHEPAGE', true);
Также обратите внимание, что проверка user-agent осуществлялась через вызов функции через событие WordPress, которое находится достаточно высоко в цепочке событий:
add_action('plugins_loaded','MYPLUGIN::checkAgents',-1000000000);
Этот add_action() важен, потому что он должен быть выполнен до загрузки плагина W3TC. Именно поэтому используется отрицательный приоритет.