WordPress Version: 6.3
/**
* Internal helper function to find the plugin from a meta box callback.
*
* @since 5.0.0
*
* @access private
*
* @param callable $callback The callback function to check.
* @return array|null The plugin that the callback belongs to, or null if it doesn't belong to a plugin.
*/
function _get_plugin_from_callback($callback)
{
try {
if (is_array($callback)) {
$reflection = new ReflectionMethod($callback[0], $callback[1]);
} elseif (is_string($callback) && str_contains($callback, '::')) {
$reflection = new ReflectionMethod($callback);
} else {
$reflection = new ReflectionFunction($callback);
}
} catch (ReflectionException $exception) {
// We could not properly reflect on the callable, so we abort here.
return null;
}
// Don't show an error if it's an internal PHP function.
if (!$reflection->isInternal()) {
// Only show errors if the meta box was registered by a plugin.
$filename = wp_normalize_path($reflection->getFileName());
$plugin_dir = wp_normalize_path(WP_PLUGIN_DIR);
if (str_starts_with($filename, $plugin_dir)) {
$filename = str_replace($plugin_dir, '', $filename);
$filename = preg_replace('|^/([^/]*/).*$|', '\1', $filename);
$plugins = get_plugins();
foreach ($plugins as $name => $plugin) {
if (str_starts_with($name, $filename)) {
return $plugin;
}
}
}
}
return null;
}