Can’t output do_settings_sections . Can’t understand why

The question:

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?

The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

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

enter image description here

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

Leave a Comment