Плагин WordPress выполняет код дважды

Вопрос или проблема

Я разрабатываю плагин для 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. Давайте подробно рассмотрим возможные причины этого поведения и представим решения для их устранения.

Проблема выполнения кода

Исходя из вашего описания, проблема заключается в том, что ваш код, который инкрементирует количество посещений пользователя, срабатывает дважды. Это может случиться по нескольким причинам:

  1. Множественные HTTP-запросы: WordPress может загружать плагины при различных запросах, включая фоновую обработку, например, через wp-cron. Каждый раз, когда выполняется такая задача, ваш код может быть выполнен снова.

  2. Запросы через AJAX: Если на вашем сайте есть элементы, которые используют Ajax (например, обновление контента без перезагрузки страницы), это также может привести к многократному выполнению плагина.

  3. Проблемы с кэшем: Иногда кэширование на сервере или в браузере может вызывать множественные запросы для одной и той же страницы.

Рекомендации по устранению проблемы

Чтобы решить указанную проблему, вы можете применить следующие подходы:

  1. Используйте действия WordPress: Вместо того чтобы выполнять код на момент загрузки плагина, используйте хуки, чтобы отслеживать конкретные события в WordPress. Например, вы можете добавить счетчик в действие wp, которое вызывается после загрузки WordPress и перед тем, как отображается HTML-код.

    add_action('wp', 'increment_visit_count');
    
    function increment_visit_count() {
       // Ваш код для увеличения числа посещений здесь.
    }
  2. Проверка типа запроса: Убедитесь, что ваш код выполняется только для определённых типов запросов. Например, вы можете проверять, не является ли текущий запрос фоновым:

    if (!defined('DOING_AJAX') && !defined('DOING_CRON')) {
       // Ваша логика работы со счетчиком визитов.
    }
  3. Логирование запросов: Используйте переменную $_SERVER['REQUEST_URI'], чтобы отслеживать, какие запросы поступают к вашему плагину. Это поможет выявить дополнительные запросы (например, к .css.map файлам), которые могут привести к выполнению кода.

  4. Временные метки: Добавьте временные метки в лог для каждой инкрементации, чтобы анализировать, когда именно происходит дублирование:

    error_log('Visit count increased at: ' . date('Y-m-d H:i:s'));

Экспертиза и диагностика

Если ничего из вышеперечисленного не помогло, вы можете подключить отладку. Используйте инструменты разработчика в браузере, чтобы проследить все сетевые запросы. Обратите внимание на то, какие запросы инициируют выполнение вашего кода и в каких ситуациях это происходит.

Следуя данным рекомендациям и методам, вы сможете устранить проблему с двойным выполнением кода в вашем плагине WordPress и корректно реализовать функционал учета посещений. Важно помнить, что оптимизация кода и логики его работы — это залог успешного и стабильного функционирования вашего плагина.

Оцените материал
Добавить комментарий

Капча загружается...