web-dev-qa-db-fra.com

Comment gérer plusieurs champs de case à cocher dans la page des paramètres d'administration avec l'API de configuration

J'essaie d'incorporer une liste de cases à cocher dans la page des paramètres d'administration de mon plug-in, à partir de laquelle les utilisateurs peuvent sélectionner quelques pays dans la liste de tous les pays.

Jusqu'ici j'ai fait ceci:

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
}

Remarque: Ce n'est pas tout le code, mais une petite partie de ce code pour vous donner une idée de ma question.

Maintenant, comme vous pouvez le constater, les cases ci-dessus sont cochées. Toutes les options sélectionnées doivent être stockées sous la forme comma seperated, comme AF, AX, IN, US, etc. afin que, lorsque je dois travailler avec ces données, je puisse simplement les nommer explode. et utilise.

Quoi qu'il en soit, après avoir un peu creusé, j'ai trouvé cette réponse: Comment utiliser la case à cocher et le bouton radio dans la page des options? qui a montré comment gérer les cases à cocher et les cases d'option radio les paramètres api.

Mais le problème est que, comme j'utilise la case à cocher pour une liste de pays, je ne peux pas simplement utiliser la checked() pour voir lesquelles de la case à cocher sont sélectionnées car il y a une tonne de nom de pays et l'utilisateur peut sélectionner l'un des noms de pays. eux ou tous ou certains d'entre eux.

Aussi, quand j'ai vérifié ce lien: https://stackoverflow.com/questions/6881039/how-to-handle-multiple-checkboxes-in-a-php-form il m'a montré d'utiliser [] avec le nom pour le checkbox afin qu'ils puissent être stockés sous forme de tableau.

Maintenant, alors que j'utilise l'API de paramètres WP, j'utilise déjà un nom tel que aicp_settings_options[country_list] qui est lui-même un tableau. Donc, devrais-je avoir à créer un tableau à 2 dimensions comme ceci: aicp_settings_options[country_list][]?

Je ne comprends vraiment pas comment dois-je récupérer les données et les stocker. Aussi, comment puis-je facilement vérifier quelles cases sont cochées par l'utilisateur.

Ce serait formidable si quelqu'un peut aider. Merci d'avance.

2
iSaumya

Au lieu d’utiliser checked(), vous pouvez utiliser in_array() comme indiqué ci-dessous -

<input type="checkbox" name="aicp_settings_options[country_list][]" value="AF"<?php echo in_array('AF', $options['country_list']) ? 'checked' : ''; ?> /> Afganistan

J'espère que ça aide.

1
Nitesh
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;
}
1
Web Developer