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.