Creating Custom Admin Notices in WordPress
Basic Approach
Admin notices are the messages that appear at the top of WordPress admin pages. They're useful for displaying important information, success messages, or warnings to users.
Main Implementation Method
Basic admin notice that displays immediately:
function display_custom_admin_notice() {
$class = 'notice notice-success is-dismissible';
$message = 'This is a custom admin notice!';
printf('<div class="%1$s"><p>%2$s</p></div>', esc_attr($class), esc_html($message));
}
add_action('admin_notices', 'display_custom_admin_notice');
Notice Types
WordPress provides several built-in notice classes:
-
notice-success
(green)
-
notice-error
(red)
-
notice-warning
(yellow)
-
notice-info
(blue)
Making Notices Dismissible
To create a dismissible notice that stays hidden after user clicks the X:
function display_dismissible_admin_notice() {
// Check if user already dismissed the notice
if (get_user_meta(get_current_user_id(), 'custom_notice_dismissed', true)) {
return;
}
?>
<div class="notice notice-info is-dismissible" data-dismissible="custom-notice">
<p>This notice will stay dismissed after clicking the X button!</p>
</div>
<?php
}
function handle_notice_dismiss() {
if (!current_user_can('manage_options')) {
return;
}
if (isset($_GET['dismiss_notice']) && $_GET['dismiss_notice'] === 'custom-notice') {
update_user_meta(get_current_user_id(), 'custom_notice_dismissed', true);
}
}
add_action('admin_notices', 'display_dismissible_admin_notice');
add_action('admin_init', 'handle_notice_dismiss');
Conditional Notices
Show notices only on specific admin pages:
function display_conditional_admin_notice() {
$screen = get_current_screen();
// Show only on plugin installation page
if ($screen->id !== 'plugins') {
return;
}
echo '<div class="notice notice-warning"><p>This notice appears only on the plugins page!</p></div>';
}
add_action('admin_notices', 'display_conditional_admin_notice');
Best Practices
- Always escape output using
esc_html()
or esc_attr()
- Use specific conditions to show notices only when needed
- Include clear, actionable messages
- Add proper user capability checks
- Don't overuse notices to avoid annoying users
Security Considerations
- Verify user capabilities before showing sensitive information
- Sanitize and validate all input data
- Use nonces for dismissible notices
- Escape all output
Common Pitfalls
- Showing too many notices simultaneously
- Not escaping output properly
- Forgetting to check user capabilities
- Creating non-dismissible notices for persistent messages
Helpful Plugins
-
Admin Notices Manager - Helps manage and customize admin notices
-
AJAX Dismissible Admin Notices - Adds AJAX functionality to dismissible notices
Advanced Example with AJAX Dismissal
Here's a more advanced implementation using AJAX:
// Enqueue necessary scripts
function enqueue_notice_scripts() {
wp_enqueue_script('custom-notices', plugins_url('notices.js', __FILE__), array('jquery'), '1.0', true);
wp_localize_script('custom-notices', 'customNotices', array(
'ajaxurl' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('custom_notice_nonce')
));
}
add_action('admin_enqueue_scripts', 'enqueue_notice_scripts');
// AJAX handler for notice dismissal
function handle_notice_ajax_dismiss() {
if (!check_ajax_referer('custom_notice_nonce', 'nonce', false)) {
wp_send_json_error('Invalid nonce');
}
if (!current_user_can('manage_options')) {
wp_send_json_error('Insufficient permissions');
}
update_user_meta(get_current_user_id(), 'custom_notice_dismissed', true);
wp_send_json_success();
}
add_action('wp_ajax_dismiss_custom_notice', 'handle_notice_ajax_dismiss');
Create a corresponding JavaScript file (notices.js):
jQuery(document).ready(function($) {
$(document).on('click', '.notice-dismiss', function() {
var $notice = $(this).closest('.notice');
$.ajax({
url: customNotices.ajaxurl,
type: 'POST',
data: {
action: 'dismiss_custom_notice',
nonce: customNotices.nonce
},
success: function(response) {
if (response.success) {
$notice.fadeOut();
}
}
});
});
});
These examples should give you a solid foundation for implementing custom admin notices in WordPress while maintaining security and following best practices.