web-dev-qa-db-fra.com

Champs de paramètres dynamiques avec l'API de paramètres

Je suis à ma première application API de paramètres et je me suis heurté à un problème.

Dans une page de sous-menu, je dois générer un certain nombre de champs (par exemple, le sélecteur de couleur) pour chacune des valeurs extraites d'un autre paramètre.

Pour être plus précis, j'ai créé dans une autre page de menu une liste de cases à cocher de catégories:

function bcio_fp_special_cats_display(){
$options = (array)get_option('bcio_options');
$categories = bcio_get_categories();

echo '<ul>';

foreach($categories as $category){
    $selected = ( isset( $options['fp_sp_category_'.$category->cat_ID] ) ) ? $options['fp_sp_category_'.$category->cat_ID] : '';    

    if($selected){  
        echo '<li><input type="checkbox" value="'.$category->cat_ID.'" name="bcio_options[fp_sp_category_'.$category->cat_ID.']" checked/>'.$category->name.'</li>';

    } else {
        echo '<li><input type="checkbox" value="'.$category->cat_ID.'" name="bcio_options[fp_sp_category_'.$category->cat_ID.']"/>'.$category->name.'</li>';            
    }       

}

echo '</ul>';}

Dans ma deuxième page d'options, j'utilise les valeurs d'option pour générer les champs appropriés dans une autre section de paramètres:

function bcio_special_section_settings_display(){
echo "These settings fields are generated based on your selection of Special Front Page Categories";
$options = (array)get_option('bcio_options');
$categories = bcio_get_categories();

foreach($categories as $category){
    $selected = ( isset( $options['fp_sp_category_'.$category->cat_ID] ) ) ? $options['fp_sp_category_'.$category->cat_ID] : '';    
    $cat_id = $category->cat_ID;    
    if($selected){  
    add_settings_field( 
        'bcio_special_cat_'.$category->cat_ID,                  
        'Special Section:<br />'.$category->name,           
        'bcio_special_section_display("'.$cat_id.'")',      
        'business-cover-special-sections', 
        'bcio_special_sections_options'                 
    );


    }           
}}
//The field itself 
function bcio_special_section_display($cat_id){

        $special_options = (array)get_option('bcio_special_options');
        $color =  ( isset( $special_options['color'] ) ) ? $special_options['color'] : '';
        echo '<input type="text" name="bcio_options[color]" value="' . $color . '" class="bc-color-field" >';   
    }

Ceci génère avec succès le nombre approprié de champs, applique le nom de la catégorie dans l’étiquette de champ, mais lorsque j’essaie d’utiliser le rappel, il se gêne car le paramètre $ cat_id que je passe dans le rappel de champ ne fonctionne pas tout à fait comme je le pensais. ce serait.

Avertissement: call_user_func () s'attend à ce que le paramètre 1 soit un rappel valide, fonction "bcio_special_section_display (" 12285 ")" introuvable ou nom de fonction non valide dans/nas/wp/www/cluster-2598/businesscover/wp-admin/includes/template .php à la ligne 1237

J'ai essayé de le piquer de plusieurs manières, mais pas de chance et je dois vraiment trouver un moyen de stocker des options en association avec des ID de catégorie sans coder en dur les ID eux-mêmes.

Il est primordial de faire en sorte que cela fonctionne correctement avec l'API Settings ou une solution sans plug-in. J'ai une version basée sur ACF par Elliot Condon mais je ne préférerais pas que le thème dépende d'un plugin tiers. Les paramètres de ces champs définiraient moins de vars, logos, etc. pour les sections spéciales du site. Toute allusion dans la bonne direction serait très appréciée.

3
Anca

Ce problème est maintenant résolu. Je poste la solution, au cas où quelqu'un d'autre la jugerait utile.

J'ai modifié mon rappel pour ajouter la liste de catégories à cocher afin que les catégories sélectionnées soient enregistrées dans un tableau au lieu d'options séparées. Il sera beaucoup plus facile de trouver ladite catégorie spéciale et de la faire correspondre à l'objet interrogé dans l'interface frontale.

function bcio_fp_special_cats_display(){
$options = (array)get_option('bcio_options');
$categories = bcio_get_categories();

echo '<ul>';

foreach($categories as $category){
    $selected = ( isset( $options['fp_sp_category'] ) ) ? $options['fp_sp_category'] : '';  

    if(in_array($category->cat_ID, $selected)){ 
        echo '<li><input type="checkbox" value="'.$category->cat_ID.'" name="bcio_options[fp_sp_category][]" checked/>'.$category->name.'</li>';

    } else {
        echo '<li><input type="checkbox" value="'.$category->cat_ID.'" name="bcio_options[fp_sp_category][]"/>'.$category->name.'</li>';            
    }       

}

echo '</ul>';


}

En fonction des valeurs contenues dans ce nouveau tableau (identifiants de catégorie), je génère ensuite les champs de paramétrage, avec l'ID de catégorie comme argument du champ:

function bcio_special_section_settings_display(){
echo "These settings fields are generated based on your selection of Special Front Page Categories";
$options = (array)get_option('bcio_options');
$selected = ( isset( $options['fp_sp_category'] ) ) ? $options['fp_sp_category'] : '';  

      if($selected){    
      foreach($selected as $cat_id){
        add_settings_field( 
             'section_'.$cat_id,                    
             'Special Section:<br />'.get_cat_name( $cat_id ),          
             'bcio_special_section_display',        
             'business-cover-special-sections', 
             'bcio_special_sections_options', 
             $cat_id                
      );  
      }             
}
}

J'ai ensuite utilisé l'argument pour attribuer un identifiant unique à mon champ et pour enregistrer l'option de couleur sous le nom color_ $ mycatid.

function bcio_special_section_display($args){
$special_options = (array)get_option('bcio_special_options');
$color =  ( isset( $special_options['color_'.$args] ) ) ? $special_options['color_'.$args] : '';
echo '<input type="text" id="color-'.$args.'" name="bcio_special_options[color_'.$args.']" value="' . $color . '" class="bc-color-field" >';                                    
}

J'ai testé la solution avec des champs de couleur par catégorie. Les couleurs sont correctement enregistrées et, si définies, affichées comme précédemment configurées.

J'espère que quelqu'un d'autre trouve la solution utile. Si je découvre un problème, je posterai une mise à jour de ce fil.

Bonne codage!

3
Anca