public function error_handler($errno, $message, $file = null, $line = null)
{
switch ($errno) {
case E_WARNING:
case E_USER_WARNING:
$type = 'warning';
break;
case E_NOTICE:
case E_USER_NOTICE:
$type = 'notice';
break;
case E_STRICT:
$type = 'strict';
break;
case QM_E_DEPRECATED:
case QM_E_USER_DEPRECATED:
$type = 'deprecated';
break;
default:
return false;
break;
}
if (!class_exists('QM_Backtrace')) {
return false;
}
if (!isset(self::$unexpected_error)) {
// These strings are from core. They're passed through `__()` as variables so they get translated at runtime
// but do not get seen by GlotPress when it populates its database of translatable strings for QM.
$unexpected_error = 'An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the <a href="https://wordpress.org/support/">support forums</a>.';
$wordpress_couldnt = '(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)';
self::$unexpected_error = __($unexpected_error);
self::$wordpress_couldnt = __($wordpress_couldnt);
}
// Intentionally skip reporting these core warnings. They're a distraction when developing offline.
// The failed HTTP request will still appear in QM's output so it's not a big problem hiding these warnings.
if (self::$unexpected_error === $message) {
return false;
}
if (self::$unexpected_error . ' ' . self::$wordpress_couldnt === $message) {
return false;
}
$trace = new QM_Backtrace(array('ignore_current_filter' => false));
$caller = $trace->get_caller();
$key = md5($message . $file . $line . $caller['id']);
$filename = QM_Util::standard_dir($file, '');
if (isset($this->data['errors'][$type][$key])) {
$this->data['errors'][$type][$key]->calls++;
} else {
$this->data['errors'][$type][$key] = (object) array('errno' => $errno, 'type' => $type, 'message' => $message, 'file' => $file, 'filename' => $filename, 'line' => $line, 'trace' => $trace, 'calls' => 1);
}
return apply_filters('qm/collect/php_errors_return_value', false);
}