From 3590d0bef80885dc4701ee63037f3c1926780d0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Schadegg=20Br=C3=B8nniche?= Date: Fri, 5 Dec 2025 15:59:32 +0100 Subject: [PATCH 1/2] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Upgrades=20bugsnag=20S?= =?UTF-8?q?DK=20to=20v3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bugsnag.php | 83 +++++++++++++++++++++++++-------------------------- composer.json | 2 +- 2 files changed, 42 insertions(+), 43 deletions(-) diff --git a/bugsnag.php b/bugsnag.php index 2f71fe3..356ac1e 100644 --- a/bugsnag.php +++ b/bugsnag.php @@ -9,6 +9,11 @@ License: GPLv2 or later */ +use Bugsnag\Client; +use Bugsnag\Handler; +use Bugsnag\ErrorTypes; +use Bugsnag\Report; + class Bugsnag_Wordpress { private static $COMPOSER_AUTOLOADER = 'vendor/autoload.php'; @@ -21,7 +26,7 @@ class Bugsnag_Wordpress 'url' => 'https://github.com/bugsnag/bugsnag-wordpress', ); - private $client; + private Client $client; private $apiKey; private $notifySeverities; private $filterFields; @@ -35,7 +40,7 @@ public function __construct() $this->pluginBase = 'bugsnag/bugsnag.php'; // Run init actions (loading wp user) - add_action('init', array($this, 'initActions')); + add_action('init', array($this, 'registerUser')); // Load admin actions (admin links and pages) add_action('admin_menu', array($this, 'adminMenuActions')); @@ -75,13 +80,13 @@ private function constructBugsnag() { // Activate the bugsnag client if (!empty($this->apiKey)) { - $this->client = new Bugsnag_Client($this->apiKey); + $this->client = Client::make($this->apiKey); $this->client->setReleaseStage($this->releaseStage()) ->setErrorReportingLevel($this->errorReportingLevel()) - ->setFilters($this->filterFields()); + ->setRedactedKeys($this->filterFields()); - $this->client->mergeDeviceData(['runtimeVersions' => ['wordpress' => get_bloginfo('version')]]); + $this->client->getConfig()->mergeDeviceData(['runtimeVersions' => ['wordpress' => get_bloginfo('version')]]); $this->client->setNotifier(self::$NOTIFIER); @@ -96,8 +101,7 @@ private function constructBugsnag() if ($set_error_and_exception_handlers === true) { // Hook up automatic error handling - set_error_handler(array($this->client, 'errorHandler')); - set_exception_handler(array($this->client, 'exceptionHandler')); + Handler::register($this->client); } } } @@ -105,7 +109,7 @@ private function constructBugsnag() private function requireBugsnagPhp() { // Bugsnag-php was already loaded by some 3rd-party code, don't need to load it again. - if (class_exists('Bugsnag_Client')) { + if (class_exists('Bugsnag\Client')) { return true; } @@ -142,7 +146,7 @@ private function errorReportingLevel() $severities = explode(',', $notifySeverities); foreach ($severities as $severity) { - $level |= Bugsnag_ErrorTypes::getLevelsForSeverity($severity); + $level |= ErrorTypes::getLevelsForSeverity($severity); } return $level; @@ -178,35 +182,28 @@ private function releaseStage() } // Action hooks - public function initActions() + public function registerUser() { - // This should be handled on stage of initializing, - // not even adding action if init failed. - // - // Leaving it here for now. - if (empty($this->client)) { - return; - } - - // Set the bugsnag user using the current WordPress user if available, - // set as anonymous otherwise. - $user = array(); - if (is_user_logged_in()) { - $wp_user = wp_get_current_user(); - - // Removed checks for !empty($wp_user->display_name), it should not be required. - $user['id'] = $wp_user->user_login; - $user['email'] = $wp_user->user_email; - $user['name'] = $wp_user->display_name; - } else { - $use_unsafe_spoofable_ip_address_getter = apply_filters('bugsnag_use_unsafe_spoofable_ip_address_getter', true); - $user['id'] = $use_unsafe_spoofable_ip_address_getter ? - $this->getClientIpAddressUnsafe() : - $this->getClientIpAddress(); - $user['name'] = 'anonymous'; - } + $this->client->registerCallback(function(Report $report) { + // Set the bugsnag user using the current WordPress user if available, + // set as anonymous otherwise. + $user = []; + + if (is_user_logged_in()) { + $wp_user = wp_get_current_user(); + $user['id'] = $wp_user->user_login; + $user['email'] = $wp_user->user_email; + $user['name'] = $wp_user->display_name; + } else { + $use_unsafe_spoofable_ip_address_getter = apply_filters('bugsnag_use_unsafe_spoofable_ip_address_getter', true); + $user['id'] = $use_unsafe_spoofable_ip_address_getter ? + $this->getClientIpAddressUnsafe() : + $this->getClientIpAddress(); + $user['name'] = 'anonymous'; + } - $this->client->setUser($user); + $report->setUser($user); + }); } // Unsafe: client can spoof address. @@ -289,14 +286,16 @@ public function testBugsnag() $this->notifySeverities = $_POST['bugsnag_notify_severities']; $this->filterFields = $_POST['bugsnag_filterfields']; - $this->constructBugsnag(); $this->client->notifyError( 'BugsnagTest', 'Testing bugsnag', - array( - 'notifier' => self::$NOTIFIER, - 'docs' => array('url' => 'https://docs.bugsnag.com/platforms/php/wordpress/'), - ) + function (Report $report) { + $report->setSeverity('info'); + $report->setMetaData([ + 'notifier' => self::$NOTIFIER, + 'docs' => array('url' => 'https://docs.bugsnag.com/platforms/php/wordpress/'), + ]); + } ); die(); @@ -346,7 +345,7 @@ public function __call($method, $arguments) return call_user_func_array(array($this->client, $method), $arguments); } - throw new BadMethodCallException(sprintf('Method %s does not exist on %s or Bugsnag_Client', $method, __CLASS__)); + throw new BadMethodCallException(sprintf('Method %s does not exist on %s or Bugsnag\Client', $method, __CLASS__)); } } diff --git a/composer.json b/composer.json index 057b7bd..544eb53 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "bugsnag/bugsnag-wordpress", "type": "wordpress-plugin", "require": { - "bugsnag/bugsnag": "^2.10.2", + "bugsnag/bugsnag": "^3.30.0", "composer/installers": "^1.0" }, "license": "MIT", From 6c062800fefbda3fb391c5bd8f2ed336784502a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Schadegg=20Br=C3=B8nniche?= Date: Mon, 8 Dec 2025 09:58:18 +0100 Subject: [PATCH 2/2] =?UTF-8?q?=E2=9C=A8=20Adds=20support=20for=20stabilit?= =?UTF-8?q?y=20tracking?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bugsnag.php | 17 +++++++++++++++++ views/settings.php | 14 ++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/bugsnag.php b/bugsnag.php index 356ac1e..04fb6b4 100644 --- a/bugsnag.php +++ b/bugsnag.php @@ -30,6 +30,7 @@ class Bugsnag_Wordpress private $apiKey; private $notifySeverities; private $filterFields; + private $trackSessions; private $pluginBase; public function __construct() @@ -37,6 +38,9 @@ public function __construct() // Activate bugsnag error monitoring as soon as possible $this->activateBugsnag(); + // Start session tracking if enabled as early as possible + $this->maybeTrackSession(); + $this->pluginBase = 'bugsnag/bugsnag.php'; // Run init actions (loading wp user) @@ -66,11 +70,13 @@ private function activateBugsnag() $this->apiKey = get_option('bugsnag_api_key'); $this->notifySeverities = get_option('bugsnag_notify_severities'); $this->filterFields = get_option('bugsnag_filterfields'); + $this->trackSessions = get_option('bugsnag_track_sessions'); } else { // Multisite $this->apiKey = get_site_option('bugsnag_api_key'); $this->notifySeverities = get_site_option('bugsnag_notify_severities'); $this->filterFields = get_site_option('bugsnag_filterfields'); + $this->trackSessions = get_site_option('bugsnag_track_sessions'); } $this->constructBugsnag(); @@ -181,6 +187,15 @@ private function releaseStage() return $release_stage_filtered; } + private function maybeTrackSession() + { + if(!checked($this->trackSessions, true, false)) { + return; + } + + $this->client->startSession(); + } + // Action hooks public function registerUser() { @@ -253,12 +268,14 @@ private function updateNetworkSettings($settings) update_site_option('bugsnag_api_key', isset($_POST['bugsnag_api_key']) ? $_POST['bugsnag_api_key'] : ''); update_site_option('bugsnag_notify_severities', isset($_POST['bugsnag_notify_severities']) ? $_POST['bugsnag_notify_severities'] : ''); update_site_option('bugsnag_filterfields', isset($_POST['bugsnag_filterfields']) ? $_POST['bugsnag_filterfields'] : ''); + update_site_option('bugsnag_track_sessions', isset($_POST['bugsnag_track_sessions']) ? $_POST['bugsnag_track_sessions'] : ''); update_site_option('bugsnag_network', true); // Update variables $this->apiKey = get_site_option('bugsnag_api_key'); $this->notifySeverities = get_site_option('bugsnag_notify_severities'); $this->filterFields = get_site_option('bugsnag_filterfields'); + $this->trackSessions = get_site_option('bugsnag_track_sessions'); echo '

Settings saved.

'; } diff --git a/views/settings.php b/views/settings.php index 9fe7182..4d5f233 100644 --- a/views/settings.php +++ b/views/settings.php @@ -70,6 +70,20 @@

+ + + + + + + + trackSessions, true); ?> /> +

+ Enable automatic session tracking to monitor stability metrics in your BugSnag dashboard. +
Read more about stability metrics. +

+ +