定制器-通过Java脚本实例化设置和控件

时间:2017-09-20 作者:rugbert

我正在尝试根据下拉列表的值动态加载大量控件,我不想通过PHP加载它们,因为初始页面加载需要15秒以上的时间。我有很多控制。

那么,通过JS实例化设置和(自定义)控件的具体要求是什么呢?

我的自定义控件类是否需要注册并充实content\\u template方法?我的班级需要“类型”设置对吗?(这两件事我都做过)

我可以在PHP中注册设置(这就是我所做的),然后稍后通过JS实例化控件吗?或者我还需要在JS中实例化设置吗?

JS呢?我是否需要在JS实例化中重复我的标记代码?

到目前为止,这就是我所知道的,但实际上什么都没有出现。。很明显,我遗漏了一些基本的东西,但我不确定是什么:

  var api = wp.customize;

  var sectionID = \'site_variables_section\'; // section.id.replace( \'[\', \'-\' ).replace( \']\', \'\' )
  api.controlConstructor.ColorVariable = api.Control.extend({
    ready: function() {
        var control = this;
        wp.customize.Control.prototype.ready.call( control );
    }
  });

  // The control
  var controlID = \'site_variables_section[\' + field.name.replace(\'$\', \'\') + \']\';

  var controlParams = {
      section: sectionID,
      label: \'label\',
      settings: {
        \'default\': controlID
      },
      active: true,
      type: \'ColorVariable\',
    };

  var control = new api.controlConstructor.ColorVariable( controlID, controlParams );
  control.active.validate = function() {
    return true;
  };
  api.control.add( control.id, control );
@weston ruter让我走上了正确的道路,但我仍然对一些事情感到困惑:

1-没有数据自定义设置链接时,如何将值传递到字段/保存?这是由JS处理的吗content_template

2-我看到,当一个控件使用一个设置时,会使用settings参数中的“default”键,但当多个设置时会怎么样,我们如何获取每个设置的值:default

对于2,我能够让它与以下各项协同工作: settings:{ variable : controlId+\'[variable]\', control: controlId+\'[control]\', value: controlId+\'[value]\', percentage: controlId+\'[percentage]\' } 我在想类似的事情to_json() 功能:

$this->json[\'percentage_value\'] = $this->value(\'my-settings-id);

1 个回复
最合适的回答,由SO网友:Weston Ruter 整理而成

如果在服务器上注册设置,则无需在JS中的客户端上注册,因为这将为您完成。以下是创建设置后创建控件的一些示例:

在自定义帖子CSS的第一个示例中,这实际上使用了WordPress 4.9中全新的代码编辑器控件。你可以参考这个pull request 看看需要什么。尤其要确保你打电话$wp_customize->register_control_type( \'My_Custom_Control\' ) 以确保实际输出内容模板。

当您在客户端上动态创建设置时,应该先在JS中实例化它们,然后再实例化它们的相关控件。

以下是创建设置的一些示例:

动态创建设置和控件时,另一个要实现的关键是在服务器上进行“动态设置”。如果您没有在服务器上创建设置,则无法识别该设置。这就是customize_dynamic_setting_argscustomize_dynamic_setting_class 过滤器用于。一些示例:

  • Core Customize Nav Menus
  • Core Customize Widgets
  • Customize Posts
  • Customize Featured Content Demo

    1-没有数据时,如何将值传递到字段/保存data-customize-setting-link? 这是由JS处理的吗content_template?

    然后您必须创建Element 之间的链接Setting 以及input 您自己手动操作,如下所示:

    element = new wp.customize.Element( input );
    element.sync( setting );
    element.set( setting() );
    
    你可以看到from core 那个data-customize-setting-link 只是为您自动完成此操作的快捷方式。

    2-我看到,当一个控件使用一个设置时,会使用settings参数中的“default”键,但当多个设置时会怎么样,我们如何获取每个设置的值:default

    是的,您定义了其他非-default 钥匙。WordPress 4.9中对这一切的工作方式进行了一些关键改进,这将使使用JS实例化控件更加容易。除了data-customize-setting-link 属性现在支持data-customize-setting-key-link 属性,该属性允许您使用模板中的实际键,而不是设置IDsettings 您可以引用设置ID,或Setting 对象,甚至只是任意的Value 实例。

    例如,考虑通过以下方式添加的模板:

    add_action( \'customize_controls_print_footer_scripts\', function() {
        ?>
        <script id="tmpl-site-identity-control-content" type="text/html">
            <# var elementIdPrefix = _.uniqueId( \'site-identity-\' ); #>
            <details>
                <summary class="customize-control-title">{{ data.label }}</summary>
                <ul>
                    <li>
                        <label for="{{ elementIdPrefix }}_title">Title:</label>
                        <input id="{{ elementIdPrefix }}_title" type="text" data-customize-setting-key-link="title">
                    </li>
                    <li>
                        <label for="{{ elementIdPrefix }}_tagline">Tagline:</label>
                        <input id="{{ elementIdPrefix }}_tagline" type="text" data-customize-setting-key-link="tagline">
                    </li>
                    <li>
                        <label for="{{ elementIdPrefix }}_founded">Year founded:</label>
                        <input for="{{ elementIdPrefix }}_founded" type="number" min="1" max="9999" data-customize-setting-key-link="founded">
                    </li>
                </ul>
            </details>
        </script>
        <?php
    } );
    
    您可以添加使用此模板的控件,只需将其ID传递为templateId 以及所需的settings:

    var foundedValue = new api.Value( 2017 );
    var control = new api.Control( \'site_identity\', {
        templateId: \'site-identity-control-content\',
        label: \'Site Identity\',
        priority: 5,
        section: sectionId,
        settings: {
            title: \'blogname\', // Setting ID which may not be registered yet.
            tagline: api( \'blogdescription\' ), // Existing registered Setting object.
            founded: foundedValue // Non-setting Value.
        }
    } );
    api.control.add( control );
    foundedValue.bind( function( newYear ) {
        console.info( \'The year is now\', newYear );
    } );
    
    然后看起来是这样的:

    site identity control

    成立年份为Value 仅用于演示目的。这是一个Value 而且不是注册的Setting 意味着它不会保存在数据库中。但这样的值对于给定主题中的元控件可能很有用,比如从预设的配色方案中进行选择。这也是在WordPress 4.9中填充变更集状态和日期的方式。

    请注意make.wordpress.org/core 开发人员注意到WordPress 4.9中JS API的所有具体改进。

结束