在新的主题定制器API中,如何将值从前面发送回管理面板?

时间:2013-01-24 作者:Fabien Quatravaux

我正在深入研究新的主题定制器API,尤其是javascript API,我发现这很令人高兴。我已经设法添加了自己的自定义参数,并且我还使用javascript部分将这些参数实时更新到预览中。

然而,我想更进一步:我需要在背景图像上的绝对位置上放置一个点,然后将该位置记录回数据库。这是一个屏幕截图。enter image description here由于jQuery可拖动插件,我可以移动该点,但我不知道如何将结果位置发送回定制者。

以下是我目前的代码:

functions.php:

add_action( \'customize_register\', \'minisites_customize_register\' );
function minisites_customize_register($wp_customize){
    // gestion du placement des points
    class Minisites_Customize_Page_Control extends WP_Customize_Control {

        public function render_content() {
            ?>
            <label>
                <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
                Points position
                <input <?php $this->link(); ?> value="<?php echo $this->value()?>">
            </label>
            <?php
        }
    }
    $wp_customize->add_setting( \'points\', array(
        \'transport\' => \'postMessage\'
    ) );
    $wp_customize->add_control( new Minisites_Customize_Page_Control( $wp_customize, \'points\', array(
        \'label\'      => __( \'Lier les pages\', \'minisites\' ),
        \'section\'    => \'background_image\',
        \'settings\'   => \'points\',
    ) ) );

}
customize-theme.js:

jQuery( function( $ ) {

    var points;
    wp.customize( \'points\', function( value ) {
        points = value;
        value.bind( function( newval ) {
            // this code is called when the value change
            console.log(\'position change\', newval);
        });
    } );

    $(\'.point\').draggable({ 
        drag: function(event, ui){
            // update the position value
            point.set(ui.position);
        }
    });

});
javascriptpoints.set() 呼叫does 更新位置值(我在控制台中获得了正确的信息),但是can\'t 更新位于主题自定义程序本身中的输入元素。

我看了一下api.Value Class(witch是我的points 变量)输入wp-includes/js/customize-base.js. 我需要的是得到api.Element, 并称其为update 方法但我不知道从哪里可以得到这个。

1 个回复
SO网友:Fabien Quatravaux

我终于设法解决了我的问题,但不是用最优雅的方式:投票。我仍然对更优雅的解决方案感兴趣!

我的主要问题是,点移动是在包含站点预览的iframe中完成的,而主题定制器表单输入是在主文档中完成的。所以我需要一种将变量从iframe传递到主文档的方法。

iframe内部:

// update point global var
$(\'.point\').draggable({ 
    drag: function(event, ui){
        // update the position value
        var ref = \'id\'+$(this).attr(\'data-id\');
        points[ref].top = ui.position.top;
        points[ref].left = ui.position.left;   
    }
});
在主题自定义程序中:

setInterval(function(){
    if(frames.length) {
        var from = $(\'#customize-points\').val();
        var to = JSON.stringify(frames[0].points);

        // use theme customizer API in order to enable the save button
        if(from != to) $(\'#customize-points\').val(to).change();
    }
}, 500);
我还添加了一个系统来计算相对于背景图像的点位置,但这不是这里的主题。

我知道主题定制器会生成以预览iframe为目标的事件,以使主题作者能够实时更新预览,但我找不到另一种方法:从预览到主题定制器生成事件。

您可以在此处在线查看结果:focus.tv5monde.com, 即使您无法访问后端。

结束

相关推荐

对自定义字段上的JSON-API结果进行排序

有没有现成的方法可以根据自定义字段中的值对JSON-API插件的结果进行排序?请求已分页,因此需要在服务器端对结果进行排序。我有一个http请求,内容如下:http://www.example.com/wordpress/?json=get_author_posts&author_slug=user&post_type=custom &include=title,custom_fields&custom_fields=date_value&count=10&