web-dev-qa-db-ja.com

カスタマイズAPIで選択コントロールをサニタイズできません

私はワードプレス4.7.2を使用しています。

カスタムテーマ用のカスタマイズセクションを作成しています。これが私の選択コントロールです。

 $wp_customize->add_setting( $this->slug . '_blog[pagination_type]', array(
            'default'           => 'classic-pagination',
            'transport'         => 'postMessage',
            'type'              => 'theme_mod',
            'sanitize_callback' => 'my_theme_sanitize_select',
        ) );

        $wp_customize->add_control( $this->slug . '_blog[pagination_type]', array(
            'label'    => 'Pagination Type',
            'section'  => $this->slug . '_blog_section',
            'type'     => 'select',
            'choices'  => array(
                'classic-pagination' => 'Classic Pagination',
                'load-more-button'   => 'Load More Button'
                ),
            'priority' => 18,
        ) );

そして私のsanitize_callback関数は

public function my_theme_sanitize_select( $input, $setting ) {
    // Ensure input is a slug
    $input = sanitize_key( $input );
    // Get list of choices from the control
    // associated with the setting
    $choices = $setting->manager->get_control( $setting->id )->choices;
    // If the input is a valid key, return it;
    // otherwise, return the default
    return ( array_key_exists( $input, $choices ) ? $input : $setting->default );
}

表示エラーデータを保存しようとしたときに無効な値です。

Sanitize_key関数だけでも試しましたが、正しくできません

public function my_theme_sanitize_select( $input ) {
        return sanitize_key( $input );
    }

そしてさらに

public function my_theme_sanitize_select( $input ) {
        return $input;
    }

そして

public function my_theme_sanitize_select( $input ) {
        return true;
    }

しかし、私がサニタイズ機能を要求していないときは、正しく機能しています。つまり、sanitize_callback()の作成を間違えていますが、 参照 でも、コールバック関数の名前と関数定義は同じです。

その後、私は同様の問題を検索し、 1 を得ましたが、この問題を解決することができませんでした、助けてください。

私はコアコードを調べ、私の入力データがnullになっているWP_Customize_Settingクラスsanitize()を見つけました。しかし、それ以上のアイデアは得られませんでした。

1

add_settingロジックはmy_theme_sanitize_select関数を見つけることができません、あなたはそれがどこにあるかをそれに伝える必要があります:

'sanitize_callback'    => array( $this, 'my_theme_sanitize_select' ),

あなたの関数はクラスの中にあるので、それにアクセスすることはできません。これをあなたのクラスに追加してください:

public function my_theme_sanitize_select( $input, $setting ) {
    $from_parent = my_theme_sanitize_select( $input, $setting );
    return $from_parent;
}
1
David Lee