How to resolve ‘Options page not found’ error in WordPress

Solution:

The issue was caused by the way fields and sections were registered. Here’s a working example implemented as a standalone plugin. You can test it independently, and if it works, integrate it into your main plugin logic:

<?php
/**
 * Plugin Name: Example Settings
 * Description: Example Settings
 * Version: 1.0
 **/

class Member_Only {

    public function __construct() {
        // Hook into the admin menu
        add_action( 'admin_menu', array( $this, 'settings_page' ) );
        add_action( 'admin_init', array( $this, 'setup_init' ) );
    }

    public function settings_page() {
        $parent_slug = "member_only_fields";
        $page_title  = "Member Only Content Settings Page";
        $menu_title  = "Member Only Content";
        $capability  = "manage_options";
        $slug        = "member_only_fields";
        $callback    = array( $this, 'settings_page_content' );

        add_submenu_page( "options-general.php", $page_title, $menu_title, $capability, $slug, $callback );
    }

    public function settings_page_content() { ?>
        <div class="wrap">
            <h2>Member Only Content</h2>
            <form method="post" action="options.php">
                <?php
                    settings_fields("member_only_fields");
                    do_settings_sections("member_only_fields");
                    submit_button();
                ?>
            </form>
        </div>
    <?php }

    public function section_callback( $arguments ) {
        switch( $arguments['id'] ){
            case "categories":
                echo "Categories that will trigger the member only message.";
                break;
            case "loginURL":
                echo "The login URL of your site.";
                break;
        }
    }

    public function setup_init() {
        register_setting("member_only_fields", "categories");

        add_settings_section("categories", "Member Only Categories:", array($this, 'section_callback'), "member_only_fields");
        add_settings_field('categories', 'Categories:', array($this, 'field_callback'), 'member_only_fields', 'categories');

        add_settings_section("loginURL", "Login URL:", array($this, 'section_callback'), "member_only_fields");
    }

    public function field_callback($arguments) {
        echo "<input name='categories' id='categories' type='text' value='" . get_option("categories") . "' />";
    }
}

new Member_Only();

Next steps:

  • Test this plugin standalone to ensure the settings page displays correctly.
  • Once confirmed, integrate the code into your main plugin, maintaining the correct order of register_setting, add_settings_section, and add_settings_field.