問題描述
說我有一個自定義控制元件,但是這個控制元件有 2 個需要儲存的輸入,例如:
-
貨幣型別和價值
-
尺寸和測量單位
-
名字和姓氏
-
文字和風格
-
影像和影像大小
-
字型系列字型重量
我該怎麼辦?在建立控制元件時,我看到有一個設定選項,但是沒有檔案來提示它是如何使用的,而在野外完成的唯一例子就是 Easy Google Fonts,它沒有說明如何完成,很難讀是否可以巢狀控制元件和部分?
到目前為止,我發現的所有教程和檔案都討論了一個帶有單個 html 輸入的控制元件,沒有提及具有多個輸入/設定的控制元件,儘管它被 API 建議
最佳解決方案
這個外掛演示瞭如何做到這一點。值得注意的是,所涉及的步驟是:
-
註冊每個設定進行更新/更改
-
建立控制元件時,將陣列作為設定引數傳遞
-
渲染輸入時,將設定鍵傳入連結和值
-
設定鍵不是設定的名稱,而是陣列的索引,例如。 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 );
}
}
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。