带有Settings API的Wordpress动态选项字段

时间:2014-06-25 11:31:42

标签: wordpress wordpress-theming

我是第一个设置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_id我在字段回调中传递了没有&#t; t按照我的想法完成工作。

  

警告:call_user_func()期望参数1是有效的回调,函数&#39; bcio_special_section_display(&#34; 12285&#34;)&#39;在第1237行的/nas/wp/www/cluster-2598/businesscover/wp-admin/includes/template.php中找不到或无效的功能名称

我尝试过以某种方式戳它,但没有运气,我真的需要找到一种方法来存储与类别ID相关联的选项,而无需对ID本身进行硬编码。

使用Settings API或某些非插件解决方案以正确的方式使用它是至关重要的。我有一个基于ACF by Elliot Condon的版本,但宁愿不让主题依赖于第三方插件。这些字段中的设置将为网站的特殊部分定义LESS变量,徽标等。任何正确方向的提示都将非常感激。

1 个答案:

答案 0 :(得分:2)

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

我修改了我的回调以添加类别的复选框列表,以便将所选类别保存在数组中而不是单独的选项中。它将使查找所述特殊类别并将其与前端的queried_object匹配变得更加容易。

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_ $ 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" >';                                    
}

我已经使用每个类别的颜色字段测试了解决方案。颜色被正确保存,如果设置,则显示为先前配置的颜色。

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

快乐的编码!