How do I create a custom admin notice in WordPress?

Laura S Dec 20, 2024 Admin Customization
How can I show a special message at the top of my WordPress dashboard for my users?
What is the process for implementing a custom admin notice in WordPress using hooks and functions?
Andy answered Dec 20, 2024

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

  1. Always escape output using esc_html() or esc_attr()
  2. Use specific conditions to show notices only when needed
  3. Include clear, actionable messages
  4. Add proper user capability checks
  5. 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

  1. Admin Notices Manager - Helps manage and customize admin notices
  2. 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.