Mehrere Eingaben in einem Customizer-Steuerelement

16

Angenommen, ich habe ein einzelnes benutzerdefiniertes Steuerelement, aber dieses Steuerelement verfügt über 2 Eingänge, die gespeichert werden müssen, z.

  • Währungstyp und -wert
  • Größe und Maßeinheit
  • Vor-und Nachname
  • Text und Stil
  • Bild und Bildgröße
  • Schriftfamilie & Schriftgewicht

Wie würde ich das machen? Ich sehe, dass es beim Erstellen eines Steuerelements eine Einstellungsoption gibt, aber es gibt keine Dokumentation, die angibt, wie es verwendet wird, und das einzige Beispiel dafür ist Easy Google Fonts, für das es keine Erklärung gibt ist schwer zu lesen. Ist es möglich, Steuerelemente und Abschnitte zu verschachteln?

Bisher haben alle Tutorials und Dokumentationen, die ich gefunden habe, über ein Steuerelement mit einer einzigen HTML-Eingabe gesprochen, und keine erwähnt Steuerelemente mit mehreren Eingaben / Einstellungen, obwohl dies von der API vorgeschlagen wird

Tom J Nowell
quelle
Wird das benutzerdefinierte Steuerelement mit der Anpassungs-API für WordPress- Designs verwendet : codex.wordpress.org/Theme_Customization_API oder der Einstellungs-API: codex.wordpress.org/Settings_API ?
Rachel Baker
Der Theme-Mod ist das, was meine Tests bisher verwendet haben, obwohl ich für beides keine Präferenz habe und eine Erklärung für den einen oder den anderen oder für beide akzeptieren werde
Tom J Nowell

Antworten:

17

Dieses Plugin zeigt, wie es geht. Zu beachten ist, dass folgende Schritte erforderlich sind:

  • Registrieren Sie jede Einstellung zum Aktualisieren / Ändern
  • Übergeben Sie beim Erstellen des Steuerelements ein Array als Einstellungsargument
  • Übergeben Sie beim Rendern der Eingaben den Einstellungsschlüssel für Verknüpfung und Wert
  • Der Einstellungsschlüssel ist nicht der Name der Einstellung, sondern die Indizes des Arrays, z. B. 0, 1, 2
  • Greifen Sie über auf die für ein Steuerelement registrierten Einstellungen zu $this->settings

Hier ist der Code:

<?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 );
    }
}
Tom J Nowell
quelle
2
Genau das, was ich brauchte, jetzt kann ich in Ruhe
einschlafen