選択項目の値に応じてshow/hideカスタマイザコントロールグループを使用するJSコードがあります。
最近のwpの更新まで、コードは問題なく動作していました(どのバージョンが最初にこれを壊したのかわからない)。
これがjsファイルをエンキューするためのコードです。
add_action('customize_controls_print_scripts', 'ppl_customize_controls_scripts');
function ppl_customize_controls_scripts(){
wp_register_script( 'ppl-customize-control', get_template_directory_uri().'/js/customizer-control.js', array('jquery'), 1, true);
wp_enqueue_script( 'ppl-customize-control' );
}
JSファイル
jQuery(document).ready(function($){
var skin_select = $('#customize-control-ppl-ninja-theme-options-skin').find('select');
//alert(skin_select.attr('class'));
var selected_val = skin_select.children('option:selected').val();
var custom_group = [
'#accordion-section-custom_header_styles',
'#accordion-section-custom_slider_styles',
'#accordion-section-custom_footer_styles',
'#accordion-section-custom_general_colors'
];
if(selected_val != 4){
hide_custom_controls(custom_group);
}
skin_select.change(function(){
var val = $(this).val();
if(val != 4){
hide_custom_controls(custom_group);
}else{
show_custom_controls(custom_group);
}
});
function hide_custom_controls(custom_group){
var selector = custom_group.join(',');
$(selector).hide();
}
function show_custom_controls(custom_group){
var selector = custom_group.join(',');
$(selector).show();
}
});
問題はです、JSはインラインCSS display:none
でカスタマイザ制御セクションをロードして隠します。その後、cusomizerのjsスクリプトがそれを修正し、インラインcssをdisplay:list-item
に更新します。そのため、カスタマイザが完全に読み込まれた後に、後でJSコードを実行する必要があります。
Wp-includesディレクトリのカスタマイザスクリプトを調べましたが、使用できるものが見つかりませんでした。おそらく私は何かを逃した。
CSSを修正するコードは /wp-admin/js/customize-controls.js
にあります。
このスクリプトはready
イベントを使用してクラスを追加し、パネル、セクション、およびコントロールの可視性を修正しています。しかし、そのイベントにリスナーを追加することはできません。
プロパティactivePanels、activeSections、activeControlsは、ファイルのPHPから設定されます /wp-admin/customize.php
私はあなたのようにその変数を上書きする方法を見つけませんでしたbodyタグが終了する直前に表示されます。
それで、可能な解決策はおそらくready
イベントにフックする方法を見つけることです。
したがって、これまでのところ問題はJSファイルの初期ロードにありました。私はJSを使用して解決策を見つけることができなかったように。問題はスクリプトのロードではなく実行のタイミングではありませんでした。
とにかく、テーマカスタマイザは、ロード時にどのPanel/Section/Controlがアクティブであるかを表示するグローバル変数を調べます。
コアファイルに何時間も費やした後、私は解決策を見つけました。
customize_panel_active
フィルタを使用してください。 2つのパラメータ$active
booleanと$panel
オブジェクトを渡します。customize_section_active
フィルタを使用してください。 2つのパラメータ$active
booleanと$section
オブジェクトを渡します。customize_control_active
フィルタを使用してください。 2つのパラメータ$active
booleanと$control
オブジェクトを渡します。例:パネルがあり、そのidがmy_panel
であると仮定した場合。また、特定のテーマオプションが設定されていない場合は非表示にします。
add_filter('customize_panel_active', 'maybe_panel_active', 10, 2);
function maybe_panel_active($active, $panel){
if($panel->id == 'my_panel' && !theme_option('certain_theme_option') ){
$active = false;
}
return $active;
}
それはそれについてです!かなり簡単:)
注:解決策は純粋にphpです。カスタマイザのJSイベントを聞くことによってそれを機能させることができるなら誰でも。質問は当初JSソリューションを対象としていたので、私はそれに非常に興味があるでしょう。
あまり良い解決策ではありませんが、window.setInterval()を使ってサンプリングして、一度表示されたら間隔を止めて、やりたいことをすべて実行できます。
依存問題のようですね。あなたはjQueryをチェックしているだけなので、あなたのスクリプトは横取りされるかもしれません。 'customize-preview-widgets'
を使用すると、他のすべてのカスタマイザスクリプトの後にスクリプトを確実にロードできます。これを試して…
add_action('customize_preview_init', 'ppl_customize_controls_scripts');
function ppl_customize_controls_scripts(){
wp_enqueue_script(
'ppl-customize-control',
get_template_directory_uri().'/js/customizer-control.js',
array( 'jquery','customize-preview-widgets' ),
'',
true
);
}
私にはタイミングの問題のようですが、多分/おそらくこれを単純化しすぎていますが、$debs
パラメータwp_register_script
とwp_enqueue_script
を使用すると、ロード順序を制御するために提供されますが、それらの1つはscript-loader.php
で追加された順に- customize-base
、customize-loader
、customize-preview
、customize-models
、customize-views
、customize-controls
、customize-widgets
、またはcustomize-preview-widgets
は依存関係である必要があります。
カスタマイザのjavascript初期化の謎を解明するのではなく、明確ではありませんが、 カスタムコントロール を使用してJavaScriptを挿入することができます。 render_content()
をオーバーライドすることによって、例えば
add_action( 'customize_register', function ( $wp_customize ) {
// Custom control.
class PPL_Ninja_Skin_Select_Customize_Control extends WP_Customize_Control {
public $type = 'select';
// Override to inject our javascript.
public function render_content() {
parent::render_content();
?>
<script type="text/javascript">
(function () {
var skin_select = $('#customize-control-ppl-ninja-theme-options-skin').find('select');
var custom_group = [
'#accordion-section-custom_header_styles',
'#accordion-section-custom_slider_styles',
'#accordion-section-custom_footer_styles',
'#accordion-section-custom_general_colors'
];
skin_select.change(function () {
if ($(this).val() == 4) {
$(custom_group.join(',')).hide();
} else {
$(custom_group.join(',')).show();
}
});
skin_select.change();
}());
</script>
<?php
}
}
$wp_customize->add_setting( 'ppl-ninja-theme-options-skin' );
$wp_customize->add_section( 'ppl-ninja-theme-options', array(
'title' => __( 'Ninja Options', 'ppl' ),
) );
// Add custom control.
$wp_customize->add_control( new PPL_Ninja_Skin_Select_Customize_Control(
$wp_customize, 'ppl-ninja-theme-options-skin', array(
'label' => __( 'Skin', 'ppl' ),
'section' => 'ppl-ninja-theme-options',
'choices' => array(
'' => __( 'Select', 'ppl' ),
1 => __( 'One', 'ppl' ),
2 => __( 'Two', 'ppl' ),
3 => __( 'Three', 'ppl' ),
4 => __( 'Four', 'ppl' ),
),
)
) );
// Test data.
foreach ( array( 'header_styles', 'slider_styles', 'footer_styles', 'general_colors' ) as $setting ) {
$wp_customize->add_setting( 'custom_' . $setting . '-setting' );
$wp_customize->add_section( 'custom_' . $setting, array(
'title' => sprintf( __( 'Ninja %s', 'ppl' ), $setting ),
) );
$wp_customize->add_control( 'custom_' . $setting . '-setting', array (
'label' => __( 'Setting', 'td' ),
'section' => 'custom_' . $setting,
) );
}
} );
(CSSも気にしないでください)。