Edit File by line
/home/zeestwma/richards.../wp-conte.../plugins/woocomme.../src/Internal/Logging
File: SafeGlobalFunctionProxy.php
<?php
[0] Fix | Delete
[1] Fix | Delete
declare(strict_types=1);
[2] Fix | Delete
[3] Fix | Delete
namespace Automattic\WooCommerce\Internal\Logging;
[4] Fix | Delete
[5] Fix | Delete
/**
[6] Fix | Delete
* SafeGlobalFunctionProxy Class
[7] Fix | Delete
*
[8] Fix | Delete
* This class creates a wrapper for non-built-in functions for safety.
[9] Fix | Delete
*
[10] Fix | Delete
* @since 9.4.0
[11] Fix | Delete
* @package Automattic\WooCommerce\Internal\Logging
[12] Fix | Delete
*/
[13] Fix | Delete
class SafeGlobalFunctionProxy {
[14] Fix | Delete
[15] Fix | Delete
/**
[16] Fix | Delete
* Load missing function if we know where to find it.
[17] Fix | Delete
* Modify this file to add more functions to the map.
[18] Fix | Delete
*
[19] Fix | Delete
* @param string $name The name of the function to load.
[20] Fix | Delete
* @return void
[21] Fix | Delete
* @throws \Exception If the function is missing and could not be loaded.
[22] Fix | Delete
*/
[23] Fix | Delete
private static function maybe_load_missing_function( $name ) {
[24] Fix | Delete
$function_map = array(
[25] Fix | Delete
'wp_parse_url' => ABSPATH . WPINC . '/http.php',
[26] Fix | Delete
'home_url' => ABSPATH . WPINC . '/link-template.php',
[27] Fix | Delete
'get_bloginfo' => ABSPATH . WPINC . '/general-template.php',
[28] Fix | Delete
'get_option' => ABSPATH . WPINC . '/option.php',
[29] Fix | Delete
'get_site_transient' => ABSPATH . WPINC . '/option.php',
[30] Fix | Delete
'set_site_transient' => ABSPATH . WPINC . '/option.php',
[31] Fix | Delete
'wp_safe_remote_post' => ABSPATH . WPINC . '/http.php',
[32] Fix | Delete
'is_wp_error' => ABSPATH . WPINC . '/load.php',
[33] Fix | Delete
'get_plugin_updates' => array( ABSPATH . 'wp-admin/includes/update.php', ABSPATH . 'wp-admin/includes/plugin.php' ),
[34] Fix | Delete
'wp_get_environment_type' => ABSPATH . WPINC . '/load.php',
[35] Fix | Delete
'wp_json_encode' => ABSPATH . WPINC . '/functions.php',
[36] Fix | Delete
'wc_get_logger' => WC_ABSPATH . 'includes/class-wc-logger.php',
[37] Fix | Delete
'wc_print_r' => WC_ABSPATH . 'includes/wc-core-functions.php',
[38] Fix | Delete
);
[39] Fix | Delete
[40] Fix | Delete
if ( ! function_exists( $name ) ) {
[41] Fix | Delete
if ( isset( $function_map[ $name ] ) ) {
[42] Fix | Delete
$files = (array) $function_map[ $name ];
[43] Fix | Delete
foreach ( $files as $file ) {
[44] Fix | Delete
require_once $file;
[45] Fix | Delete
}
[46] Fix | Delete
} else {
[47] Fix | Delete
throw new \Exception( sprintf( 'Function %s does not exist and could not be loaded.', esc_html( $name ) ) );
[48] Fix | Delete
}
[49] Fix | Delete
}
[50] Fix | Delete
}
[51] Fix | Delete
[52] Fix | Delete
/**
[53] Fix | Delete
* Proxy for trapping all calls on SafeGlobalFunctionProxy.
[54] Fix | Delete
* Use this for calling WP and WC global functions safely.
[55] Fix | Delete
* Example usage:
[56] Fix | Delete
*
[57] Fix | Delete
* SafeGlobalFunctionProxy::wp_parse_url('https://example.com', PHP_URL_PATH);
[58] Fix | Delete
*
[59] Fix | Delete
* @since 9.4.0
[60] Fix | Delete
* @param string $name The name of the function to call.
[61] Fix | Delete
* @param array $arguments The arguments to pass to the function.
[62] Fix | Delete
* @return mixed The result of the function call, or null if an error occurs.
[63] Fix | Delete
*/
[64] Fix | Delete
public static function __callStatic( $name, $arguments ) {
[65] Fix | Delete
// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_set_error_handler -- Custom error handler is necessary to convert errors to exceptions
[66] Fix | Delete
set_error_handler(
[67] Fix | Delete
static function ( int $type, string $message, string $file, int $line ) {
[68] Fix | Delete
if ( __FILE__ === $file ) {
[69] Fix | Delete
// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace -- Used to adjust file and line number for accurate error reporting
[70] Fix | Delete
$trace = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 3 );
[71] Fix | Delete
$file = $trace[2]['file'] ?? $file;
[72] Fix | Delete
$line = $trace[2]['line'] ?? $line;
[73] Fix | Delete
}
[74] Fix | Delete
$sanitized_message = filter_var( $message, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
[75] Fix | Delete
// phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- $message sanitised above. we don't want to rely on esc_html since it's not a PHP built-in
[76] Fix | Delete
throw new \ErrorException( $sanitized_message, 0, $type, $file, $line );
[77] Fix | Delete
}
[78] Fix | Delete
);
[79] Fix | Delete
[80] Fix | Delete
try {
[81] Fix | Delete
self::maybe_load_missing_function( $name );
[82] Fix | Delete
$results = call_user_func_array( $name, $arguments );
[83] Fix | Delete
} catch ( \Throwable $e ) {
[84] Fix | Delete
self::log_wrapper_error( $name, $e->getMessage(), $arguments );
[85] Fix | Delete
$results = null;
[86] Fix | Delete
} finally {
[87] Fix | Delete
restore_error_handler();
[88] Fix | Delete
}
[89] Fix | Delete
[90] Fix | Delete
return $results;
[91] Fix | Delete
}
[92] Fix | Delete
[93] Fix | Delete
/**
[94] Fix | Delete
* Log wrapper function errors to "local logging" for debugging.
[95] Fix | Delete
*
[96] Fix | Delete
* @param string $function_name The name of the wrapped function.
[97] Fix | Delete
* @param string $error_message The error message.
[98] Fix | Delete
* @param array $context Additional context for the error.
[99] Fix | Delete
*/
[100] Fix | Delete
protected static function log_wrapper_error( $function_name, $error_message, $context = array() ) {
[101] Fix | Delete
self::maybe_load_missing_function( 'wc_get_logger' );
[102] Fix | Delete
[103] Fix | Delete
wc_get_logger()->error(
[104] Fix | Delete
'[Wrapper function error] ' . sprintf( 'Error in %s: %s', $function_name, $error_message ),
[105] Fix | Delete
array_merge(
[106] Fix | Delete
array(
[107] Fix | Delete
'function' => $function_name,
[108] Fix | Delete
'source' => 'remote-logging',
[109] Fix | Delete
),
[110] Fix | Delete
$context
[111] Fix | Delete
)
[112] Fix | Delete
);
[113] Fix | Delete
}
[114] Fix | Delete
}
[115] Fix | Delete
[116] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function