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 '';
}
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.
+
+ |
+