I finally got this one. I’ll write out the solution for any other inexperienced person, like me, who is trying to handle a checkbox array when using just one options array.
First, the two articles I linked two at the top of the question are good for learning the basic about the topic.
Solution – part one:
I am using an options array, with all the possible options, and a values array to hold just the items that are checked. I was creating the values array incorrectly. Rather than being an associative array, it needs to be just a “regular array” holding just the keys from the options array.
So, in my setup, instead of setting ‘activities’ in the default settings to
array (
'baseball' => '',
'golf' => '',
'hockey' => ''
),
I want just
array ()
Solution – part two
If no checkboxes are chosen, when the settings are saved the $values array becomes NULL. But I need to use functions that require an array to make my tests for validation and for evaluating the checkboxes. So I need to make sure $values is always an array. So I need
if (is_null($data['activity'])) {
$data['activity'] = array();
}
Solution – part 3
My checked() function was wrong. Once I had fixed my array as discussed above, I am searching if the current $key from the $options array is a value from the $values array.
$checked = checked((in_array($key, $values)), true, false);
Solution – part 4
Since ‘activities’ is a sub array of the option values, I need to set the name variable in the checkbox statements to reflect that.
So I use
name="%1$s[%2$s][]"
which generates
name="rpq_plugin_option_name[activity][]"
Now my checkboxes update and save.