WordPress settings API error when checkbox unchecked

I am trying to creating some custom options for a template I am developing but I am getting an error when the checkbox (Line 130) is unchecked:

Warning: Illegal string offset ‘show_admin_dev’ in E:composite-cmsWordPress-Settings-Sandbox-masterlibadminpagesdev-page.php on line 11

Read More

This is the line that seems to be throwing the error:

if ( $options['show_admin_dev'] == 1 )

The entire code can be found on GitHub.

Related posts

Leave a Reply

2 comments

  1. Your problem is that you haven’t included a sanitization function as the third parameter to register_settings on line 111. When no sanitization provided WordPress deletes the value of the option and creates a new one based only on what is passed in $_POST. Since unchecked checkboxes are not sent by the browser at all you end up with $options['show_admin_dev'] being not set.

    You should try to add sanitization which adds the value if it is not in the option

    register_setting(
      'ccms_developer_options',
      'ccms_developer_options',
      'ccms_developer_sanit' 
    );
    
    function ccms_developer_sanit($newval) {
      if (!isset($newval['show_admin_dev'])) 
        $newval['show_admin_dev'] = 0;
    
      return $newval;
    }
    
  2. It appears that $options['show_admin_dev'] is actually a string, not an integer. You’re trying to compare a string to an integer, which really annoys newer versions of PHP.

    When setting the default option (line 69), you have show_admin_dev set to '0'. Removing the quotes around this should prevent the error.

    You can also convert $options['show_admin_dev'] to an integer in the comparison using the intval() function:

    if ( intval( $options['show_admin_dev'] ) == 1 )