web-dev-qa-db-fra.com

aPI de paramètres: comment créer une case à cocher multiple avec des catégories de blog?

j'ai besoin de créer une fonction de rappel avec une case à cocher multiple avec toutes les catégories Web/blog en tant qu'options multiples.

mes add_settings_fields sont:

   add_settings_field(  
        'select_page',                      
        'Select Blog Page',                         /
        'journal_combo_select_page_callback',   
        'journal_theme_blog_2_col',
        'blog_page_blog_2_col_section'  

    );

    add_settings_field( 
        'limit_posts',                      
        'Limit Posts',                          
        'journal_limit_posts_callback', 
        'journal_theme_blog_2_col',
        'blog_page_blog_2_col_section'  
    );

    add_settings_field(      // $id, $title, $callback, $page, $section, $args
    'check_categories',     // $id  
    'Choose Categories',    // $title 
    'journal_check_cats_callback', // $callback -
    'journal_theme_blog_2_col', // $page
    'blog_page_blog_2_col_section' // $section 
);

dois-je déclarer une sorte de tableau dans settings_field 'check_categories' pour communiquer avec la fonction de rappel?

    function journal_check_cats_callback() {
$options = get_option('journal_theme_blog_2_col');

    $pag = journal_theme_blog_2_col;
    $_cats = get_terms( 'category' );

        $html = '';
        foreach ($_cats as $term) {
            $checked = isset( $term->term_id ) ? $term->term_id : '0' ;
            $html .= sprintf( '<input type="checkbox" id="%1$s[%2$s]" name="journal_theme_blog_2_col[]" value="%2$s"%3$s />', $pag, $term->term_id, checked( $checked, $options['check_categories'], false ) );
            $html .= sprintf( '<label for="%1$s[%3$s]"> %2$s</label><br>', $pag, $term->name, $term->term_id );
        }
        $html .= sprintf( '<span class="description"> %s</label>', '' );

        echo $html;
}

MODIFIER:

eh bien, j'essaie de faire fonctionner ce code, mais ce n'est pas encore tout à fait silencieux ... au moment où je clique sur le bouton Enregistrer (soumettre), les valeurs sont enregistrées dans la table wp_options. Par exemple:

dans settings_section, j'ai trois settings_fields. Une liste déroulante (select_page), un champ de texte en entrée (limit_posts) et une case à cocher multiples avec des catégories de blog (check_categories) et les données suivantes sont enregistrées dans la table wp-options:

a: 4: {s: 11: "select_page"; s: 1: "4"; s: 11: "limit_posts"; s: 3: "100"; i: 0; s: 2: "13"; i : 1; s: 1: "7";}

et voici le tableau correspondant:

Tableau ([select_page] => 4 [limit_posts] => 100 [0] => 13 [1] => 7)

Problèmes à résoudre: 1 - les cases à cocher ne restent pas cochées! Et bien sûr, si je clique à nouveau sur Enregistrer sans en vérifier les nouveaux, les valeurs du tableau des options sont effacées.

2 - J'ai aussi réalisé que les "check_categories" ne sont pas sauvegardées dans la valeur sérialisée ... Je pense donc que c'est un problème, car je ne sais pas comment filtrer uniquement les valeurs de tableau de "check_categories"

Quelqu'un peut m'aider?

Merci, Nelson

2
naires

J'ai eu le même problème, et voici ce qui fonctionne pour moi:

function journal_check_cats_callback() {
    $options    = get_option('journal_theme_blog_2_col');
    $pag        = journal_theme_blog_2_col;
    $_cats      = get_terms( 'category' );
    $html       = '';

    foreach ($_cats as $term) {

        $checked = in_array($term->term_id, $options) ? 'checked="checked"' : '';
        $html .= sprintf( '<input type="checkbox" id="%1$s[%2$s]" name="%1$s[]" value="%2$s" %3$s />', $pag, $term->term_id, $checked );
        $html .= sprintf( '<label for="%1$s[%3$s]"> %2$s</label><br>', $pag, $term->name, $term->term_id );
    }

    $html .= sprintf( '<span class="description"> %s</label>', '' );

    echo $html;

}
2
Vince