Using WordPress ‘after_plugin_row’ PHP action

The after_plugin_row WordPress PHP action fires after each row in the Plugins list table, allowing you to perform actions or modify the output for each plugin row.

Usage

add_action('after_plugin_row', 'your_custom_function', 10, 3);

function your_custom_function($plugin_file, $plugin_data, $status) {
    // your custom code here
}

Parameters

  • $plugin_file (string) – Path to the plugin file relative to the plugins directory.
  • $plugin_data (array) – An array of plugin data. See get_plugin_data() and the ‘plugin_row_meta’ filter for the list of possible values.
  • $status (string) – Status filter currently applied to the plugin list. Possible values are: ‘all’, ‘active’, ‘inactive’, ‘recently_activated’, ‘upgrade’, ‘mustuse’, ‘dropins’, ‘search’, ‘paused’, ‘auto-update-enabled’, ‘auto-update-disabled’.

More information

See WordPress Developer Resources: after_plugin_row

Examples

Display a custom message for a specific plugin

Display a custom message under the row of a specific plugin in the Plugins list table.

add_action('after_plugin_row', 'display_custom_message', 10, 3);

function display_custom_message($plugin_file, $plugin_data, $status) {
    if ('your-plugin/your-plugin.php' == $plugin_file) {
        echo '<tr><td colspan="3" style="color: #ff0000;">This is a custom message for the Your Plugin.</td></tr>';
    }
}

Show a warning for outdated plugins

Show a warning message for plugins that haven’t been updated in over a year.

add_action('after_plugin_row', 'warn_outdated_plugins', 10, 3);

function warn_outdated_plugins($plugin_file, $plugin_data, $status) {
    $last_updated = strtotime($plugin_data['LastUpdated']);
    if ((time() - $last_updated) > 31536000) { // 1 year in seconds
        echo '<tr><td colspan="3" style="color: #ff0000;">Warning: This plugin has not been updated in over a year. Consider finding an alternative.</td></tr>';
    }
}

Add a custom link to the row actions of each plugin.

add_action('after_plugin_row', 'add_custom_link', 10, 3);

function add_custom_link($plugin_file, $plugin_data, $status) {
    $custom_link = '<a href="https://example.com" target="_blank">Visit Custom Link</a>';
    echo '<script>jQuery(document).ready(function() { jQuery("#' . esc_attr($plugin_file) . ' .row-actions").append(" | ' . addslashes($custom_link) . '"); });</script>';
}

Display the total number of active plugins

Display the total number of active plugins at the bottom of the Plugins list table.

add_action('after_plugin_row', 'display_total_active_plugins', 10, 3);

function display_total_active_plugins($plugin_file, $plugin_data, $status) {
    static $active_plugins_count = 0;

    if ('active' == $status) {
        $active_plugins_count++;
    }

    if ($GLOBALS['wp_list_table']->is_last_page()) {
        echo '<tr><td colspan="3">Total Active Plugins: ' . $active_plugins_count . '</td></tr>';
    }
}

Highlight premium plugins

Highlight premium plugins in the Plugins list table by changing their background color.

add_action('after_plugin_row', 'highlight_premium_plugins', 10, 3);

function highlight_premium_plugins($plugin_file, $plugin_data, $status) {
    $premium_plugins = array(
        'premium-plugin-1/premium-plugin-1.php',
        'premium-plugin-2/premium-plugin-2.php',
    );

    if (in_array($plugin_file, $premium_plugins)) {
        echo '<script>jQuery(document).ready(function() { jQuery("#' . esc_attr($plugin_file) . '").css("background-color", "#f0f8ff"); });</script>';
    }
}

Show plugin ratings

Display the rating of each plugin in the Plugins list table, based on your predefined list of ratings.

add_action('after_plugin_row', 'show_plugin_ratings', 10, 3);

function show_plugin_ratings($plugin_file, $plugin_data, $status) {
    $plugin_ratings = array(
        'plugin-1/plugin-1.php' => 4.5,
        'plugin-2/plugin-2.php' => 3.0,
        'plugin-3/plugin-3.php' => 5.0,
    );

    if (array_key_exists($plugin_file, $plugin_ratings)) {
        echo '<tr><td colspan="3">Rating: ' . $plugin_ratings[$plugin_file] . ' stars</td></tr>';
    }
}

These examples should help you understand how to use the after_plugin_row action in various scenarios. Feel free to modify the code according to your needs.