web-dev-qa-db-ja.com

Sanitize_callbackに渡られた$ settingオブジェクトからコントロールの選択を取得する方法

コード例

カスタマイザ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()に渡された選択の配列を返しません。

  1. $wp_customizeグローバルオブジェクトを使う:

    global $wp_customize;
    $control = $wp_customize->get_control( $setting->id );
    $choices = $control->choices;
    
  2. $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}"を取得する方法

2
Chip Bennett

これは正しいです:

$control = $setting->manager->get_control($setting->id);
$choices = $control->choices;

ただし、この例では、$setting->idtheme_oenology_options[name]になります。

その名前を持つコントロールがないため、get_control('theme_oenology_options[name]')はnullを返します。代わりにコントロールにoenology_nameのIDを与えました。

そのため、設定とそれに対応するコントロールには常に同じIDを付けます。

2
Otto