カスタマイザ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
は他で定義されている配列です。選択タイプのコントロール(select、radio、radio-imageなど)の場合は'choices'
キーが含まれます。
以下のように定義されたコールバック(例)をサニタイズします。
function oenology_sanitize_select( $input ) {
return sanitize_key( $input );
}
カスタマイザではすべてが完璧に機能します。コントロールが表示され、設定が構成可能で、サニタイズが機能します。
これまでのところうまくいっていますが、$wp_customize->add_control()
の中で事前に定義された選択に対して設定をホワイトリストに載せるほうが良いでしょう。 'sanitize_callback'
に渡された2番目のパラメータ$setting
を使用して、コントロールに定義された'choices'
を取得しましょう。
コアリファレンス :
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 );
}
問題:以下の2つの方法のどちらを使用しても、$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 )
はオブジェクトではなくnull
を返します。
'choices'
に渡された$this
オブジェクトを使用して、$wp_customize->get_control()
から"customize_sanitize_{$this->id}"
を取得する方法
これは正しいです:
$control = $setting->manager->get_control($setting->id);
$choices = $control->choices;
ただし、この例では、$setting->id
はtheme_oenology_options[name]
になります。
その名前を持つコントロールがないため、get_control('theme_oenology_options[name]')
はnullを返します。代わりにコントロールにoenology_name
のIDを与えました。
そのため、設定とそれに対応するコントロールには常に同じIDを付けます。