主题定制器-条件控件

时间:2014-05-23 作者:gang

我想在主题定制器中动态添加/删除控件,而无需完全重新加载定制器页面。例如,当我从下拉列表中选择选项1时,我希望控件a显示,控件B隐藏,反之亦然。

我可以想出三种方法:

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\'        );
而且是定制的。定制js我会调用一个函数来获取我的控制值:

$.ajax({
    url: ajaxurl,
    type: \'POST\',
    data: {
        \'action\':\'get_control_values\'
    },
    success:function(data) {

        //populate customize controls with the updated values

    }
});
在函数中。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存储在另一个隐藏输入中。因此,当我从下拉列表中选择option1时,控件B将被javascript隐藏,JSON字符串将被更新,等等。

编辑:4。选项:这也可以通过WordPress主题定制器Javascript界面实现,如下所述:http://shibashake.com/wordpress-theme/wordpress-theme-customizer-javascript-interface

有人能给我指出正确的方向吗?谢谢

1 个回复
SO网友:Fabien Quatravaux

我可以向您建议另一个方向:当您可以在第一个页面加载时创建控件a和B,并使用javascript动态隐藏/显示它们时,为什么还要用javascript生成新控件呢?

如果我理解清楚的话,这就是您在选项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\',
) ) );
下面是一个小屏幕显示可能的结果:Interactive Control screencast

结束

相关推荐

包括定制AJAX注册表单的必要功能

我知道登记表上有一些问题,但我认为我的问题有点不同,因为我还没有通过搜索找到答案。我正在制作一个简单的订阅小部件,它接收用户的电子邮件并将其作为订阅者添加到WordPress用户表中。它从一个简单的表单开始,只需输入电子邮件并提交即可。表单的操作是在我的插件文件夹中创建一个php文件,ajax-signup.php. 我使用ajax将表单数据发布到此文件,然后该文件“注册”电子邮件地址并返回ajax响应。旧的插件只包括registration.php 该文件为ajax php文件提供了所有必需的功能,以便