Callback nie jest wywoływany w add_settings_field (), gdy jest przekazywany jako część tablicy, ale rozpoznaje, że istnieje. Przekazano klasę do klasy przy użyciu OOP
Buduję wtyczkę, stworzyłem nową stronę administratora i podstronę, a wewnątrz tej podstrony chcę dodać ustawienia. Dlatego tworzę je za pomocą interfejsu API ustawień.
Używam Composera i programowania obiektowego. Mam folder o nazwie SettingsAPI, z następującym nazw namespace Blocks\Pages\SettingsAPI;
wewnątrz tego folderu, mam trzy pliki: AddSettings.php
, Settings.php
i SettingsLayout.php
. Wszystkie trzy są prawidłowo podłączone. Pliki mają nazwy klas uwzględniające wielkość liter. Settings.php
ma klasę o nazwie Settings
i tak dalej.

Zawartość
- Pewien kontekst mojej struktury
- Czego już próbowałem
- Co robić?
Pewien kontekst mojej struktury
Wewnątrz Settings.php
mam funkcję, która przechowuje różne tablice, wewnątrz tych tablic znajdują się wartości, których chcę użyć dla interfejsu API ustawień. To znaczy, że są tablice, które są wykorzystywane do register_setting()
, add_settings_section()
i add_settings_field()
.
Wewnątrz AddSettings.php
mam trzy wspomniane funkcje. Oba register_settings()
i add_settings_field()
działają świetnie. Mam problemy z add_settings_field()
.
Wewnątrz SettingsLayout.php
mam bardzo prosty układ, na który należy wydrukować formularz, który również jest pokazany na podstronie. Brakuje tylko danych wejściowych.
Wewnątrz AddSettings.php
użyłem foreach()
pętli po tablicy, jeśli trzeba. Który jest używany w obu przypadkach register_setting()
i add_settings_field()
, ponieważ obie te tablice mają w sobie tablice. Pokażę kod używany do register_setting()
i 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
]
];
Powyższa tablica jest przekazywana wraz z innymi tablicami do AddSettings
klasy i następnej funkcji, która je przetworzy.
$this->add_settings->setForm( $configs, $segments, $inputs )->register();
setForm()
wykonuje następujące czynności z argumentami.
AddSettings.php
public function setForm( array $configs, array $segments, array $inputs ) {
$this->settings = $configs;
$this->sections = $segments;
$this->fields = $inputs;
return $this;
}
Zmienne $settings
, $sections
i $fields
zostały stworzone na początku klasy jako tablic publicznych i pustych.
public $settings = array(); public $sections = array();
public $fields = array();
Który następnie zostaje zarejestrowany za pomocą następującej funkcji:
public function functionToAdd() {
return $this->registerForm( $this->settings, $this->sections, $this->fields );
}
registerForm()
posiadają wszystkie funkcje API ustawień z WP, tutaj register_setting()
.
foreach( $this->settings as $setting ) { register_setting( $setting["option_group"], $setting["option_name"], isset( $setting["args"] ) ? $setting["args"] : "" );
}
Ta część działa świetnie. Działa również z plikami add_settings_section()
. Co nie działa, to dane wejściowe. Które teraz również przedstawię:
Settings.php
Wewnątrz tej klasy znajduje się funkcja / metoda setForm( $n = NULL )
, w której znajdują się wszystkie tablice, takie jak ta, którą pokazałem powyżej. W tej chwili $n
nie ma znaczenia, ale będzie to liczba, więc mogę zapętlić wszystkie te tablice i ustawienia, aby utworzyć więcej formularzy. Niezależnie od tego, czy go zatrzymam, NULL
czy zmienię na 1
, nie ma to wpływu na wynik końcowy, to samo.
Oto tablica pól.
$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 ]
]
];
To jest tablica z trzema tablicami w środku. Ta tablica ma wywołania zwrotne, które w ogóle nie działają. Bez względu na to, gdzie je umieściłem lub jak je piszę, nie są one odtwarzane echem. Na dole wymienię wszystkie rzeczy, których próbowałem.
Podobnie jak w przypadku tablic ustawień, wszystkie są przetwarzane w następujący sposób:
$this->add_settings->setForm( $configs, $segments, $inputs )->register();
AddSettings.php
I wtedy
public function setForm( array $configs, array $segments, array $inputs ) { $this->settings = $configs; $this->sections = $segments; $this->fields = $inputs; return $this;
}
i
public function functionToAdd() {
return $this->registerForm( $this->settings, $this->sections, $this->fields );
}
Który następnie jest przekazywany registerForm()
za pomocą następującej funkcji:
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() );
}
A potem nic. Brak danych wejściowych na mojej podstronie. Wszystko oprócz pól jest odbijane echem.

Jak widać, wywołanie zwrotne używane przez sekcję działa i pokazuje mi tytuł i opis. Ale brakuje danych wejściowych. Aby pokazać kontekst, w jaki sposób wywołałem wywołanie zwrotne dla sekcji, oto jedna linia z wywołaniem zwrotnym z tablicy sekcji, wewnątrz
Settings.php
:
"callback" => function() use($n) { echo "<p>Bearbeite hier die Info Nummer " . $n . "</p>"; }
A funkcja add_settings_section()
wewnątrz AddSettings.php
, nie foreach()
został wykorzystany do tego:
add_settings_section( $sections["id"], $sections["title"], isset( $sections["callback"] ) ? $sections["callback"] : "", $sections["page"] );
Nazywa się to tak samo jak pola. Ale pola nadal nic nie odbijają. Zanim ktokolwiek powie, że odbijam echo wewnątrz anonimowej funkcji zwrotnej zamiast zwracać inną funkcję:
Czego już próbowałem
Próbowałem kilku rzeczy. Jedną z pierwszych rzeczy, które próbowałem, była zmiana sposobu pisania wywołania zwrotnego. Więc zamiast funkcji, która zwraca inną funkcję, napisałem coś prostego.
"callback" => function() { echo "Echo this please."; },
Nie udało się.
"callback" => array( $this, "iconInput" ),
Też nie działałem też próbowałem
"callback" => $this->iconInput( $n ),
Który następnie wywołał funkcję i wywołał echo danych wejściowych, ale nie we właściwej pozycji. Byli na samej górze strony. A jeśli zapętlę wszystko, wszystkie dane wejściowe będą na górze, a sekcje poniżej będą we właściwej kolejności drukowania. Więc to też nie jest rozwiązanie.
Próbowałem też przenieść wywołanie zwrotne AddSettings.php
i nazwać to w ten sposób.
add_settings_field( $field["id"], $field["title"], function() { return $this->iconInput(); }, $field["page"], $field["section"] = 'default', $field["args"] = array() );
Nie działało też. Kiedy próbowałem po prostu bezpośrednio napisać tam funkcję, tak
add_settings_field( $field["id"], $field["title"], function() { echo "Please echo this"; }, $field["page"], $field["section"] = 'default', $field["args"] = array() );
Nie działało też. Ja też zawsze kończę die;
, żeby zobaczyć, czy w ogóle jest wywoływany, a tak się nie stało. To tak, jakby funkcja nie istniała.
Próbowałem też od razu uruchomić funkcję, dodając ()
do niej:
add_settings_field( $field["id"], $field["title"], isset( $field["callback"] ) ? $field["callback"]() : "", $field["page"], $field["section"] = 'default', $field["args"] = array() );
Taki sam wynik jak wcześniej. Powtórzył dane wejściowe, ale nie we właściwej pozycji.
Szukałem odpowiedzi, ale nie mogłem znaleźć takiej, która byłaby podobna do mojej. Znalazłem te pytania i rozwiązanie, wypróbowałem je, ale to również nie zadziałało: Jak przekazać argumenty z add_settings_field () do funkcji zwrotnej? i Add_settings_field () parametryzowanie wywołania zwrotnego?
Dla wyjaśnienia, moja SettingsLayout.php
kompilacja jest następująca:
<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
jest taki sam jak $n
.
Co robić?
Skończyły mi się opcje do wypróbowania. Przynajmniej opcji, o których wiem. Jeśli ktoś ma jakieś rozwiązanie, byłbym SZCZĘŚLIWY go usłyszeć. Wyjaśniłem się też najlepiej, jak umiałem.
Edytować
O czym zapomniałem wspomnieć, w moim foreach()
też powtórzyłem, field["id"]
aby sprawdzić, czy to działa, i to odzwierciedla właściwy identyfikator.
Odpowiedzi
Z tego, co widziałem, problem nie dotyczy wywołania zwrotnego pola, ale jest to identyfikator sekcji , na który go ustawiasz default
- patrz $field["section"] = 'default'
poniżej:
// 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() );
Więc wystarczy to poprawić (literówka?), A pola będą się wyświetlać zgodnie z oczekiwaniami lub że wywołanie zwrotne pola będzie działać poprawnie. Powinieneś także poprawić $field["args"] = array()
...