wp_get_plugin_action_button

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

WordPress Version: 6.5

/**
 * Gets the markup for the plugin install action button.
 *
 * @since 6.5.0
 *
 * @param string       $name           Plugin name.
 * @param array|object $data           {
 *     An array or object of plugin data. Can be retrieved from the API.
 *
 *     @type string   $slug             The plugin slug.
 *     @type string[] $requires_plugins An array of plugin dependency slugs.
 *     @type string   $version          The plugin's version string. Used when getting the install status.
 * }
 * @param bool         $compatible_php   The result of a PHP compatibility check.
 * @param bool         $compatible_wp    The result of a WP compatibility check.
 * @return string $button The markup for the dependency row button.
 */
function wp_get_plugin_action_button($name, $data, $compatible_php, $compatible_wp)
{
    $button = '';
    $data = (object) $data;
    $status = install_plugin_install_status($data);
    $requires_plugins = $data->requires_plugins ?? array();
    // Determine the status of plugin dependencies.
    $installed_plugins = get_plugins();
    $active_plugins = get_option('active_plugins', array());
    $plugin_dependencies_count = count($requires_plugins);
    $installed_plugin_dependencies_count = 0;
    $active_plugin_dependencies_count = 0;
    foreach ($requires_plugins as $dependency) {
        foreach (array_keys($installed_plugins) as $installed_plugin_file) {
            if (str_contains($installed_plugin_file, '/') && explode('/', $installed_plugin_file)[0] === $dependency) {
                ++$installed_plugin_dependencies_count;
            }
        }
        foreach ($active_plugins as $active_plugin_file) {
            if (str_contains($active_plugin_file, '/') && explode('/', $active_plugin_file)[0] === $dependency) {
                ++$active_plugin_dependencies_count;
            }
        }
    }
    $all_plugin_dependencies_installed = $installed_plugin_dependencies_count === $plugin_dependencies_count;
    $all_plugin_dependencies_active = $active_plugin_dependencies_count === $plugin_dependencies_count;
    sprintf(
        '<a class="install-now button" data-slug="%s" href="%s" aria-label="%s" data-name="%s">%s</a>',
        esc_attr($data->slug),
        esc_url($status['url']),
        /* translators: %s: Plugin name and version. */
        esc_attr(sprintf(_x('Install %s now', 'plugin'), $name)),
        esc_attr($name),
        _x('Install Now', 'plugin')
    );
    if (current_user_can('install_plugins') || current_user_can('update_plugins')) {
        switch ($status['status']) {
            case 'install':
                if ($status['url']) {
                    if ($compatible_php && $compatible_wp && $all_plugin_dependencies_installed && !empty($data->download_link)) {
                        $button = sprintf(
                            '<a class="install-now button" data-slug="%s" href="%s" aria-label="%s" data-name="%s">%s</a>',
                            esc_attr($data->slug),
                            esc_url($status['url']),
                            /* translators: %s: Plugin name and version. */
                            esc_attr(sprintf(_x('Install %s now', 'plugin'), $name)),
                            esc_attr($name),
                            _x('Install Now', 'plugin')
                        );
                    } else {
                        $button = sprintf('<button type="button" class="install-now button button-disabled" disabled="disabled">%s</button>', _x('Install Now', 'plugin'));
                    }
                }
                break;
            case 'update_available':
                if ($status['url']) {
                    if ($compatible_php && $compatible_wp) {
                        $button = sprintf(
                            '<a class="update-now button aria-button-if-js" data-plugin="%s" data-slug="%s" href="%s" aria-label="%s" data-name="%s">%s</a>',
                            esc_attr($status['file']),
                            esc_attr($data->slug),
                            esc_url($status['url']),
                            /* translators: %s: Plugin name and version. */
                            esc_attr(sprintf(_x('Update %s now', 'plugin'), $name)),
                            esc_attr($name),
                            _x('Update Now', 'plugin')
                        );
                    } else {
                        $button = sprintf('<button type="button" class="button button-disabled" disabled="disabled">%s</button>', _x('Update Now', 'plugin'));
                    }
                }
                break;
            case 'latest_installed':
            case 'newer_installed':
                if (is_plugin_active($status['file'])) {
                    $button = sprintf('<button type="button" class="button button-disabled" disabled="disabled">%s</button>', _x('Active', 'plugin'));
                } elseif (current_user_can('activate_plugin', $status['file'])) {
                    if ($compatible_php && $compatible_wp && $all_plugin_dependencies_active) {
                        $button_text = _x('Activate', 'plugin');
                        /* translators: %s: Plugin name. */
                        $button_label = _x('Activate %s', 'plugin');
                        $activate_url = add_query_arg(array('_wpnonce' => wp_create_nonce('activate-plugin_' . $status['file']), 'action' => 'activate', 'plugin' => $status['file']), network_admin_url('plugins.php'));
                        if (is_network_admin()) {
                            $button_text = _x('Network Activate', 'plugin');
                            /* translators: %s: Plugin name. */
                            $button_label = _x('Network Activate %s', 'plugin');
                            $activate_url = add_query_arg(array('networkwide' => 1), $activate_url);
                        }
                        $button = sprintf('<a href="%1$s" data-name="%2$s" data-slug="%3$s" data-plugin="%4$s" class="button button-primary activate-now" aria-label="%5$s">%6$s</a>', esc_url($activate_url), esc_attr($name), esc_attr($data->slug), esc_attr($status['file']), esc_attr(sprintf($button_label, $name)), $button_text);
                    } else {
                        $button = sprintf('<button type="button" class="button button-disabled" disabled="disabled">%s</button>', is_network_admin() ? _x('Network Activate', 'plugin') : _x('Activate', 'plugin'));
                    }
                } else {
                    $button = sprintf('<button type="button" class="button button-disabled" disabled="disabled">%s</button>', _x('Installed', 'plugin'));
                }
                break;
        }
        return $button;
    }
}