WordPress自定义器中获取Control的input_attrs参数值问题
解决WordPress自定义器中获取Control的input_attrs参数值的问题
问题原因
你代码中$setting->id对应的是设置ID(header_opacity_settings),但自定义器控件的ID是header_opacity_control,因此$setting->manager->get_control($setting->id)无法找到对应控件,自然返回null。即使设置和控件同名,也可能因自定义器加载顺序问题,导致sanitize回调执行时控件未完全初始化,无法正确获取属性。
解决方案
方案一:将参数存储在Setting的args中(推荐)
直接在添加设置时把min/max/step参数存入setting的args数组,这样sanitize回调可以直接从$setting->args读取,无需依赖控件对象,更可靠:
// 添加设置 $wp_customize->add_setting( 'header_opacity_settings' , array( 'type' => 'option', 'capability' => 'manage_options', 'default' => 1, 'sanitize_callback' => 'sanitize_color_opacity', 'input_attrs' => array( // 将参数存入setting的args 'min' => 0, 'max' => 1.000, 'step' => 0.001, ) ) ); // 添加控件(ID可保持不变) $wp_customize->add_control( 'header_opacity_control', array( 'type' => 'number', 'label' => __( 'Background Color Opacity' ), 'description' => __( 'This is a custom number.' ), 'section' => 'a_s_h_section', 'settings' => 'header_opacity_settings', 'input_attrs' => array( 'min' => 0, 'max' => 1.000, 'step' => 0.001, ) ) ); // sanitize函数修改 function sanitize_color_opacity( $number, $setting ) { $atts = $setting->args['input_attrs']; $min = $atts['min']; $max = $atts['max']; $step = $atts['step']; $number = floor($number / $step) * $step; return ( $min <= $number && $number <= $max ) ? $number : $setting->default; }
方案二:遍历控件找到关联当前设置的控件
如果不想修改setting的参数,可通过遍历自定义器所有控件,找到与当前设置关联的控件,再获取其input_attrs:
// 原设置和控件代码保持不变,仅修改sanitize函数 function sanitize_color_opacity( $number, $setting ) { $atts = null; // 遍历所有控件,匹配关联当前设置的控件 foreach ( $setting->manager->controls() as $control ) { // 适配控件关联单个或多个设置的情况 if ( $control->settings === $setting->id || (is_array($control->settings) && in_array($setting->id, $control->settings)) ) { $atts = $control->input_attrs; break; } } // 找不到属性时使用默认值做降级处理 if ( !$atts ) { $min = 0; $max = 1.000; $step = 0.001; } else { $min = $atts['min']; $max = $atts['max']; $step = $atts['step']; } $number = floor($number / $step) * $step; return ( $min <= $number && $number <= $max ) ? $number : $setting->default; }
内容的提问来源于stack exchange,提问作者Sam94
相关产品推荐
相关产品推荐

