Вопрос или проблема
Я разрабатываю плагин для WordPress и столкнулся с неожиданной проблемой: код моего плагина выполняется дважды.
Пожалуйста, посмотрите мой код плагина:
/* Название плагина: имя плагина
URI плагина:
Описание: Описание
Версия: 1.0
Автор: Автор
URI автора:
Лицензия: GPLv2 или более поздняя
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Выход, если доступ к файлу произведен напрямую
}
require_once(dirname(__FILE__) . '/lib/visit_stats.php');
Вот мой код visit_stats.php:
// Текущий id пользователя wordpress
$userid = 3;
// Получение значения посещений из метаданных пользователя
$oldvisitdata = get_user_meta($userid, "visits", true);
// Например, если возвращается 3
// Теперь увеличиваем старое значение посещений на 1
$newvisit = $oldvisitdata + 1;
// Теперь обновляем метаданные
update_user_meta($userid, 'visits', $newvisit);
Когда мы получаем значение, оно должно быть 4, но вместо этого 5, что означает, что когда я добавляю 1, оно добавляет 2 к старому значению. Я думаю, что это только потому, что скрипт выполняется дважды.
Я провел тест, чтобы подтвердить это, вот вывод времени: <date=12:36:34 am> <date=12:36:41am>
. Когда я открываю свой сайт, мой плагин должен выполнять код только один раз, но он делает это дважды, так как разница составляет 7 секунд. Мой код выполняется дважды в интервале 7 секунд.
Я не понимаю, почему это происходит.
Довольно просто, он загружается больше одного раза, потому что вы, вероятно, на самом деле делаете более одного HTTP-запроса к “WordPress”.
Вам не следует делать что-либо такое, как подсчет на загрузке плагина, потому что WordPress может загружаться в различных ситуациях, иногда более одного раза даже для одного просмотра страницы.
Процесс wp-cron, например, может выполняться в фоновом режиме по другому запросу для обработки таких задач, как запланированные публикации, проверки обновлений, очистка корзины и другие подобные рутинные задачи. Эти HTTP-запросы действительно загружают плагины, чтобы плагины могли делать что-то, когда вызывается процесс wp-cron.
Элементы главной панели управления, такие как “Новости WordPress”, отображаются с помощью Javascript. Это отдельные запросы в бэкенде к routines admin-ajax, которые загружают WordPress для доступа к HTTP-функциям, а затем для получения данных из RSS-лент WordPress.org. Эти запросы загружают большую часть WordPress, включая плагины.
Так что то, что вы считаете, скорее, является счетчиком “посещений”, а не счетчиком “хитов”, и одно посещение может быть более чем одним хитом. Если вы действительно хотите считать посещения, вам следует считать гораздо более избирательно, игнорируя такие вещи, как фоновые запросы.
- Когда процесс cron выполняется, определение DOING_CRON будет установлено.
- Когда выполняется AJAX-запрос, определение DOING_AJAX будет установлено, если он проходит через систему admin-ajax. Однако имейте в виду, что многие плагины и темы используют свою собственную систему обратных вызовов к WordPress и могут не быть легко распознаваемыми.
Таким образом, вы можете игнорировать эти хиты в своем счетчике. Но реалистично, вы все равно получите “ложные” увеличения счетчика от других плагинов и тем. Поэтому вам следует вместо этого изменить свой метод подсчета, чтобы не считать на загрузке плагина, а вместо этого считать на специфичных хуках действий WordPress, которые вы хотите отслеживать.
Ответ Отто отличный, но я просто хотел добавить некоторую дополнительную информацию. Попробуйте посмотреть на URI запроса, изучив следующую переменную:
$_SERVER['REQUEST_URI']
Это позволит вам определить, выдает ли браузер пользователя другой запрос, который вызывает повторный запуск WordPress.
В моем случае эта проблема возникла из-за запроса на файл .css.map, который был включен в выходные css файлы SASS, что приводило к повторному выполнению WordPress на apache!
Я только что столкнулся с проблемой загрузки файлов карт (хотя и js.map файлы); Я в панике, потому что страница загружалась 5..6…7 раз в моих журналах. ЧТО ПРОИСХОДИТ. Я осознал, что это происходило только тогда, когда Chrome имел открытые инструменты разработчика. И, есть настройка, позволяющая отключить загрузку файлов карт.
Ответ или решение
Обработка ошибки двойного выполнения кода в плагине WordPress
При разработке плагина для WordPress вы сталкиваетесь с проблемой, когда код вашего плагина выполняется дважды, в результате чего счетчик посещений пользователя увеличивается на 2, вместо ожидаемого 1. Давайте подробно рассмотрим возможные причины этого поведения и представим решения для их устранения.
Проблема выполнения кода
Исходя из вашего описания, проблема заключается в том, что ваш код, который инкрементирует количество посещений пользователя, срабатывает дважды. Это может случиться по нескольким причинам:
-
Множественные HTTP-запросы: WordPress может загружать плагины при различных запросах, включая фоновую обработку, например, через wp-cron. Каждый раз, когда выполняется такая задача, ваш код может быть выполнен снова.
-
Запросы через AJAX: Если на вашем сайте есть элементы, которые используют Ajax (например, обновление контента без перезагрузки страницы), это также может привести к многократному выполнению плагина.
-
Проблемы с кэшем: Иногда кэширование на сервере или в браузере может вызывать множественные запросы для одной и той же страницы.
Рекомендации по устранению проблемы
Чтобы решить указанную проблему, вы можете применить следующие подходы:
-
Используйте действия WordPress: Вместо того чтобы выполнять код на момент загрузки плагина, используйте хуки, чтобы отслеживать конкретные события в WordPress. Например, вы можете добавить счетчик в действие
wp
, которое вызывается после загрузки WordPress и перед тем, как отображается HTML-код.add_action('wp', 'increment_visit_count'); function increment_visit_count() { // Ваш код для увеличения числа посещений здесь. }
-
Проверка типа запроса: Убедитесь, что ваш код выполняется только для определённых типов запросов. Например, вы можете проверять, не является ли текущий запрос фоновым:
if (!defined('DOING_AJAX') && !defined('DOING_CRON')) { // Ваша логика работы со счетчиком визитов. }
-
Логирование запросов: Используйте переменную
$_SERVER['REQUEST_URI']
, чтобы отслеживать, какие запросы поступают к вашему плагину. Это поможет выявить дополнительные запросы (например, к .css.map файлам), которые могут привести к выполнению кода. -
Временные метки: Добавьте временные метки в лог для каждой инкрементации, чтобы анализировать, когда именно происходит дублирование:
error_log('Visit count increased at: ' . date('Y-m-d H:i:s'));
Экспертиза и диагностика
Если ничего из вышеперечисленного не помогло, вы можете подключить отладку. Используйте инструменты разработчика в браузере, чтобы проследить все сетевые запросы. Обратите внимание на то, какие запросы инициируют выполнение вашего кода и в каких ситуациях это происходит.
Следуя данным рекомендациям и методам, вы сможете устранить проблему с двойным выполнением кода в вашем плагине WordPress и корректно реализовать функционал учета посещений. Важно помнить, что оптимизация кода и логики его работы — это залог успешного и стабильного функционирования вашего плагина.