Я работаю над настраиваемым плагином для переносчика контента в WordPress, который мой клиент попросил меня создать. Он говорит, что хочет, чтобы он перехватывал событие просмотра страницы и, если это подходящее время суток (24 часа с момента последнего сообщения), извлекал файл ресурса и выводил другое сообщение. Ему нужно было также поднять флаг и не дать другим сеансам запустить тот же фрагмент кода. Итак, поднимите какой-нибудь флаг, говорящий: «Я публикую этот пост, уйду из другого процесса», а затем он делает этот пост и снова выпускает флаг.
Однако самое странное происходит, когда он загружен несколькими сеансами, попадающими на сайт с просмотром страниц. Он запускает вместо одного поста - он случайным образом делает 1, 2 или 3 лишних поста, при этом каждый думает, что это было подходящее время для поста, потому что прошло 24 часа после времени последнего поста. Поскольку это несколько случайно, я предполагаю, что проблема в некотором кешировании записи, когда другие сеансы еще не видят поднятый флаг, пока не пройдет пара микросекунд.
Плагин поднимал «флаг», просто записывая данные в таблицу wp_options с помощью API update_option () в WordPress. Другие сеансы пользователя должны были прочитать это значение с помощью get_option () и увидеть флаг, а затем не запускать тот фрагмент кода, который создает сообщение, потому что данный сеанс уже делал это. Затем, когда закончите, я опускаю флаг, и другие сеансы продолжаются как обычно.
Но то, что он делает, это пропускает другие сессии.
Чтобы сделать это, я использовал add_action ('loop_start', 'checkToAddContent'). Странная вещь в этой функции заключается в том, что она вызывается более одного раза на странице, и на самом деле некоторые плагины могут вызывать ее. Я не знаю, есть ли лучшее событие, чтобы зацепить. Тем не менее, даже если я найду событие для перехвата, которое запускается только один раз при просмотре страницы, у меня все равно есть несколько сеансов, с которыми приходится бороться (разные пользователи, которые могут просматривать страницу одновременно), и я хочу, чтобы только один данный сеанс вызывал содержание сообщения, когда оно должно быть в расписании.
Мне интересно, есть ли какие-нибудь разработчики плагинов WordPress, которые могли бы предложить другую зацепку для события, чтобы зацепиться за нее, и найти другой способ поднять флаг, который увидят все сессии. Я имею в виду, что я мог бы использовать API разделяемой памяти в PHP, но во многих планах хостинга это отключено. Невозможно использовать cookie или var сессии, потому что это только один сеанс. Единственное, что может работать в разных планах хостинга, - это вместо этого удалить файл как флаг. Если файл присутствует, то один сеанс имеет флаг. Если файл отсутствует, другие сеансы могут попытаться получить флаг. Конечно, я мог бы использовать файловый маршрут, но, на мой взгляд, он немного незрелый, и мне было интересно, смогу ли я что-нибудь сделать в WordPress.