WordPress admin showing “Options Page Not Found” — solutions and fixes

Solution:

It looks like the issue was caused by placing add_action(‘admin_menu’, ‘cc_plugin_menu’); in the wrong spot. Moving it outside and keeping it separate from the function works correctly. Here’s the updated code:


<?php
// Hook to add the plugin menu
add_action('admin_menu', 'cc_plugin_menu');

// Register plugin settings
function register_mysettings() {
    register_setting('cc_options', 'cc_cc_email');
}

// Render the plugin options page
function cc_option_page() {
    ?>
    <div class="wrap">
        <h2>CC Comments Options</h2>
        <p>Welcome to the CC Comments plugin. Here you can edit the email(s) to CC your comments to.</p>

        <form method="post" action="options.php" id="cc-comments-email-options-form">
            <?php settings_fields('cc_options'); ?>
            <?php do_settings_sections('cc_options'); ?>

            <h3>
                <label for="cc_cc_email">Email to send CC to:</label>
                <input type="text" id="cc_cc_email" name="cc_cc_email" 
                       value="<?php echo esc_attr(get_option('cc_cc_email')); ?>" />
            </h3>

            <p><input type="submit" name="submit" value="Save Email" /></p>
        </form>
    </div>
    <?php
}

// Add plugin menu and initialize settings
function cc_plugin_menu() {
    add_options_page(
        'CC Comments Settings',
        'CC Comments',
        'manage_options',
        'cc-comments-plugin',
        'cc_option_page'
    );

    add_action('admin_init', 'register_mysettings');
}
?>

Key points:

  1. add_action(‘admin_menu’, ‘cc_plugin_menu’); should be outside the function.
  2. The admin_init hook is used inside cc_plugin_menu() to register settings.
  3. esc_attr() ensures the email field is safe to output.