I’ve this code:
/* Hook to admin_menu the yasr_add_pages function above */
add_action('admin_menu', 'yasr_add_pages');
function yasr_add_pages()
{
//Add Settings Page
add_options_page(
'Yet Another Stars Rating: Settings', //Page Title
__('Yet Another Stars Rating: Settings', 'yasr'), //Menu Title
'manage_options', //capablity
'yasr_settings_page', //menu slug
'yasr_settings_page_content' //The function to be called to output the content for this page.
);
}
/* Settings Page Content */
function yasr_settings_page_content()
{
if (!current_user_can('manage_options')) {
wp_die(__('You do not have sufficient permissions to access this page.', 'yasr'));
}
include(YASR_ABSOLUTE_PATH . '/yasr-settings-page.php');
} //End yasr_settings_page_content
and, this is the content in yasr-settings-page:
<div class="wrap">
<h2>Settings API Demo</h2>
<form action="options.php" method="post">
<?php
settings_fields( 'yasr_multi_form' );
do_settings_sections( 'yasr_settings_page' );
submit_button( 'Salva' );
?>
</form>
</div>
<?php
add_action( 'admin_init', 'yasr_multi_form_init' );
function yasr_multi_form_init() {
register_setting (
'yasr_multi_form', // A settings group name. Must exist prior to the register_setting call. This must match the group name in settings_fields()
'yasr_multi_form_data' //The name of an option to sanitize and save.
);
add_settings_section( 'yasr_section_id', 'Gestione Multi Set', 'yasr_section_callback', 'yasr_settings_page' );
add_settings_field( 'yasr_field_name_id', 'Nome Set', 'yasr_nome_callback', 'yasr_settings_page', 'yasr_section_id' );
}
function yasr_section_callback() {
echo "Descrizione sezione";
}
function yasr_nome_callback() {
$option = get_option( 'yasr_multi_form_data' );
$name = esc_attr( $option['name'] );
echo "<input type='text' name='yasr_multi_form_data[name]' value='' />";
}
The settings page output settings_field function (I can see the input type hidden on my source) and the submit button, but I can’t render the do_settings_section and I really can’t understand why. Any suggestions?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
From what I see, you are mixing output and the code, which is meant to prepare that output. More, the preparation is coming after the output started. Looks weird to me.
Here I updated your code, and it works OK:
/* Hook to admin_menu the yasr_add_pages function above */
add_action( 'admin_menu', 'yasr_add_pages' );
function yasr_add_pages() {
//Add Settings Page
add_options_page(
'Yet Another Stars Rating: Settings', //Page Title
__( 'Yet Another Stars Rating: Settings', 'yasr' ), //Menu Title
'manage_options', //capability
'yasr_settings_page', //menu slug
'yasr_settings_page_content' //The function to be called to output the content for this page.
);
}
add_action( 'admin_init', 'yasr_multi_form_init' );
function yasr_multi_form_init() {
register_setting(
'yasr_multi_form', // A settings group name. Must exist prior to the register_setting call. This must match the group name in settings_fields()
'yasr_multi_form_data' //The name of an option to sanitize and save.
);
add_settings_section( 'yasr_section_id', 'Gestione Multi Set', 'yasr_section_callback', 'yasr_settings_page' );
add_settings_field( 'yasr_field_name_id', 'Nome Set', 'yasr_nome_callback', 'yasr_settings_page', 'yasr_section_id' );
}
function yasr_section_callback() {
echo "Descrizione sezione";
}
function yasr_nome_callback() {
$option = get_option( 'yasr_multi_form_data' );
$name = esc_attr( $option['name'] );
echo "<input type='text' name='yasr_multi_form_data[name]' value='' />";
}
/* Settings Page Content */
function yasr_settings_page_content() {
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( __( 'You do not have sufficient permissions to access this page.', 'yasr' ) );
}
?>
<div class="wrap">
<h2>Settings API Demo</h2>
<form action="options.php" method="post">
<?php
settings_fields( 'yasr_multi_form' );
do_settings_sections( 'yasr_settings_page' );
submit_button( 'Salva' );
?>
</form>
</div>
<?php
} //End yasr_settings_page_content

Method 2
So the problem here isn’t actually anything to do with the way you are registering settings or outputting them. What I found it came down to was a mistiming on the order of actions.
Try making a file to hold all of your settings code and call that file with an action of ‘init’. The ‘admin_init’ action you are calling is correct, but it is just that it is being called after the admin_init has already been run.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0