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:
- add_action(‘admin_menu’, ‘cc_plugin_menu’); should be outside the function.
- The admin_init hook is used inside cc_plugin_menu() to register settings.
- esc_attr() ensures the email field is safe to output.