如何从传递给SANITIZE_CALLBACK的$Setting对象中获取控制选择

时间:2015-06-06 作者:Chip Bennett

使用自定义程序API的示例代码。

添加的设置(示例)如下:

    $wp_customize->add_setting( \'theme_oenology_options[\' . $option_parameter[\'name\'] . \']\', array(
        \'default\'           => $option_parameter[\'default\'],
        \'type\'              => \'option\',
        \'sanitize_callback\' => \'oenology_sanitize_\' . $option_parameter[\'sanitize\']
    ) );
添加控件(示例),如下所示:

        $wp_customize->add_control( 
            \'oenology_\' . $option_parameter[\'name\'], 
            $customizer_control_parameters 
        );
注:$customizer_control_parameters 是在别处定义的数组。对于选择类型控件(选择、收音机、收音机图像等),它包括\'choices\' 钥匙

清理定义的回调(示例),如下所示:

function oenology_sanitize_select( $input ) {
    return sanitize_key( $input );
}
在定制器中,一切都完美无瑕。显示控件,可配置设置,并且消毒工作正常。

问题到目前为止都很好,但最好将设置与$wp_customize->add_control(). 让我们使用传递给的第二个参数\'sanitize_callback\', $setting, 获取\'choices\' 在控件中定义!

Core reference:

return apply_filters( "customize_sanitize_{$this->id}", $value, $this );
解决方案尝试

function oenology_sanitize_select( $input, $setting ) {
    $input = sanitize_key( $input );
    $choices = array(); // See below
    return ( array_key_exists( $input, $choices ) ? $input : $setting->default );
}
问题:使用以下两种方法之一不会返回传递给的选项数组$wp_customize->add_control():

使用$wp_customize 全局对象:

global $wp_customize;
$control = $wp_customize->get_control( $setting->id );
$choices = $control->choices;
使用$setting->manager 对象:

$choices = $setting->manager->get_control( $setting->id )->choices;
在这两种情况下,get_control( $setting->id ) 返回anull, 而不是对象。

问题

如何获取\'choices\' 从…起$wp_customize->get_control(), 使用$this 对象传递给"customize_sanitize_{$this->id}"?

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

这是正确的:

$control = $setting->manager->get_control($setting->id);
$choices = $control->choices;
然而,在您的示例中,$setting->id 将是theme_oenology_options[name].

所以get_control(\'theme_oenology_options[name]\') 将返回null,因为没有具有该名称的控件。你给控件的id是oenology_name 相反

因此,我总是为设置及其匹配控件提供相同的ID。

结束

相关推荐

Optimize shortcode callbacks

我创建了一个插件,在我的WordPress站点中添加了一些短代码。但我是一个PHP新手,所以我相信它可能有一些错误或优化它的方法。它工作正常,显然没有问题。内存使用率为00.04MB。你能看看吗?非常感谢!add_action( \'wp_enqueue_scripts\', \'prefix_add_my_stylesheet\' ); function prefix_add_my_stylesheet() { // Respects SSL, Styl