Callback wird in add_settings_field () nicht aufgerufen, wenn es als Teil eines Arrays übergeben wird, erkennt jedoch, dass es vorhanden ist. Es wird von Klasse zu Klasse mit OOP übergeben
Ich erstelle ein Plugin, habe eine neue Administrationsseite und Unterseite erstellt und möchte innerhalb dieser Unterseite einige Einstellungen hinzufügen. Deshalb erstelle ich sie mit der Einstellungs-API.
Ich benutze Composer und objektorientierte Programmierung. Ich habe einen Ordner SettingsAPI, mit dem folgende Namespace namens namespace Blocks\Pages\SettingsAPI;
In diesem Ordner, ich habe drei Dateien: AddSettings.php
, Settings.php
und SettingsLayout.php
. Alle drei sind richtig angeschlossen. Die Dateien haben die Groß- und Kleinschreibung der Klassen. Settings.php
hat eine Klasse mit dem Namen Settings
und so weiter.

Inhalt
- Ein Kontext zu meiner Struktur
- Was ich schon versucht habe
- Was ist zu tun?
Ein Kontext zu meiner Struktur
Im Inneren habe Settings.php
ich eine Funktion, die eine Vielzahl von Arrays enthält. In diesen Arrays befinden sich die Werte, die ich für die Einstellungs-API verwenden möchte. Dies bedeutet , dass ich Arrays , die für verwendet werden register_setting()
, add_settings_section()
und add_settings_field()
.
Im Inneren habe AddSettings.php
ich die drei gerade erwähnten Funktionen. Beides register_settings()
und add_settings_field()
arbeiten super. Ich habe Probleme mit add_settings_field()
.
Im Inneren habe SettingsLayout.php
ich ein sehr einfaches Layout, wo das Formular gedruckt werden soll, das auch auf der Unterseite angezeigt wird. Nur die Eingaben fehlen.
Im Inneren habe AddSettings.php
ich eine foreach()
Schleife über das Array verwendet, wenn ich muss. Was für beide verwendet wird register_setting()
und das liegt daran add_settings_field()
, dass beide Arrays Arrays enthalten. Ich werde einen Code zeigen, der für register_setting()
und verwendet wird foreach()
.
Settings.php
$configs = [ [ // Icon "option_group" => "iw_" . $n,
"option_name" => "iw_icon_" . $n, "args" => $iconConfigs
],
[ // Titel
"option_group" => "iw_" . $n, "option_name" => "iw_title_" . $n,
"args" => $titleConfigs ], [ // Beschreibung "option_group" => "iw_" . $n,
"option_name" => "iw_description_" . $n, "args" => $descriptionConfigs
],
[ // Farbauswahl
"option_group" => "iw_" . $n, "option_name" => "iw_colour_" . $n,
"args" => $colourConfigs
]
];
Das obige Array wird zusammen mit den anderen Arrays an die AddSettings
Klasse und die nächste Funktion übergeben, die sie verarbeitet.
$this->add_settings->setForm( $configs, $segments, $inputs )->register();
setForm()
macht folgendes mit den Argumenten.
AddSettings.php
public function setForm( array $configs, array $segments, array $inputs ) {
$this->settings = $configs;
$this->sections = $segments;
$this->fields = $inputs;
return $this;
}
Die Variablen $settings
, $sections
und $fields
wurden zu Beginn der Klasse als öffentliche und leere Arrays erstellt.
public $settings = array(); public $sections = array();
public $fields = array();
Was dann mit folgender Funktion registriert wird:
public function functionToAdd() {
return $this->registerForm( $this->settings, $this->sections, $this->fields );
}
registerForm()
Halten Sie alle Einstellungen API-Funktionen von WP, hier ist register_setting()
.
foreach( $this->settings as $setting ) { register_setting( $setting["option_group"], $setting["option_name"], isset( $setting["args"] ) ? $setting["args"] : "" );
}
Dieser Teil funktioniert super. Es funktioniert auch mit add_settings_section()
. Was nicht funktioniert, sind die Eingaben. Was ich jetzt auch vorstellen werde:
Settings.php
In dieser Klasse befindet sich die Funktion / Methode setForm( $n = NULL )
. Dort befinden sich alle Arrays, wie das oben gezeigte. Im Moment $n
hat das keine Bedeutung, aber es wird eine Zahl sein, sodass ich diese Arrays und Einstellungen durchlaufen kann, um weitere Formulare zu erstellen. Ob ich es behalte NULL
oder ändere 1
, hat keinen Einfluss auf das Endergebnis, dasselbe.
Hier ist das Array für die Felder.
$inputs = [
[
"id" => "iw_icon_" . $n, "title" => "Icon Auswahl", "callback" => function() use($n) { return $this->iconInput( $n ); },
"page" => "info_kreis_bearbeiten",
"section" => "iw_item_" . $n, "args" => [ "label_for" => "iw_icon_" . $n ]
],
[
"id" => "iw_title_" . $n, "title" => "Titel", "callback" => function() use($n) { return $this->titleInput( $n ); },
"page" => "info_kreis_bearbeiten",
"section" => "iw_item_" . $n, "args" => [ "label_for" => "iw_title_" . $n ]
],
[
"id" => "iw_description_" . $n, "title" => "Kurz Beschreibung", "callback" => function() use($n) { return $this->descriptionInput( $n ); },
"page" => "info_kreis_bearbeiten",
"section" => "iw_item_" . $n, "args" => [ "label_for" => "iw_description_" . $n
],
[
"id" => "iw_colour_" . $n, "title" => "Farbe auswählen", "callback" => function() use($n) { return $this->colourInput( $n ); },
"page" => "info_kreis_bearbeiten",
"section" => "iw_item_" . $n, "args" => [ "label_for" => "iw_colour_" . $n ]
]
];
Dies ist also ein Array mit drei Arrays. Dieses Array hat Rückrufe, und es sind die Rückrufe, die überhaupt nicht funktionieren. Egal wo ich sie ablege oder wie ich sie schreibe, sie werden nicht wiederholt. Unten werde ich alle Dinge auflisten, die ich versucht habe.
Wie bei den Einstellungsarrays werden sie auch so verarbeitet:
$this->add_settings->setForm( $configs, $segments, $inputs )->register();
AddSettings.php
Und dann
public function setForm( array $configs, array $segments, array $inputs ) { $this->settings = $configs; $this->sections = $segments; $this->fields = $inputs; return $this;
}
und
public function functionToAdd() {
return $this->registerForm( $this->settings, $this->sections, $this->fields );
}
Was dann registerForm()
mit folgender Funktion übergeben wird:
foreach( $this->fields as $field) {
add_settings_field( $field["id"], $field["title"], isset( $field["callback"] ) ? $field["callback"] : "", $field["page"], $field["section"] = 'default', $field["args"] = array() );
}
Und dann nichts. Keine Eingaben auf meiner Unterseite. Alles außer den Feldern wird wiedergegeben.

Wie Sie sehen können, funktioniert der von diesem Abschnitt verwendete Rückruf und zeigt mir den Titel und die Beschreibung. Aber die Eingaben fehlen. Um einen Kontext zu zeigen, wie ich den Rückruf für die Abschnitte aufgerufen habe, ist hier die eine Zeile mit dem Rückruf aus dem Abschnittsarray im Inneren
Settings.php
:
"callback" => function() use($n) { echo "<p>Bearbeite hier die Info Nummer " . $n . "</p>"; }
Und die Funktion im add_settings_section()
Inneren AddSettings.php
, nein, foreach()
wurde für diese verwendet:
add_settings_section( $sections["id"], $sections["title"], isset( $sections["callback"] ) ? $sections["callback"] : "", $sections["page"] );
Es wird genauso genannt wie die Felder. Aber die Felder geben immer noch nichts wieder. Bevor jemand sagt, dass ich innerhalb der anonymen Rückruffunktion wiederhole, anstatt eine andere Funktion zurückzugeben:
Was ich schon versucht habe
Ich habe ein paar Dinge ausprobiert. Eines der ersten Dinge, die ich versuchte, war die Bearbeitung der Art und Weise, wie der Rückruf geschrieben wird. Anstelle einer Funktion, die eine andere Funktion zurückgibt, habe ich etwas Einfaches geschrieben.
"callback" => function() { echo "Echo this please."; },
Hat nicht funktioniert.
"callback" => array( $this, "iconInput" ),
Auch nicht funktioniert habe ich auch versucht
"callback" => $this->iconInput( $n ),
Was dann die Funktion aufrief und die Eingänge wiedergab, aber nicht in der richtigen Position. Sie waren ganz oben auf der Seite. Und wenn ich alles schleife, werden alle Eingaben oben angezeigt, wobei die folgenden Abschnitte in der richtigen Druckreihenfolge angezeigt werden. Das ist also auch nicht die Lösung.
Ich habe auch versucht, den Rückruf zu verschieben AddSettings.php
und so zu nennen.
add_settings_field( $field["id"], $field["title"], function() { return $this->iconInput(); }, $field["page"], $field["section"] = 'default', $field["args"] = array() );
Hat auch nicht funktioniert. Als ich versuchte, die Funktion einfach so direkt hinein zu schreiben
add_settings_field( $field["id"], $field["title"], function() { echo "Please echo this"; }, $field["page"], $field["section"] = 'default', $field["args"] = array() );
Hat auch nicht funktioniert. Ich habe auch immer die;
am Ende gesetzt, nur um zu sehen, ob es überhaupt aufgerufen wird, und es war nicht so. Es ist, als ob die Funktion nicht existiert.
Ich habe auch versucht, die Funktion sofort auszuführen, indem ich ()
sie hinzufügte :
add_settings_field( $field["id"], $field["title"], isset( $field["callback"] ) ? $field["callback"]() : "", $field["page"], $field["section"] = 'default', $field["args"] = array() );
Gleiches Ergebnis wie früher. Es gab die Eingaben wieder, aber nicht in der richtigen Position.
Ich habe versucht, nach einer Antwort zu suchen, konnte aber keine finden, die meiner ähnlich war. Ich habe diese Fragen und Lösungen gefunden, ausprobiert, und das hat auch nicht funktioniert: Wie übergebe ich Argumente von add_settings_field () an die Rückruffunktion? und Add_settings_field () Rückruf parametrieren?
Und zur Verdeutlichung ist meine SettingsLayout.php
so aufgebaut:
<form method="post" action="options.php" id="iw_form_<?php echo $i?>">
<?php
settings_fields( "iw_" . $i ); do_settings_sections( "info_kreis_bearbeiten" ); submit_button( $text = NULL, $type = "primary", $name = "submit_" . $i );
?>
</form>
$i
ist das gleiche wie $n
.
Was ist zu tun?
Ich habe keine Optionen mehr, um es zu versuchen. Zumindest von Optionen, die ich kenne. Wenn jemand irgendeine Lösung hat, wäre ich GLÜCKLICH, sie zu hören. Ich erklärte mich auch so gut ich konnte.
Bearbeiten
Was ich vergessen habe zu erwähnen, in meinem habe foreach()
ich auch wiederholt, um field["id"]
zu sehen, ob das funktioniert, und es gibt die richtige ID wieder.
Antworten
Soweit ich sehen konnte, liegt das Problem nicht beim Feldrückruf, sondern bei der Abschnitts-ID, auf die Sie sie einstellen default
- siehe $field["section"] = 'default'
unten:
// In the foreach in AddSettings.php
add_settings_field( $field["id"], $field["title"], isset( $field["callback"] ) ? $field["callback"] : "", $field["page"], $field["section"] = 'default', $field["args"] = array() );
Sie müssen dies also nur korrigieren (Tippfehler?) Und die Felder werden wie erwartet angezeigt oder der Feldrückruf wird ordnungsgemäß ausgeführt. Und Sie sollten auch die korrigieren $field["args"] = array()
..