【问题标题】:Wordpress dynamic option fields with Settings API带有设置 API 的 Wordpress 动态选项字段
【发布时间】:2014-06-25 11:31:42
【问题描述】:

我在我的第一个设置 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 不太有效就像我想的那样。

警告:call_user_func() 期望参数 1 为有效回调,未找到函数 'bcio_special_section_display("12285")' 或 /nas/wp/www/cluster-2598/businesscover/wp-admin/ 中的函数名称无效在第 1237 行包含/template.php

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

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

【问题讨论】:

    标签: wordpress wordpress-theming


    【解决方案1】:

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

    我已经修改了添加类别复选框列表的回调,以便将所选类别保存在一个数组中,而不是单独的选项中。它将更容易找到所说的特殊类别并将其与前端的 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" >';                                    
    }
    

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

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

    编码愉快!

    【讨论】:

      猜你喜欢
      • 2017-04-15
      • 2018-05-17
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 2017-04-09
      • 2012-06-08
      相关资源
      最近更新 更多