添加新小部件时的WP Customizer事件

时间:2018-02-07 作者:rugbert

我想在将新小部件添加到预览器后,然后在删除小部件后触发事件。

用例:将小部件添加到预览器DOM后,我想根据同一侧边栏区域中的其他小部件数量来更改它的类。那么什么时候

wp.customize(\'sidebars_widgets[sidebar-1]\').get().length
火灾,现在统计所有小部件还为时过早。

因此,我想我在Customizer控件侧栏中添加一个小部件,然后预览器添加小部件,一旦小部件添加到预览器DOM,我希望它会发出一个事件,说“这个小部件已经添加”。我可以监听该事件,然后运行一些代码来更改侧栏中所有小部件上的类名。

我已经做到了这一点,让定制者向预览者发送一些数据,等待1秒,然后计算小部件的数量。但这似乎不太可靠(如果加载小部件需要1.3秒怎么办?)。

在我的预览器javascript中(通过customize_preview_init 胡克,我有以下几点:

  $( document ).on( \'widget-added\', function(event, widget) {
    console.log(widget);
  });
但这似乎没有任何作用。

有人知道那会是什么吗?

2 个回复
SO网友:Mohamed Ali

为了与事件“添加的小部件”交互,您应该使用“customize\\u controls\\u enqueue\\u scripts”将JavaScript文件排队,以避免它成为重复加载预览iframe的一部分(其中$(document)不同于父页面文档)。

我能够使用以下示例与“添加的小部件”事件进行交互:

在主题的功能中。php

function custom_enqueue_scripts(){
    wp_enqueue_script( \'custom-script\', get_template_directory_uri() . \'/js/custom.js\',array(\'jquery\',\'customize-widgets\'),\'\',1 );

}
add_action(\'customize_controls_enqueue_scripts\',\'custom_enqueue_scripts\',10);
JavaScript文件:

jQuery(document).ready(function($) {


    $( document ).on( \'widget-added\', function(event, widget) {
        console.log(widget);
    });



});

SO网友:Vlad Olaru

我认为您最好在侧栏级别处理更改,因为您希望根据侧栏中的小部件数量更改侧栏中所有小部件的类。

以下是帮助您入门的代码(灵感来自this):

(function($){
    $(document).on(\'ready\', function () {
        // Change this selector depending on your target widget area
        var widgetArea = $(\'#secondary .widget-area\');

        if (\'undefined\' !== typeof wp && wp.customize && wp.customize.selectiveRefresh) {
            wp.customize.selectiveRefresh.bind(\'sidebar-updated\', function (sidebarPartial) {
                if (\'sidebar-1\' === sidebarPartial.sidebarId) {
                    // Do something to the widgetArea or its children
                }
            });
        }
    });
})(window.jQuery);
您应该将此代码放在一个文件中,并仅通过使用customize_controls_enqueue_scripts 行动挂钩。

我希望这有帮助。

结束

相关推荐

Using add_filter() in Widgets

只需查询引用add_filter() 作用您可以在WordPress小部件类中使用此函数吗。Example我有一个带有动态创建代码的小部件,我想将其传递给插件中创建的另一个函数。这能实现吗?<?php /** * Display the actual Widget * * @param Array $args * @param Array $instance */ public function widget($args, $inst