How to handel multiple checkbox field in the admin settings page with Settings API

I’m trying to incorporate a list of checkbox in my plugin’s admin settings page from which users can select a few countries from the list of all countries.

So far I’ve done this:

add_action( 'admin_init', 'register_page_options' );

function register_page_options() {
    // Add Section for option fields
    add_settings_section( 'aicp_section', __( '....text here....', 'aicp' ), 'display_section', 'aicp_settings' ); // id, title, display cb, page

    // Add Field for selecting countries for which you wanna ban ads
    add_settings_field( 'aicp_country_list', __( 'Select the countries', 'aicp' ), 'country_list_field', 'aicp_settings', 'aicp_section' ); // id, title, display cb, page, section

    // Register Settings
    register_setting( 'aicp_settings', 'aicp_settings_options', array( $this, 'validate_options' ) );
}

// now comes the section for checkbox

function country_list_field() {
    $options = get_option( 'aicp_settings_options' );
    ?>
    <input type="checkbox" name="aicp_settings_options[country_list][]" value="AF"<?php checked( 'AF' == $options['country_list'] ); ?> /> Afganistan
    <input type="checkbox" name="aicp_settings_options[country_list][]" value="AX"<?php checked( 'AX' == $options['country_list'] ); ?> /> Aland Islands
    <?php
}

Please Note: This is not the entire code, but a short part of it to give you guys the idea about my question.

Now as you can see I’m using checkboxes above I want all the selected options to be stored as comma seperated, like AF,AX,IN,US etc. so that when I need to work with those data, I can just simply explode them and use.

Anyways after a bit digging I found this answer: How to use checkbox and radio button in options page? which has showed how to handel checkbox & radio box in the settings api.

But the problem is that as I’m using the checkbox for a country list, I can’t just simply used the checked() to see which of the checkbox are selected as there are a ton of country name and the user can select any one of them or all of them or some of them.

Also when I checked this link: https://stackoverflow.com/questions/6881039/how-to-handle-multiple-checkboxes-in-a-php-form it showed me to use [] with the name for the checkbox so that they can be stored as array.

Now as I’m using the WP Settings API I’m already using naming like aicp_settings_options[country_list] which itself is an array. So, should I have to create a 2 dimentional array like this: aicp_settings_options[country_list][] ?

I’m really confused about how should I grab the data and store them. Also how can I easily check which of the checkboxes are selected by the user.

It would be great if anyone can help. Thank you in advance.

2 Answers
2

add_action( 'admin_init', 'register_page_options' );

function register_page_options() {
    if (false == get_option('aicp_settings_options')) {
        add_option('aicp_settings_options');
    }

    // Add Section for option fields
    add_settings_section( 'aicp_section', __( '....text here....', 'aicp' ), 'display_section', 'aicp_settings' ); // id, title, display cb, page

    // Add Field for selecting countries for which you wanna ban ads
    add_settings_field( 'aicp_country_list', __( 'Select the countries', 'aicp' ), 'country_list_field', 'aicp_settings', 'aicp_section' ); // id, title, display cb, page, section

    // Register Settings
    register_setting( 'aicp_settings', 'aicp_settings_options', array( $this, 'validate_options' ) );
}

// now comes the section for checkbox

function country_list_field() {
    $options = get_option( 'aicp_settings_options' );

    $value = array();
    if (isset($options['country_list']) && ! empty($options['country_list'])) {
        $value = $options['country_list'];
    }

    $html="<input type="checkbox" name="aicp_settings_options[country_list][]" value="AF"". in_array('AF', $value) ? 'checked' : '' .'/> Afganistan';
    $html .= '<input type="checkbox" name="aicp_settings_options[country_list][]" value="AX"'. in_array('AX', $value) ? 'checked' : '' .'/> Aland Islands';

    echo $html;
}

Leave a Comment