Site icon Hip-Hop Website Design and Development

Plugin settings page checkbox not saving – one options array with sub array

I’m driving myself crazy here trying to get a checkbox to save on a plugin settings page.

Right now, as a template, I’m working through the excellent example given here: Settings API with arrays example

I’m also referring to a very useful tutorial at https://www.smashingmagazine.com/2016/04/three-approaches-to-adding-configurable-fields-to-your-plugin/ with a detailed git at https://github.com/rayman813/smashing-custom-fields/blob/master/smashing-fields-approach-1/smashing-fields.php

I’ve also read about a half dozen posts with similar questions but none have my answer, at least that I can find and understand.

I think I’m stumbling on the syntax of a checked() function.

— Updated code —

Here are the key pieces of code:

The overall data in the function that calls register_setting(), add_settings_section() and add_settings_fields

   $option_name   = 'rpq_plugin_option_name'; // free to choose this name

// Fetch existing options.
$option_values = get_option( $option_name );

$default_values = array (
    'number' => 500,
    'color'  => 'blue',
    'long'   => '',
    'activity' => array(
        'baseball' => '',
        'golf'     => '',
        'hockey'   => '')
);
$data = shortcode_atts( $default_values, $option_values );

The add_settings_field() for the checkboxes:

    add_settings_field(
    'section_2_field_2',
    'Checkboxes',
    'rpq_plugin_render_section_2_field_2', // callback to render html
    'rpq-default-settings',  // menu slug
    'section_2',
    array (
        'label_for'   => 'label4', // makes the field name clickable,
        'name'        => 'activity', // value for 'name' attribute
        'value'       => array_map( 'esc_attr', $data['activity'] ) ,
        'options'     => array (
            'baseball'  => 'Baseball',
            'golf'      => 'Golf',
            'hockey'    => 'Hockey'
        ),
        'option_name' => $option_name
    )
);

The callback to render the html:

   function rpq_plugin_render_section_2_field_2( $args )
{
$options_markup = '';
$iterator = 0;
$values = $args['value'];
$options = $args['options'];
rpq_plugin_debug_var( $options, 'Options: ' );
rpq_plugin_debug_var( $values, 'Values: ' );

foreach ( $args['options'] as $key => $title ) {
    rpq_plugin_debug_var( $key, 'Key: ' );
    rpq_plugin_debug_var( $title, 'Title: ' );
    $checked = checked((in_array($title, $values)), true, false);

    rpq_plugin_debug_var($checked, 'Checked: ');

    $iterator ++;
    $options_markup .= sprintf(
        '<label for="%1$s_%6$s"><input id="%1$s_%6$s" name="%1$s[%2$s]" type="checkbox" value="%3$s" %4$s /> %5$s</label><br/>', 

        $args['option_name'],
        $args['name'],
        $key,
        $checked,
        $title,
        $iterator
    );


}
        printf( '<fieldset>%s</fieldset>', $options_markup );

//print '</select>';

rpq_plugin_debug_var( $values, 'Values: ');
}

The output from the debug dump of the initial variables is as I’d expect:

Options:  = array (
  'baseball' => 'Baseball',
  'golf' => 'Golf',
  'hockey' => 'Hockey',
)

Values:  = array (
  'baseball' => '',
  'golf' => '',
  'hockey' => '',
)

Key:  = 'baseball'

Title:  = 'Baseball'

Checked:  = ''

Key:  = 'golf'

Title:  = 'Golf'

Checked:  = ''

Key:  = 'hockey'

Title:  = 'Hockey'

Checked:  = ''

After trying to save, i get:

Values: = NULL

I’ve tried a host of variations on ways to get cjhecked set but I can’t get the checkboxes to save.