使用设置API的动态设置字段

时间:2014-06-25 作者:Anca

我在我的第一个设置API应用程序中遇到了一个障碍。

在子菜单页中,我需要为从另一个设置检索到的每个值生成许多字段(比如颜色选择器)。

更准确地说,我在另一个菜单页中创建了一个类别复选框列表:

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>\';}
在第二个选项页面中,我使用选项值在另一个设置部分中生成适当的字段:

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" >\';   
    }
这成功地生成了适当数量的字段,并在字段标签中应用了类别的名称,但当我尝试使用回调时,它会出错,因为我在字段回调中传递的参数$cat\\u id并不像我想象的那样有效。

警告:call\\u user\\u func()要求参数1为有效回调,在/nas/wp/www/cluster-2598/businesscover/wp admin/includes/template中未找到函数“bcio\\u special\\u section\\u display(“12285”)”或函数名无效。php在线1237

我尝试了几种方法,但没有成功,我真的需要找到一种方法来存储与类别ID相关的选项,而不必对ID本身进行硬编码。

让设置API或一些非插件解决方案以正确的方式工作是至关重要的。我有一个由Elliot Condon基于ACF的版本,但我不想让主题依赖于第三方插件。这些字段中的设置将为站点的特殊部分定义较少的变量、徽标等。如果有任何正确方向的暗示,我们将不胜感激。

1 个回复
最合适的回答,由SO网友:Anca 整理而成

此问题现已解决。我正在发布解决方案,以防其他人发现它有用。

我修改了回调以添加类别的复选框列表,以便将选定的类别保存在数组中,而不是单独的选项。这样可以更容易地找到所述特殊类别,并将其与前端查询的\\u对象进行匹配。

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>\';


}
然后,根据这个新数组中包含的值(类别ID),我生成设置字段,并将类别ID作为字段的参数:

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                
      );  
      }             
}
}
然后,我使用参数为字段指定一个唯一的ID,并将颜色选项保存为color\\uu$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" >\';                                    
}
我已经用每个类别的颜色字段测试了解决方案。颜色已正确保存,如果设置,则显示为先前配置的颜色。

我希望其他人会觉得这个解决方案很有帮助。如果我发现任何问题,我将发布此线程的更新。

快乐的编码!

结束

相关推荐