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.
Table of contents
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. Seeget_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 plugin row actions
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.