_get_plugin_from_callback

The timeline below displays how wordpress function _get_plugin_from_callback has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

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;
}

WordPress Version: 5.0

/**
 * 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) && false !== strpos($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 (strpos($filename, $plugin_dir) === 0) {
            $filename = str_replace($plugin_dir, '', $filename);
            $filename = preg_replace('|^/([^/]*/).*$|', '\1', $filename);
            $plugins = get_plugins();
            foreach ($plugins as $name => $plugin) {
                if (strpos($name, $filename) === 0) {
                    return $plugin;
                }
            }
        }
    }
    return null;
}