wake-up-neo.net

Wie kann man das Plugin Optionsfeld setzen?

Problem/Hintergrund

Derzeit erstelle ich ein Plug-in für einen Client, mit dem er vorgegebene Google Map-Polygone (die auf der Website angezeigt werden) im Dashboard markieren und ändern kann.

Ich möchte, dass der Benutzer ein Polygon als wichtig markiert, eine benutzerdefinierte Farbe, Deckkraft und einen benutzerdefinierten Text für das Infofenster festlegt - was alles bisher möglich war. Das Problem ist, dass diese Feldmengen für alle 180-ish-Polygone vorhanden sein müssen. Mit der WP -Einstellungs-API kann ich die Felder erstellen und speichern, aber es wäre lächerlich, mehr als 500 Rückrufe zu erstellen, um jedes bestimmte Feld abzudecken. Daher habe ich in den letzten Tagen versucht, eine bestimmte Anzahl von Durchläufen durch das Feld vorzunehmen und eine variable Anzahl anzufügen.

Aktueller Code

Hier ist die aktuelle Optionsfeldregistrierung für einen Satz von Polygonen (wie in einer Klasse gespeichert):

<?php
public function page_init() {
    //[. . . ]
    add_settings_section(
        'rangers_txs',
        'Texas Senate District Options',
        array($this, 'print_txs_info'),
        'rangers_txs_option'
    );
    register_setting(
        'rangers_txs',
        'rangers_txs_option',
        array($this, 'ranger_txs_sanitize')
    );

    $i=1;
    while($i <= 31) {
        add_settings_field(
            'rangers_txs_checkbox_'.$i, //id
            'Is District '.$i.' important?', //Title
            array( $this, 'rangers_txs_check_callback_'.$i), //callback
            'rangers_txs_option', //page
            'rangers_txs', //section
            array('field' => 'txs_checkbox')
        );
        add_settings_field(
            'rangers_txs_colorpicker_'.$i, //id
            'District Color', //Title
            array( $this, 'rangers_txs_color_callback_'.$i ), //callback
            'rangers_txs_option', //page
            'rangers_txs', //section
            array('field' => 'txs_colorpicker')
        );
        add_settings_field(
            'rangers_txs_opacity_'.$i, //id
            'How important is it?', //Title
            array( $this, 'rangers_txs_opacity_callback_'.$i ), //callback
            //array($this, 'rangers_txs_input_array'),
            //'rangers_txs_opacity_callback_'.$i, //callback
            'rangers_txs_option', //page
            'rangers_txs', //section
            array('field' => 'txs_opacity')
        );
        add_settings_field(
            'rangers_txs_info_'.$i, //id
            'District Information', //Title
            array( $this, 'rangers_txs_info_callback_'.$i ), //callback
            'rangers_txs_option', //page
            'rangers_txs', //section
            array('field' => 'txs_info')
        );

        $i++;
    }

}
?>

Und hier ist eine Reihe von Rückrufen, die ich getestet habe und richtig arbeite:

<?php
public function colorpicker_init() {
    echo '<script type="text/javascript">
            jQuery(document).ready(function($) {
              $(".tr-color-picker").wpColorPicker();
            });
          </script>';
}
public function rangers_txs_check_callback_1() {
    printf(
        '<input type="checkbox" id="rangers_txs_checkbox_1" name="rangers_txs_option[rangers_txs_checkbox_1]" %1$s />
        <label for="rangers_txs_option[rangers_txs_checkbox_1]">Yep, it\'s important.', 
        checked( isset($this->txsoptions['rangers_txs_checkbox_1']), true, false)
    );
}
public function rangers_txs_color_callback_1() {
    $this->colorpicker_init();

    $color = $this->txsoptions['rangers_txs_colorpicker_1'] != '' ? sanitize_text_field($this->txsoptions['rangers_txs_colorpicker_1']) : '#0A64A4';
    printf(
        '<input type="text" name="rangers_txs_option[%1$s]" id="%1$s" class="tr-color-picker" data-default-color="#0A64A4" value="'.$color.'" />',
        'rangers_txs_colorpicker_1'
    );
}
public function rangers_txs_opacity_callback_1() {
    print '<p><em>On a scale of 1-10 (determines opacity of district, default: 5).</em></p>';
    printf(
        '<input type="text" id="rangers_txs_opacity_1" name="rangers_txs_option[rangers_txs_opacity_1]" value="%s" />', 
        isset( $this->txsoptions['rangers_txs_opacity_1'] ) ? esc_attr( $this->txsoptions['rangers_txs_opacity_1']) : '' 
    );
}
public function rangers_txs_info_callback_1() {
    isset($this->txsoptions['rangers_txs_info_1']) ? $content = $this->txsoptions['rangers_txs_info_1'] : $content = '';

    echo '<textarea id="rangers_txs_info_1" name="rangers_txs_option[rangers_txs_info_1]" rows="6" cols="50">'.$content.'</textarea>';
}
?>

Frage

Wie Sie sehen, habe ich ein Kontrollkästchen, einen Farbwähler, eine Deckkrafteingabe und einen Textbereich. Ich möchte, dass der gesamte Satz für jedes Polygon geloopt wird. Ich habe versucht, die Felder in einem Rückruf auszuführen, aber es wurden einfach alle Optionen zusammengefasst (d. H. 31 Kontrollkästchen, dann 31 Farbwähler usw.). Ich habe auch versucht, die Rückrufe außerhalb der Klasse zu setzen und eine while um den Funktionssatz zu schleifen, aber die Verwendung der $i -Variable im Funktionsnamen hat Fehler zurückgegeben, ebenso wie das Anhängen vor dem Aufruf und beim Aufrufen der Funktionen.

Ich würde mich sehr über Vorschläge freuen, die mir helfen könnten, das Ergebnis von Schleifensätzen zu erzielen.

4
penguin429

Ich habe es nach ein wenig Arbeit herausgefunden.

Zu Beginn habe ich einen einzelnen Rückruf verwendet: array($this, 'txs_loop_callbacks') mit derselben add_settings_field-Registrierung wie oben. Dann habe ich das letzte Argument in der Feldregistrierung geändert und jedes für dieses bestimmte Feld eindeutig gemacht: array('field' => 'txs_opacity_'.$i).

Dann habe ich in der Rückruffunktion den HTML-Code jedes Felds in einer anonymen Funktion gespeichert, die als Variable definiert ist. Wie so:

$txs_checkbox = function($num) {
    $is_checked = checked( isset($this->txsoptions['rangers_txs_checkbox_'.$num]), true, false);
    printf(
       '<input type="checkbox" class="is-important-'.$num.'" id="rangers_txs_checkbox_'.$i.'" name="rangers_txs_option[rangers_txs_checkbox_'.$num.']" %1$s />
        <label for="rangers_txs_option[rangers_txs_checkbox_'.$num.']">District '.$num.' is important</label><br /><br />', 
        $is_checked
    );
};

Ich habe diesen Variablentyp für jeden Feldtyp definiert (d. H. $txs_checkbox, $txs_colorpicker und an).

Danach habe ich die anonymen Funktionen in einer Schleife mit einem Häkchen aufgerufen, um nur eine Art von Feld pro Gruppe anzuzeigen.

$n=1;
while($n <= 31) {
    switch($args['field']):
        case('txs_checkbox_'.$n):
            $txs_checkbox($n);
            break;

        case('txs_colorpicker_'.$n):
            $txs_colorpicker($n);
            break;

        case('txs_opacity_'.$n):
            $txs_opacity($n);
            break;

        case('txs_info_'.$n):
            $txs_info($n);
            break;
    endswitch;

    $n++;
}

Mit all diesen Elementen konnte ich das Ergebnis der Wiederholung von Feldsätzen erzielen.

1
penguin429