定制器控件中的多个输入

时间:2014-01-20 作者:Tom J Nowell

假设我有一个自定义控件,但此控件有2个需要保存的输入,例如:

货币类型和价值大小和计量单位名和姓文字和样式图像和图像大小字体系列;字体大小我该怎么做?我看到在创建控件时有一个设置选项,但没有文档来说明它是如何使用的,唯一一个在野外使用的例子是Easy Google Fonts,它没有解释它是如何使用的,而且很难阅读。是否可以嵌套控件和节?

到目前为止,我找到的所有教程和文档都讨论了使用单个html输入的控件,没有一个提到具有多个输入/设置的控件,尽管API建议使用该控件

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

这个插件演示了如何做到这一点。值得注意的是,涉及的步骤包括:

创建控件时,注册要更新/更改的每个设置,在呈现输入时,将数组作为设置参数传递,将设置键传递给链接和值,设置键不是设置的名称,而是数组的索引,例如0、1、2通过访问注册到控件的设置$this->settings以下是代码:

<?php
/*
Plugin Name: TJN Typography Control Demo
Author: Tom J Nowell
Version: 1.0
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
*/

add_action( \'customize_register\', \'tjn_customize_register\' );
function tjn_customize_register( $wp_customize ) {
    if ( ! isset( $wp_customize ) ) {
        return;
    }
    if ( class_exists( \'WP_Customize_Control\' ) ) {

        class Toms_Control_Builder extends WP_Customize_Control {

            public $html = array();

            public function build_field_html( $key, $setting ) {
                $value = \'\';
                if ( isset( $this->settings[ $key ] ) )
                    $value = $this->settings[ $key ]->value();
                $this->html[] = \'<div><input type="text" value="\'.$value.\'" \'.$this->get_link( $key ).\' /></div>\';
            }

            public function render_content() {
                $output =  \'<label>\' . $this->label .\'</label>\';
                echo $output;
                foreach( $this->settings as $key => $value ) {
                    $this->build_field_html( $key, $value );
                }
                echo implode( \'\', $this->html );
            }

        }

        $section = new TJN_Customizer_Section( $wp_customize, \'test\', \'Test\', 11 );
        $field = new TJN_Customizer_Field( \'testfield\',\'\',\'Test Control\' );
        $field->add_to_section( $wp_customize, $section );
    }
}


class TJN_Customizer_Section {
    public $name=\'\';
    public $pretty_name=\'\';
    public function __construct( WP_Customize_Manager $wp_customize, $name, $pretty_name, $priority=25 ) {
        $this->name = $name;
        $this->pretty_name = $pretty_name;

        $wp_customize->add_section( $this->getName(), array(
            \'title\'          => $pretty_name,
            \'priority\'       => $priority,
            \'transport\'      => \'refresh\'
        ) );
    }

    public function getName() {
        return $this->name;
    }
    public function getPrettyName() {
        return $this->pretty_name;
    }
}

class TJN_Customizer_Field {

    private $name;
    private $default;
    private $pretty_name;

    public function __construct( $name, $default, $pretty_name ) {
        $this->name = $name;
        $this->default = $default;
        $this->pretty_name = $pretty_name;
    }

    public function add_to_section( WP_Customize_Manager $wp_customize, TJN_Customizer_Section $section ) {

        $wp_customize->add_setting( $this->name, array(
            \'default\'        => $this->default,
            \'type\'           => \'theme_mod\',
            \'capability\'     => \'edit_theme_options\'
        ) );
        $wp_customize->add_setting( \'moomins\', array(
            \'default\'        => $this->default,
            \'type\'           => \'theme_mod\',
            \'capability\'     => \'edit_theme_options\'
        ) );
        $wp_customize->add_setting( \'papa\', array(
            \'default\'        => $this->default,
            \'type\'           => \'theme_mod\',
            \'capability\'     => \'edit_theme_options\'
        ) );

        $control = new Toms_Control_Builder(
            $wp_customize, $this->name, array(
            \'label\'    => $this->pretty_name,
            \'section\'  => $section->getName(),
            \'settings\'   => array (
                $this->name,
                \'moomins\',
                \'papa\'
            )
        ) );

        $wp_customize->add_control( $control );
    }
}

结束

相关推荐

Admin Theme customization

我遵循wordpress codex网站上关于通过插件创建管理主题的说明。我激活了插件,但我的样式表没有包含在<head>.. 这是我的代码:add_action( \'admin_init\', \'kd_plugin_admin_init\' ); add_action( \'admin_menu\', \'kd_plugin_admin_menu\' ); function kd_plugin_admin_init() { /* Register