カスタマイザページを完全にリロードすることなく、テーマカスタマイザにコントロールを動的に追加または削除したいと思います。たとえば、ドロップダウンからoption1を選択したときに、コントロールAを表示し、コントロールBを非表示にし、その逆も同様です。
その方法は3つ考えられます。
1.(送信ボタンまたはJavaScriptを介して)カスタマイザを完全にリロードする方法を見つけたら、これを実行できます。
$option1 = get_theme_mod('option1');
if( $option1 === '1' ){
$wp_customize->add_setting('controlA', array());
$wp_customize->add_control( 'controlA', array(
'section' => 'layout_section',
'type' => 'text', // text (default), checkbox, radio, select, dropdown-pages ) );
}
2. Ajaxを使用して更新された値を読み込み、カスタマイザコントロールにjavascriptを追加します。
だから私はこのような私自身のスクリプトをエンキューするでしょう:
function custom_customize_enqueue() {
wp_enqueue_script( 'custom-customize', get_template_directory_uri() . '/custom.customize.js', array( 'jquery', 'customize-controls' ), false, true );
}
add_action( 'customize_controls_enqueue_scripts', 'custom_customize_enqueue' );
そしてcustom.customize.jsでは、私は自分の制御値を取得するために関数を呼び出すでしょう:
$.ajax({
url: ajaxurl,
type: 'POST',
data: {
'action':'get_control_values'
},
success:function(data) {
//populate customize controls with the updated values
}
});
Functions.phpで:
function get_control_values(){
$option1 = get_theme_mod('option1');
if( $option1 === '1' ){
// echo json_encoded data to populate my conditional customize controls
}
}
add_action( 'wp_ajax_get_control_values', 'get_control_values' );
add_action( 'wp_ajax_nopriv_get_control_values', 'get_control_values' );
3.条件付きで相互に依存するすべての入力を「ダミー」入力として含み、それらの値を別の非表示入力にJSONとして格納するカスタムコントロールを作成します。そのため、ドロップダウンからオプション1を選択すると、コントロールBがJavaScriptによって非表示になり、JSON文字列が更新されます。
編集:4.Option:おそらくこれは、ここで説明されているようにWordPressテーマカスタマイザJavascriptインタフェースを通しても可能です: インターフェース
誰かが私を正しい方向に向けることができますか?ありがとう。
私はあなたに別の方向性を提案することができます:あなたが最初のページをロードしてjavascriptを使用して動的にそれらを隠し/表示することができるのにjavascriptで新しいControlを生成することを邪魔するのはなぜ?
私がよく理解しているならば、これはあなたがオプション3で説明したものでした。
これがあなたを始めるためのサンプルコードです。
class MyCustom_Customize_Control extends WP_Customize_Control {
public function render_content() {
?>
<span><?php echo esc_html( $this->label ); ?></span>
<div>The Custom Control content</div>
<script>
jQuery(function($){
// hide control at first load
$('#customize-control-mycontrol').hide();
// bind to the event that will show the Control
$(document).on('customEvent', function(){
$('#customize-control-mycontrol').show();
});
});
</script>
<?php
}
}
// instantiate the Control
$wp_customize->add_control( new MyCustom_Customize_Control( $wp_customize, 'mycontrol', array(
'label' => 'Custom Control Label',
) ) );
これは可能な結果を示す小さなスクリーンキャストです。